Hi Subrata, here is the version with updated copyrights and a README update.
thanks, -serge >From caaabd21861b57d6943367efe54f36f9b3700b8d Mon Sep 17 00:00:00 2001 From: Nadia Derbey <[email protected]> Date: Tue, 16 Dec 2008 21:38:03 +0000 Subject: [PATCH 1/4] ltp: posix message queue namespaces: first test 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]> --- README | 6 + testcases/kernel/containers/Makefile | 2 +- testcases/kernel/containers/README | 4 + testcases/kernel/containers/container_test.sh | 9 ++ testcases/kernel/containers/mqns/Makefile | 42 +++++++ .../kernel/containers/mqns/check_mqns_enabled.c | 55 +++++++++ testcases/kernel/containers/mqns/mqns.h | 13 ++ testcases/kernel/containers/mqns/mqns_01.c | 124 ++++++++++++++++++++ testcases/kernel/containers/mqns/runmqnstest.sh | 40 +++++++ 9 files changed, 294 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/README b/README index 2aff787..e4a72a4 100644 --- a/README +++ b/README @@ -133,6 +133,12 @@ CONFIG_NET_NS=y CONFIG_VETH=y CONFIG_MACVLAN=y +The IPC namespaces do not automatically enable IPC, so you may +also want to have: + +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +CONFIG_POSIX_MQUEUE=y --------------------------------- Enabling Kernel Configuration to test Controllers 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..d9aba3d --- /dev/null +++ b/testcases/kernel/containers/mqns/Makefile @@ -0,0 +1,42 @@ +################################################################################ +## ## +## Copyright (c) International Business Machines Corp., 2009 ## +## Copyright (c) Nadia Derbey, 2009 ## +## ## +## 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..a369921 --- /dev/null +++ b/testcases/kernel/containers/mqns/check_mqns_enabled.c @@ -0,0 +1,55 @@ +/* +* Copyright (c) International Business Machines Corp., 2009 +* Copyright (c) Nadia Derbey, 2009 +* 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..009b29b --- /dev/null +++ b/testcases/kernel/containers/mqns/mqns_01.c @@ -0,0 +1,124 @@ +/* +* Copyright (c) International Business Machines Corp., 2009 +* Copyright (c) Nadia Derbey, 2009 +* 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..e3b334c --- /dev/null +++ b/testcases/kernel/containers/mqns/runmqnstest.sh @@ -0,0 +1,40 @@ +#!/bin/sh +################################################################################ +## ## +## Copyright (c) International Business Machines Corp., 2009 ## +## Copyright (c) Nadia Derbey, 2009 ## +## ## +## 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 -- 1.5.6.3 ------------------------------------------------------------------------------ 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
