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

Reply via email to