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