Hi Serge,

On Mon, 2009-03-02 at 13:19 -0600, Serge E. Hallyn wrote:
> Add the first test for posix message queue namespaces, plus a
> test to detect whether they are enabled.
> 
> Note that the kernel version check is currently bogus - these are
> are in -mm.
> 
> Based on older version by Nadia Derbey.
> 
> Changelog:
>       Mar 02 2009: moved to the libclone do_clone() helper.
> 
> Signed-off-by: Nadia Derbey <[email protected]>
> Signed-off-by: Serge Hallyn <[email protected]>

Just 1 note. Can you also please add in ltp/README; if additional kernel
config option(s) need to be enabled in the coming 2.6.29 release, to
make this feature available in the running kernel ? Or, it gets
automatically enabled with defconfig.

> ---
>  testcases/kernel/containers/Makefile               |    2 +-
>  testcases/kernel/containers/README                 |    4 +
>  testcases/kernel/containers/container_test.sh      |    9 ++
>  testcases/kernel/containers/mqns/Makefile          |   41 +++++++
>  .../kernel/containers/mqns/check_mqns_enabled.c    |   54 +++++++++
>  testcases/kernel/containers/mqns/mqns.h            |   13 ++
>  testcases/kernel/containers/mqns/mqns_01.c         |  123 
> ++++++++++++++++++++
>  testcases/kernel/containers/mqns/runmqnstest.sh    |   39 ++++++
>  8 files changed, 284 insertions(+), 1 deletions(-)
>  create mode 100644 testcases/kernel/containers/mqns/Makefile
>  create mode 100644 testcases/kernel/containers/mqns/check_mqns_enabled.c
>  create mode 100644 testcases/kernel/containers/mqns/mqns.h
>  create mode 100644 testcases/kernel/containers/mqns/mqns_01.c
>  create mode 100644 testcases/kernel/containers/mqns/runmqnstest.sh
> 
> diff --git a/testcases/kernel/containers/Makefile 
> b/testcases/kernel/containers/Makefile
> index d5f0811..9e1a4ba 100644
> --- a/testcases/kernel/containers/Makefile
> +++ b/testcases/kernel/containers/Makefile
> @@ -18,7 +18,7 @@
>  ##                                                                           
>  ##
>  
> ################################################################################
> 
> -SUBDIRS := libclone utsname sysvipc pidns netns
> +SUBDIRS := libclone utsname sysvipc pidns netns mqns
> 
>  all: check_for_unshare
>       @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i $@; done
> diff --git a/testcases/kernel/containers/README 
> b/testcases/kernel/containers/README
> index f1e485b..fd0898f 100644
> --- a/testcases/kernel/containers/README
> +++ b/testcases/kernel/containers/README
> @@ -37,6 +37,10 @@ each functionality README file for detail:
> 
>  sysvipc/*
>       Contains all the testcases related to IPC NS tests.
> +posixmq/*
> +     Contains all the testcases related to POSIX MQ NS tests.  These
> +     are strictly speaking a part of the ipc namespaces, but can be
> +     enabled in the kernel without SYSV IPC support.
>  utsname/*
>       Contains all the testcases related to utsname tests.
>  libclone/*
> diff --git a/testcases/kernel/containers/container_test.sh 
> b/testcases/kernel/containers/container_test.sh
> index 911a6a4..755e910 100755
> --- a/testcases/kernel/containers/container_test.sh
> +++ b/testcases/kernel/containers/container_test.sh
> @@ -54,6 +54,15 @@ else
>       echo "Process id namespaces not enabled in kernel.  Not running pidns 
> tests."
>  fi
> 
> +check_mqns_enabled
> +if [ $? -eq 0 ]; then
> +     echo "Running POSIX message queue tests."
> +     runmqnstest.sh
> +else
> +     echo "Posix message queues or ipc namespaces not enabled in kernel."
> +     echo "Not running mqns tests."
> +fi
> +
>  check_netns_enabled
>  if [ $? -eq 0 ]; then
>       echo "Running netns tests."
> diff --git a/testcases/kernel/containers/mqns/Makefile 
> b/testcases/kernel/containers/mqns/Makefile
> new file mode 100644
> index 0000000..ec6ba14
> --- /dev/null
> +++ b/testcases/kernel/containers/mqns/Makefile
> @@ -0,0 +1,41 @@
> +################################################################################
> +##                                                                           
>  ##
> +## Copyright (c) International Business Machines  Corp., 2007                
>  ##

I would change this to:

## Copyright (c) International Business Machines Corp., 2009          ##
everywhere.

And may be we also need to add:
## Copyright (c) Nadia Derbey, 2009          ##

as you said that he was the first to initiate these set of tests.

Regards--
Subrata

> +##                                                                           
>  ##
> +## 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   
>  ##
> +##                                                                           
>  ##
> +################################################################################
> +
> +CFLAGS += -Wall
> +CPPFLAGS += -I../../../../include -I../libclone
> +LDLIBS += -L../../../../lib -L../libclone ../libclone/libclone.a -lltp -lrt
> +
> +SRCS    := $(wildcard *.c)
> +TARGETS := $(SRCS:%.c=%)
> +
> +HAS_UNSHARE ?= $(shell ../check_for_unshare && echo y)
> +ifneq ($(HAS_UNSHARE),y)
> +TARGETS :=
> +endif
> +
> +all: $(TARGETS)
> +
> +clean:
> +     rm -f $(TARGETS) *.o
> +
> +install:
> +ifeq ($(HAS_UNSHARE),y)
> +     @set -e; for i in $(TARGETS) runmqnstest.sh check_mqns_enabled; do ln 
> -f $$i ../../../bin/$$i ; chmod +x runmqnstest.sh ; done
> +endif
> diff --git a/testcases/kernel/containers/mqns/check_mqns_enabled.c 
> b/testcases/kernel/containers/mqns/check_mqns_enabled.c
> new file mode 100644
> index 0000000..459ed43
> --- /dev/null
> +++ b/testcases/kernel/containers/mqns/check_mqns_enabled.c
> @@ -0,0 +1,54 @@
> +/*
> +* Copyright (c) International Business Machines Corp., 2007
> +* 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
> +*
> +* Author: Serge Hallyn <[email protected]>
> +***************************************************************************/
> +#include <sys/mount.h>
> +#include <sys/stat.h>
> +#include <sys/types.h>
> +#include <stdio.h>
> +#include "../libclone/libclone.h"
> +#include "test.h"
> +#include "mqns.h"
> +
> +int dummy(void *v)
> +{
> +     return 0;
> +}
> +
> +int main()
> +{
> +     int pid;
> +     mqd_t mqd;
> +
> +        if (tst_kvercmp(2,6,29) < 0)  /* only in -mm so far actually */
> +                return 1;
> +
> +     mq_unlink("/checkmqnsenabled");
> +     mqd = mq_open("/checkmqnsenabled", O_RDWR|O_CREAT|O_EXCL, 0777, NULL);
> +        if (mqd == -1) {
> +             perror("mq_open");
> +                return 3;
> +     }
> +     mq_close(mqd);
> +     mq_unlink("/checkmqnsenabled");
> +
> +     pid = do_clone(CLONE_NEWIPC, dummy, NULL);
> +
> +     if (pid == -1)
> +             return 5;
> +
> +        return 0;
> +}
> diff --git a/testcases/kernel/containers/mqns/mqns.h 
> b/testcases/kernel/containers/mqns/mqns.h
> new file mode 100644
> index 0000000..df8fc4b
> --- /dev/null
> +++ b/testcases/kernel/containers/mqns/mqns.h
> @@ -0,0 +1,13 @@
> +#ifndef __MQNS_H
> +#define __MQNS_H
> +
> +#include <sys/mount.h>
> +#include <mqueue.h>
> +#include <test.h>
> +#include <libclone.h>
> +
> +
> +#define DEV_MQUEUE "/dev/mqueue"
> +#define SLASH_MQ1 "/MQ1"
> +
> +#endif /* __MQNS_H */
> diff --git a/testcases/kernel/containers/mqns/mqns_01.c 
> b/testcases/kernel/containers/mqns/mqns_01.c
> new file mode 100644
> index 0000000..8adace5
> --- /dev/null
> +++ b/testcases/kernel/containers/mqns/mqns_01.c
> @@ -0,0 +1,123 @@
> +/*
> +* Copyright (c) International Business Machines Corp., 2007
> +* 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
> +*
> +* Author: Nadia Derbey <[email protected]>
> +*
> +* Check mqns isolation: father mqns cannot be accessed from newinstance
> +*
> +* Mount mqueue fs
> +* Create a posix mq -->mq1
> +* unshare
> +* In unshared process:
> +*    Mount newinstance mqueuefs
> +*    Check that mq1 is not readable from new ns
> +
> +***************************************************************************/
> +
> +#define _GNU_SOURCE 1
> +#include <sys/wait.h>
> +#include <assert.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <unistd.h>
> +#include <string.h>
> +#include <errno.h>
> +#include "mqns.h"
> +
> +char *TCID = "posixmq_namespace_01";
> +int TST_TOTAL=1;
> +
> +int p1[2];
> +int p2[2];
> +
> +int check_mqueue(void *vtest)
> +{
> +     char buf[30];
> +     mqd_t mqd;
> +
> +     close(p1[1]);
> +     close(p2[0]);
> +
> +     read(p1[0], buf, 3);
> +     mqd = mq_open(SLASH_MQ1, O_RDONLY);
> +     if (mqd == -1) {
> +             write(p2[1], "notfnd", 7);
> +     } else {
> +             write(p2[1], "exists", 7);
> +             mq_close(mqd);
> +     }
> +     tst_exit(0);
> +
> +     /* NOT REACHED */
> +     return 0;
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +     int r;
> +     mqd_t mqd;
> +     char buf[30];
> +     int use_clone = T_UNSHARE;
> +
> +     if (argc == 2 && strcmp(argv[1], "-clone") == 0) {
> +             tst_resm(TINFO, "Testing posix mq namespaces through 
> clone(2).\n");
> +             use_clone = T_CLONE;
> +     } else
> +             tst_resm(TINFO, "Testing posix mq namespaces through 
> unshare(2).\n");
> +
> +     if (pipe(p1) == -1) { perror("pipe"); exit(EXIT_FAILURE); }
> +     if (pipe(p2) == -1) { perror("pipe"); exit(EXIT_FAILURE); }
> +
> +     mqd = mq_open(SLASH_MQ1, O_RDWR|O_CREAT|O_EXCL, 0777, NULL);
> +     if (mqd == -1) {
> +             perror("mq_open");
> +             tst_resm(TFAIL, "mq_open failed\n");
> +             tst_exit(3);
> +     }
> +
> +     tst_resm(TINFO, "Checking namespaces isolation from parent to child\n");
> +     /* fire off the test */
> +     r = do_clone_unshare_test(use_clone, CLONE_NEWIPC, check_mqueue, NULL);
> +     if (r < 0) {
> +             tst_resm(TFAIL, "failed clone/unshare\n");
> +             mq_close(mqd);
> +             mq_unlink(SLASH_MQ1);
> +             tst_exit(1);
> +     }
> +
> +     close(p1[0]);
> +     close(p2[1]);
> +     write(p1[1], "go", 3);
> +     read(p2[0], buf, 7);
> +     if (!strcmp(buf, "exists")) {
> +             tst_resm(TFAIL, "child process found mqueue\n");
> +             r = TFAIL;
> +     } else if (!strcmp(buf, "notfnd")) {
> +             tst_resm(TPASS, "child process didn't find mqueue\n");
> +             r = TPASS;
> +     } else {
> +             tst_resm(TFAIL, "UNKNOWN RESULT\n");
> +             r = TFAIL;
> +     }
> +
> +     /* destroy the mqueue */
> +     mq_close(mqd);
> +     mq_unlink(SLASH_MQ1);
> +
> +     tst_exit(r);
> +
> +     /* NOT REACHED */
> +     return 0;
> +}
> diff --git a/testcases/kernel/containers/mqns/runmqnstest.sh 
> b/testcases/kernel/containers/mqns/runmqnstest.sh
> new file mode 100644
> index 0000000..87c712e
> --- /dev/null
> +++ b/testcases/kernel/containers/mqns/runmqnstest.sh
> @@ -0,0 +1,39 @@
> +#!/bin/sh
> +################################################################################
> +##                                                                           
>  ##
> +## Copyright (c) International Business Machines  Corp., 2007                
>  ##
> +##                                                                           
>  ##
> +## 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   
>  ##
> +##                                                                           
>  ##
> +################################################################################
> +
> +exit_code=0
> +tests_list='mqns_01'
> +
> +for t in $tests_list
> +do
> +     $t
> +     if [ $? -ne 0 ]; then
> +             exit_code="$?"
> +             exit $exit_code
> +     fi
> +     $t -clone
> +     if [ $? -ne 0 ]; then
> +             exit_code="$?"
> +             exit $exit_code
> +     fi
> +done
> +
> +exit $exit_code


------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to