pidns04.c revision ec6edca7aa42b6affd989ef91b5897f96795e40f
1/*
2* Copyright (c) International Business Machines Corp., 2007
3* This program is free software; you can redistribute it and/or modify
4* it under the terms of the GNU General Public License as published by
5* the Free Software Foundation; either version 2 of the License, or
6* (at your option) any later version.
7* This program is distributed in the hope that it will be useful,
8* but WITHOUT ANY WARRANTY; without even the implied warranty of
9* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
10* the GNU General Public License for more details.
11* You should have received a copy of the GNU General Public License
12* along with this program; if not, write to the Free Software
13* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
14*
15***************************************************************************
16
17* File: pidns04.c
18*
19* Description:
20*  The pidns04.c testcase builds into the ltp framework to verify
21*  the basic functionality of PID Namespace.
22*
23* Verify that:
24* 1. When parent clone a process with flag CLONE_NEWPID, the process ID of
25* child should be one.
26*
27* 2. When parent clone a process with flag CLONE_NEWPID, the parent process ID
28* of should be zero.
29*
30* 3. The container init process (one), should not get killed by the SIGKILL in
31* the childNS
32*
33* Total Tests:
34*
35* Test Name: pidns04
36*
37* Test Assertion & Strategy:
38*
39* From main() clone a new child process with passing the clone_flag as
40* CLONE_NEWPID.
41* The container init, should not get killed by the SIGKILL inside the child NS.
42* Usage: <for command-line>
43* pidns04
44*
45* History:
46*
47* FLAG DATE     	NAME	   			DESCRIPTION
48* 08/10/08      Veerendra C <vechandr@in.ibm.com> Verifies killing of cont init.
49*
50*******************************************************************************/
51#define _GNU_SOURCE 1
52#include <sys/wait.h>
53#include <assert.h>
54#include <stdio.h>
55#include <stdlib.h>
56#include <unistd.h>
57#include <string.h>
58#include <errno.h>
59#include "usctest.h"
60#include "test.h"
61#define CLEANUP cleanup
62#include "libclone.h"
63
64#define INIT_PID	1
65#define CHILD_PID       1
66#define PARENT_PID      0
67
68char *TCID = "pid_namespace4";
69int TST_TOTAL = 1;
70int fd[2];
71
72/*
73 * child_fn1() - Inside container
74*/
75static int child_fn1(void *ttype)
76{
77	int exit_val;
78	pid_t cpid, ppid;
79	cpid = getpid();
80	ppid = getppid();
81	char mesg[] = "I was not killed !";
82       	/* Child process closes up read side of pipe */
83	close(fd[0]);
84
85	/* Comparing the values to make sure pidns is created correctly */
86	if ((cpid == CHILD_PID) && (ppid == PARENT_PID)) {
87		printf("PIDNS test is running inside container\n");
88		kill(INIT_PID, SIGKILL);
89		/* Verifying whether the container init is not killed, "
90		 If so writing into the pipe created in the parent NS" */
91
92		/* Send "mesg" through the write side of pipe */
93		write(fd[1], mesg, (strlen(mesg)+1));
94		exit_val = 0;
95	}
96	else {
97		printf("got unexpected result of cpid=%d ppid=%d\n",
98		    cpid, ppid);
99		exit_val = 1;
100	}
101	exit(exit_val);
102}
103
104int main(int argc, char *argv[])
105{
106	int nbytes, status;
107	char readbuffer[80];
108
109	pipe(fd);
110	TEST(do_clone_unshare_test(T_CLONE, CLONE_NEWPID, child_fn1, NULL));
111	if (TEST_RETURN == -1) {
112		tst_brkm(TFAIL|TTERRNO, CLEANUP, "clone failed");
113	} else if (wait(&status) == -1) {
114		tst_brkm(TFAIL|TERRNO, CLEANUP, "wait failed");
115	}
116
117	/* Parent process closes up write side of pipe */
118	close(fd[1]);
119	/* Read in a string from the pipe */
120	nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
121
122	if (0 <= nbytes) {
123		tst_resm(TPASS, "Container init : %s", readbuffer);
124	} else {
125		tst_brkm(TFAIL, CLEANUP,
126		    "Container init is killed by SIGKILL !!!");
127	}
128
129	if (WIFEXITED(status) && WEXITSTATUS(status) != 0) {
130		tst_resm(TFAIL, "Container init pid exited abnormally");
131	} else if (WIFSIGNALED(status)) {
132		tst_resm(TFAIL, "Container init pid got killed by signal %d",
133		    WTERMSIG(status));
134	}
135	CLEANUP();
136
137	tst_exit();
138
139}
140
141static void
142cleanup(void)
143{
144	TEST_CLEANUP;
145	close(fd[0]);
146}
147