On Mon, 2008-11-03 at 21:26 +0530, Veerendra wrote:
> Hi
> Submitting the testcase, which would try to kill the parent
> namespace pid from the container init. Also this tests a scenario
> of
> killing non existent pid from the container.
>
>
> Regards
> Veerendra C
>
Thanks for this. Added.
Regards--
Subrata
>
>
>
>
>
>
>
>
> text/x-diff
> attachment
> (pidns06.patch)
>
> [EMAIL PROTECTED] pidns]# ./pidns06
> pidns06 0 INFO : Parent: Passing the pid of the process 21939
> pidns06 1 PASS : Container: tried kill() on the parent pid
> 21939: errno set to 3 (No such process), as expected
>
> pidns06 2 PASS : Container: While killing non existent pid
> errno set to 3 : No such process, as expected
>
>
>
> Signed-off-by: Veerendra C <[EMAIL PROTECTED]>
>
>
> Index:
> root/root/new/ltp-full-20080930/testcases/kernel/containers/pidns/pidns06.c
> ===================================================================
> --- /dev/null
> +++
> root/root/new/ltp-full-20080930/testcases/kernel/containers/pidns/pidns06.c
> @@ -0,0 +1,162 @@
> +/*
> +* Copyright (c) International Business Machines Corp., 2008
> +* This program is free software; you can redistribute it and/or
> modify
> +* it under the terms of the GNU General Public License as published
> by
> +* the Free Software Foundation; either version 2 of the License, or
> +* (at your option) any later version.
> +* This program is distributed in the hope that it will be useful
> +* but WITHOUT ANY WARRANTY; without even the implied warranty of
> +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
> +* the GNU General Public License for more details.
> +* You should have received a copy of the GNU General Public License
> +* along with this program; if not, write to the Free Software
> +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
> USA
> +
> +*************************************************************************
> +* Description:
> +* Testcase tries killing of the parent namespace pid by the
> container-init.
> +* It also tries killing of non-existent PID, by the container-init.
> +* Returns Success if Unable to kill, and proper error number is set.
> +* else Returns Failure
> +*
> +* Steps:
> +* 1. Parent process clone a process with flag CLONE_NEWPID
> +* 2. The pid of the parent namespace is passed to the container.
> +* 3. Container receieves the PID and passes SIGKILL to this PID.
> +* 4. If kill() is unsuccessful and the errno is set to 'No Such
> process'
> +* then sets PASS
> +* else,
> +* sets FAIL
> +* 5. It also verifies by passing SIGKILL to FAKE_PID
> +* 6. If kill() is unsuccessful and the errno is set to 'No Such
> process'
> +* then sets PASS
> +* else,
> +* sets FAIL
> +*
> +* History:
> +*
> +* FLAG DATE NAME Description.
> +* 21/10/08 Veerendra C <[EMAIL PROTECTED]> Verifies killing of
> processes
> +* in container.
> +*******************************************************************************/
> +#define _GNU_SOURCE 1
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <sys/wait.h>
> +#include <assert.h>
> +#include <unistd.h>
> +#include <errno.h>
> +#include <usctest.h>
> +#include <test.h>
> +#include <libclone.h>
> +#include <signal.h>
> +
> +#define CINIT_PID 1
> +#define PARENT_PID 0
> +#define FAKE_PID 1230
> +
> +char *TCID = "pidns06";
> +int TST_TOTAL = 1;
> +
> +/*
> + * cleanup() - performs all ONE TIME cleanup for this test at
> + * completion or premature exit.
> + */
> +void cleanup()
> +{
> + /* Clean the test testcase as LTP wants*/
> + TEST_CLEANUP;
> +
> + /* exit with return code appropriate for results */
> + tst_exit();
> +}
> +
> +/*
> + * kill_pid_in_childfun()
> + * Cont-init tries to kill the parent-process using parent's
> global Pid.
> + * Also checks passing SIGKILL to non existent PID in the
> container.
> + */
> +static int kill_pid_in_childfun(void *vtest)
> +{
> + int cpid, ppid, *par_pid;
> + int ret = 0;
> + cpid = getpid();
> + ppid = getppid();
> + par_pid = (int *)vtest;
> +
> + /* Checking the values to make sure pidns is created correctly
> */
> + if ((cpid != CINIT_PID) || (ppid != PARENT_PID)) {
> + tst_resm(TFAIL, "Unexpected result for Container: "
> + " init pid=%d parent pid=%d\n", cpid,
> ppid);
> + cleanup();
> + }
> +
> + /*
> + * While trying kill() of the pid of the parent namespace..
> + * Check to see if the errno was set to the expected, value of
> 3 : ESRCH
> + */
> + ret = kill(*par_pid, SIGKILL);
> + if (ret == -1 && errno == ESRCH) {
> + tst_resm(TPASS, "Container: tried kill() on the parent
> "
> + "pid %d: errno set to %d (%s), as expected
> \n",
> + *par_pid, errno , strerror(errno));
> + } else {
> + tst_resm(TFAIL, "Container: tried kill() on the parent
> "
> + "pid %d, errno set to %d, (%s), expected %d,
> (%s). \n"
> + "\t\t\t\tReturn value is %d, expected -1.\n" ,
> + *par_pid, errno , strerror(errno), 3,
> strerror(3), ret);
> + }
> + /*
> + * While killing non-existent pid in the container,
> + * Check to see if the errno was set to the expected, value of
> 3 : ESRCH
> + */
> + ret = kill(FAKE_PID, SIGKILL);
> + if (ret == -1 && errno == ESRCH) {
> + tst_resm(TPASS, "Container: While killing non existent
> pid"
> + " errno set to %d : %s, as expected
> \n" ,
> + errno , strerror(errno));
> + } else {
> + tst_resm(TFAIL, "Container: While killing non-existent
> pid"
> + " errno set to %d : %s expected %d : %
> s. \n"
> + "\t\t\t\tReturn value is %d, expected
> -1.\n" ,
> + errno, strerror(errno), 3,
> strerror(3), ret);
> + }
> +
> + cleanup();
> +
> + /* NOT REACHED */
> + return 0;
> +}
> +
> +/*********************************************************************
> +* M A I N
> +***********************************************************************/
> +
> +int main()
> +{
> + int ret, status;
> + pid_t pid = getpid();
> +
> + tst_resm(TINFO, "Parent: Passing the pid of the process %d",
> pid);
> + ret = do_clone_unshare_test(T_CLONE, CLONE_NEWPID,
> + kill_pid_in_childfun, (void *)
> &pid);
> +
> + if (ret == -1) {
> + tst_resm(TFAIL, "clone() Failed, errno = %d : %s\n" ,
> + ret, strerror(ret));
> + cleanup();
> + }
> +
> + /* Wait for child to finish */
> + if ((wait(&status)) < 0) {
> + tst_resm(TWARN, "wait() failed, skipping this test
> case");
> + cleanup();
> + }
> +
> + /* cleanup and exit */
> + cleanup();
> +
> + /*NOTREACHED*/
> + return 0;
> +}
> +
>
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list