All of lore.kernel.org
 help / color / mirror / Atom feed
* [LTP] [PATCH v3 0/3] add new syscall test for setns(2)
@ 2013-02-18 14:05 Jan Stancek
  2013-02-18 14:05 ` [LTP] [PATCH v3 1/3] setns: setup directory at kernel/syscalls/setns Jan Stancek
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Jan Stancek @ 2013-02-18 14:05 UTC (permalink / raw)
  To: ltp-list

changes in v3:
- added missing "void" to functions without parameters
- INIT_NS_TYPE macro converted to function
- use ltp_syscall in setup()

Jan Stancek (3):
  setns: setup directory at kernel/syscalls/setns
  setns: add new syscall test setns01
  setns: add new syscall test setns02

 runtest/syscalls                          |    3 +
 testcases/kernel/syscalls/.gitignore      |    2 +
 testcases/kernel/syscalls/setns/Makefile  |   23 +++
 testcases/kernel/syscalls/setns/setns.h   |   88 +++++++++++
 testcases/kernel/syscalls/setns/setns01.c |  240 +++++++++++++++++++++++++++++
 testcases/kernel/syscalls/setns/setns02.c |  231 +++++++++++++++++++++++++++
 6 files changed, 587 insertions(+), 0 deletions(-)
 create mode 100644 testcases/kernel/syscalls/setns/Makefile
 create mode 100644 testcases/kernel/syscalls/setns/setns.h
 create mode 100644 testcases/kernel/syscalls/setns/setns01.c
 create mode 100644 testcases/kernel/syscalls/setns/setns02.c


------------------------------------------------------------------------------
The Go Parallel Website, sponsored by Intel - in partnership with Geeknet, 
is your hub for all things parallel software development, from weekly thought 
leadership blogs to news, videos, case studies, tutorials, tech docs, 
whitepapers, evaluation guides, and opinion stories. Check out the most 
recent posts - join the conversation now. http://goparallel.sourceforge.net/
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [LTP] [PATCH v3 1/3] setns: setup directory at kernel/syscalls/setns
  2013-02-18 14:05 [LTP] [PATCH v3 0/3] add new syscall test for setns(2) Jan Stancek
@ 2013-02-18 14:05 ` Jan Stancek
  2013-02-19  2:14   ` Wanlong Gao
  2013-02-18 14:05 ` [LTP] [PATCH v3 2/3] setns: add new syscall test setns01 Jan Stancek
  2013-02-18 14:05 ` [LTP] [PATCH v3 3/3] setns: add new syscall test setns02 Jan Stancek
  2 siblings, 1 reply; 8+ messages in thread
From: Jan Stancek @ 2013-02-18 14:05 UTC (permalink / raw)
  To: ltp-list

Signed-off-by: Jan Stancek <jstancek@redhat.com>
---
 testcases/kernel/syscalls/setns/Makefile |   23 +++++++++++++++++++++++
 1 files changed, 23 insertions(+), 0 deletions(-)
 create mode 100644 testcases/kernel/syscalls/setns/Makefile

diff --git a/testcases/kernel/syscalls/setns/Makefile b/testcases/kernel/syscalls/setns/Makefile
new file mode 100644
index 0000000..f1b5129
--- /dev/null
+++ b/testcases/kernel/syscalls/setns/Makefile
@@ -0,0 +1,23 @@
+#
+#  Copyright (C) 2013 Linux Test Project, Inc.
+#
+#  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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+
+top_srcdir		?= ../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+CPPFLAGS                += -Wno-unused-function
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
-- 
1.7.1


------------------------------------------------------------------------------
The Go Parallel Website, sponsored by Intel - in partnership with Geeknet, 
is your hub for all things parallel software development, from weekly thought 
leadership blogs to news, videos, case studies, tutorials, tech docs, 
whitepapers, evaluation guides, and opinion stories. Check out the most 
recent posts - join the conversation now. http://goparallel.sourceforge.net/
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [LTP] [PATCH v3 2/3] setns: add new syscall test setns01
  2013-02-18 14:05 [LTP] [PATCH v3 0/3] add new syscall test for setns(2) Jan Stancek
  2013-02-18 14:05 ` [LTP] [PATCH v3 1/3] setns: setup directory at kernel/syscalls/setns Jan Stancek
@ 2013-02-18 14:05 ` Jan Stancek
  2013-02-18 18:17   ` chrubis
  2013-02-18 14:05 ` [LTP] [PATCH v3 3/3] setns: add new syscall test setns02 Jan Stancek
  2 siblings, 1 reply; 8+ messages in thread
From: Jan Stancek @ 2013-02-18 14:05 UTC (permalink / raw)
  To: ltp-list

errno tests for setns(2) - reassociate thread with a namespace

Signed-off-by: Jan Stancek <jstancek@redhat.com>
---
 runtest/syscalls                          |    2 +
 testcases/kernel/syscalls/.gitignore      |    1 +
 testcases/kernel/syscalls/setns/setns.h   |   88 +++++++++++
 testcases/kernel/syscalls/setns/setns01.c |  240 +++++++++++++++++++++++++++++
 4 files changed, 331 insertions(+), 0 deletions(-)
 create mode 100644 testcases/kernel/syscalls/setns/setns.h
 create mode 100644 testcases/kernel/syscalls/setns/setns01.c

diff --git a/runtest/syscalls b/runtest/syscalls
index db5a075..a881479 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -962,6 +962,8 @@ setitimer01 setitimer01
 setitimer02 setitimer02
 setitimer03 setitimer03
 
+setns01 setns01
+
 setpgid01 setpgid01
 setpgid02 setpgid02
 setpgid03 setpgid03
diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
index d661159..4b8bb94 100644
--- a/testcases/kernel/syscalls/.gitignore
+++ b/testcases/kernel/syscalls/.gitignore
@@ -764,6 +764,7 @@
 /setitimer/setitimer01
 /setitimer/setitimer02
 /setitimer/setitimer03
+/setns/setns01
 /setpgid/setpgid01
 /setpgid/setpgid02
 /setpgid/setpgid03
diff --git a/testcases/kernel/syscalls/setns/setns.h b/testcases/kernel/syscalls/setns/setns.h
new file mode 100644
index 0000000..23bdb2e
--- /dev/null
+++ b/testcases/kernel/syscalls/setns/setns.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2013 Linux Test Project, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Further, this software is distributed without any warranty that it
+ * is free of the rightful claim of any third person regarding
+ * infringement or the like.  Any license provided herein, whether
+ * implied or otherwise, applies only to this software file.  Patent
+ * licenses, if any, provided herein do not apply to combinations of
+ * this program with other software, or any other product whatsoever.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#define NS_MAX 5
+static int ns_types[NS_MAX];
+static int ns_fds[NS_MAX];
+static int ns_total;
+
+static int get_ns_fd(int pid, const char *ns)
+{
+	char tmp[PATH_MAX];
+	struct stat st;
+	int fd = -1;
+
+	sprintf(tmp, "/proc/%d/ns/%s", pid, ns);
+	if (stat(tmp, &st) == 0) {
+		fd = open(tmp, O_RDONLY);
+		if (fd == -1)
+			tst_brkm(TBROK|TERRNO, NULL, "failed to open %s", tmp);
+	} else {
+		if (errno != ENOENT)
+			tst_brkm(TBROK|TERRNO, NULL, "failed to stat %s", tmp);
+	}
+	return fd;
+}
+
+static void init_ns_type(int clone_type, const char *proc_name)
+{
+	int fd;
+
+	fd = get_ns_fd(getpid(), proc_name);
+	if (fd != -1) {
+		ns_types[ns_total] = clone_type;
+		ns_fds[ns_total] = fd;
+		tst_resm(TINFO, "ns_fds[%d]=%d, ns_types[%d]=0x%x", ns_total,
+			fd, ns_total, clone_type);
+		ns_total++;
+	}
+}
+
+static void init_available_ns(void)
+{
+#if defined(CLONE_NEWIPC)
+	init_ns_type(CLONE_NEWIPC, "ipc");
+#endif
+#if defined(CLONE_NEWNS)
+	init_ns_type(CLONE_NEWNS, "mnt");
+#endif
+#if defined(CLONE_NEWNET)
+	init_ns_type(CLONE_NEWNET, "net");
+#endif
+#if defined(CLONE_NEWPID)
+	init_ns_type(CLONE_NEWPID, "pid");
+#endif
+#if defined(CLONE_NEWUTS)
+	init_ns_type(CLONE_NEWUTS, "uts");
+#endif
+}
+
+static void close_ns_fds(void)
+{
+	int i;
+
+	for (i = 0; i < ns_total; i++)
+		if (ns_fds[i] != -1)
+			close(ns_fds[i]);
+}
diff --git a/testcases/kernel/syscalls/setns/setns01.c b/testcases/kernel/syscalls/setns/setns01.c
new file mode 100644
index 0000000..710ce9b
--- /dev/null
+++ b/testcases/kernel/syscalls/setns/setns01.c
@@ -0,0 +1,240 @@
+/*
+ * Copyright (C) 2013 Linux Test Project, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Further, this software is distributed without any warranty that it
+ * is free of the rightful claim of any third person regarding
+ * infringement or the like.  Any license provided herein, whether
+ * implied or otherwise, applies only to this software file.  Patent
+ * licenses, if any, provided herein do not apply to combinations of
+ * this program with other software, or any other product whatsoever.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+/*
+ * errno tests for setns(2) - reassociate thread with a namespace
+ */
+#define _GNU_SOURCE
+#include <sys/stat.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <sched.h>
+#include <pwd.h>
+#include <string.h>
+#include "config.h"
+#include "test.h"
+#include "usctest.h"
+#include "linux_syscall_numbers.h"
+#include "safe_macros.h"
+
+char *TCID = "setns01";
+
+#if defined(__NR_setns)
+#include "setns.h"
+
+struct testcase_t {
+	const char *msg;
+	int fd;
+	int ns_type;
+	int exp_ret;
+	int exp_errno;
+	int skip;
+	void (*setup) (struct testcase_t *, int i);
+	void (*cleanup) (struct testcase_t *);
+};
+
+static void setup(void);
+static void cleanup(void);
+static void setup0(struct testcase_t *, int);
+static void setup1(struct testcase_t *, int);
+static void setup2(struct testcase_t *, int);
+static void setup3(struct testcase_t *, int);
+static void setup4(struct testcase_t *, int);
+static void cleanup1(struct testcase_t *);
+static void cleanup4(struct testcase_t *);
+
+struct testcase_t tdat[] = {
+	{
+		.msg = "invalid fd",
+		.fd = -1,
+		.exp_ret = -1,
+		.exp_errno = EBADF,
+		.setup = setup0,
+	},
+	{
+		.msg = "regular file fd",
+		.exp_ret = -1,
+		.exp_errno = EINVAL,
+		.setup = setup1,
+		.cleanup = cleanup1
+	},
+	{
+		.msg = "invalid ns_type",
+		.ns_type = -1,
+		.exp_ret = -1,
+		.exp_errno = EINVAL,
+		.setup = setup2,
+	},
+	{
+		.msg = "mismatch ns_type/fd",
+		.exp_ret = -1,
+		.exp_errno = EINVAL,
+		.setup = setup3,
+	},
+	{
+		.msg = "without CAP_SYS_ADMIN",
+		.exp_ret = -1,
+		.exp_errno = EPERM,
+		.setup = setup4,
+		.cleanup = cleanup4,
+	}
+};
+
+static int TST_TOTAL = sizeof(tdat) / sizeof(tdat[0]);
+static const char nobody_uid[] = "nobody";
+static struct passwd *ltpuser;
+
+static void setup0(struct testcase_t *t, int i)
+{
+	t->ns_type = ns_types[i];
+}
+
+static void setup1(struct testcase_t *t, int i)
+{
+	t->ns_type = ns_types[i];
+	t->fd = open("dummy", O_CREAT);
+	if (t->fd == -1)
+		tst_brkm(TFAIL|TERRNO, cleanup, "setup1:open failed");
+	unlink("dummy");
+}
+
+static void cleanup1(struct testcase_t *t)
+{
+	close(t->fd);
+}
+
+static void setup2(struct testcase_t *t, int i)
+{
+	t->fd = ns_fds[i];
+}
+
+static void setup3(struct testcase_t *t, int i)
+{
+	if (ns_total < 2) {
+		t->skip = 1;
+		return;
+	}
+
+	t->fd = ns_fds[i];
+	t->ns_type = ns_types[(i+1) % ns_total];
+}
+
+static void setup4(struct testcase_t *t, int i)
+{
+	if (seteuid(ltpuser->pw_uid) == -1)
+		tst_brkm(TBROK | TERRNO, NULL, "seteuid failed");
+
+	t->fd = ns_fds[i];
+	t->ns_type = ns_types[i];
+}
+
+static void cleanup4(struct testcase_t *t)
+{
+	if (seteuid(0) == -1)
+		tst_brkm(TBROK | TERRNO, NULL, "seteuid restore failed");
+}
+
+static void test_setns(struct testcase_t *t)
+{
+	int ret, i;
+
+	for (i = 0; i < ns_total; i++) {
+		if (t->setup)
+			t->setup(t, i);
+
+		if (t->skip) {
+			tst_resm(TINFO, "skip %s", tdat->msg);
+			continue;
+		}
+
+		tst_resm(TINFO, "setns(%d, 0x%x)", t->fd, t->ns_type);
+		ret = syscall(__NR_setns, t->fd, t->ns_type);
+		if (ret == t->exp_ret) {
+			if (ret == -1 && errno == t->exp_errno)
+				tst_resm(TPASS, "%s exp_errno=%d", t->msg,
+						t->exp_errno);
+			else
+				tst_resm(TFAIL|TERRNO, "%s exp_errno=%d",
+					t->msg, t->exp_errno);
+		} else {
+			tst_resm(TFAIL, "%s ret=%d expected=%d", t->msg,
+					ret, t->exp_ret);
+		}
+
+		if (t->cleanup)
+			t->cleanup(t);
+	}
+}
+
+int main(int argc, char *argv[])
+{
+	int lc, testno;
+	char *msg;
+
+	msg = parse_opts(argc, argv, NULL, NULL);
+	if (msg != NULL)
+		tst_brkm(TBROK, tst_exit, "OPTION PARSING ERROR - %s", msg);
+
+	setup();
+	for (lc = 0; TEST_LOOPING(lc); lc++) {
+		for (testno = 0; testno < TST_TOTAL; testno++)
+			test_setns(&tdat[testno]);
+	}
+	cleanup();
+	tst_exit();
+}
+
+static void setup(void)
+{
+	tst_require_root(NULL);
+
+	/* runtime check if syscall is supported */
+	ltp_syscall(__NR_setns, -1, 0);
+
+	init_available_ns();
+	if (ns_total == 0)
+		tst_brkm(TCONF, NULL, "no ns types/proc entries");
+
+	ltpuser = getpwnam(nobody_uid);
+	if (ltpuser == NULL)
+		tst_brkm(TBROK | TERRNO, NULL, "getpwnam failed");
+
+
+	tst_tmpdir();
+	TEST_PAUSE;
+}
+
+static void cleanup(void)
+{
+	close_ns_fds();
+	tst_rmdir();
+	TEST_CLEANUP;
+}
+#else
+int main(int argc, char *argv[])
+{
+	tst_brkm(TCONF, NULL, "__NR_setns is not defined on your system.");
+
+}
+#endif
-- 
1.7.1


------------------------------------------------------------------------------
The Go Parallel Website, sponsored by Intel - in partnership with Geeknet, 
is your hub for all things parallel software development, from weekly thought 
leadership blogs to news, videos, case studies, tutorials, tech docs, 
whitepapers, evaluation guides, and opinion stories. Check out the most 
recent posts - join the conversation now. http://goparallel.sourceforge.net/
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [LTP] [PATCH v3 3/3] setns: add new syscall test setns02
  2013-02-18 14:05 [LTP] [PATCH v3 0/3] add new syscall test for setns(2) Jan Stancek
  2013-02-18 14:05 ` [LTP] [PATCH v3 1/3] setns: setup directory at kernel/syscalls/setns Jan Stancek
  2013-02-18 14:05 ` [LTP] [PATCH v3 2/3] setns: add new syscall test setns01 Jan Stancek
@ 2013-02-18 14:05 ` Jan Stancek
  2013-02-19  2:16   ` Wanlong Gao
  2 siblings, 1 reply; 8+ messages in thread
From: Jan Stancek @ 2013-02-18 14:05 UTC (permalink / raw)
  To: ltp-list

functional test for setns(2) - reassociate thread with a namespace
involving CLONE_NEWIPC and CLONE_NEWUTS.

Signed-off-by: Jan Stancek <jstancek@redhat.com>
---
 runtest/syscalls                          |    1 +
 testcases/kernel/syscalls/.gitignore      |    1 +
 testcases/kernel/syscalls/setns/setns02.c |  231 +++++++++++++++++++++++++++++
 3 files changed, 233 insertions(+), 0 deletions(-)
 create mode 100644 testcases/kernel/syscalls/setns/setns02.c

diff --git a/runtest/syscalls b/runtest/syscalls
index a881479..c70bcbd 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -963,6 +963,7 @@ setitimer02 setitimer02
 setitimer03 setitimer03
 
 setns01 setns01
+setns02 setns02
 
 setpgid01 setpgid01
 setpgid02 setpgid02
diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
index 4b8bb94..ce62f3f 100644
--- a/testcases/kernel/syscalls/.gitignore
+++ b/testcases/kernel/syscalls/.gitignore
@@ -765,6 +765,7 @@
 /setitimer/setitimer02
 /setitimer/setitimer03
 /setns/setns01
+/setns/setns02
 /setpgid/setpgid01
 /setpgid/setpgid02
 /setpgid/setpgid03
diff --git a/testcases/kernel/syscalls/setns/setns02.c b/testcases/kernel/syscalls/setns/setns02.c
new file mode 100644
index 0000000..2033980
--- /dev/null
+++ b/testcases/kernel/syscalls/setns/setns02.c
@@ -0,0 +1,231 @@
+/*
+ * Copyright (C) 2013 Linux Test Project, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Further, this software is distributed without any warranty that it
+ * is free of the rightful claim of any third person regarding
+ * infringement or the like.  Any license provided herein, whether
+ * implied or otherwise, applies only to this software file.  Patent
+ * licenses, if any, provided herein do not apply to combinations of
+ * this program with other software, or any other product whatsoever.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+/*
+ * functional test for setns(2) - reassociate thread with a namespace
+ * 1. create child with CLONE_NEWUTS, set different hostname in child,
+ *    set namespace back to parent ns and check that hostname has changed
+ * 2. create child with CLONE_NEWIPC, set up shared memory in parent
+ *    and verify that child can't shmat it, then set namespace
+ *    back to parent one and verify that child is able to do shmat
+ */
+#define _GNU_SOURCE
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/stat.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <sys/utsname.h>
+#include <sys/wait.h>
+#include <errno.h>
+#include <sched.h>
+#include <string.h>
+#include "config.h"
+#include "test.h"
+#include "usctest.h"
+#include "linux_syscall_numbers.h"
+#include "safe_macros.h"
+
+#define CHILD_STACK_SIZE (1024*1024)
+#define CP "(child) "
+char *TCID = "setns02";
+
+#if defined(__NR_setns) && defined(CLONE_NEWIPC) && defined(CLONE_NEWUTS)
+#include "setns.h"
+
+static char *dummy_hostname = "setns_dummy_uts";
+static int ns_ipc_fd;
+static int ns_uts_fd;
+static key_t ipc_key;
+static int shmid;
+
+static void setup(void);
+static void cleanup(void);
+
+static int do_child_newuts(void *arg)
+{
+	struct utsname uts, uts_parent;
+	int ns_flag = *(int *)arg;
+
+	if (uname(&uts_parent) == -1)
+		tst_resm(TFAIL|TERRNO, CP"uname");
+	tst_resm(TINFO, CP"hostname (inherited from parent): %s",
+		uts_parent.nodename);
+
+	if (sethostname(dummy_hostname, strlen(dummy_hostname)) == -1)
+		tst_resm(TFAIL|TERRNO, CP"sethostname");
+	if (uname(&uts) == -1)
+		tst_resm(TFAIL|TERRNO, CP"uname");
+
+	tst_resm(TINFO, CP"hostname changed to: %s", uts.nodename);
+	if (strcmp(uts_parent.nodename, uts.nodename) == 0) {
+		tst_resm(TFAIL, CP"expected hostname to be different");
+		return 1;
+	} else {
+		tst_resm(TPASS, CP"hostname is different in parent/child");
+	}
+
+	tst_resm(TINFO, CP"attempting to switch ns back to parent ns");
+	if (syscall(__NR_setns, ns_uts_fd, ns_flag) == -1) {
+		tst_resm(TFAIL|TERRNO, CP"setns");
+		return 2;
+	}
+	if (uname(&uts) == -1)
+		tst_resm(TFAIL|TERRNO, CP"uname");
+
+	tst_resm(TINFO, CP"hostname: %s", uts.nodename);
+	if (strcmp(uts_parent.nodename, uts.nodename) != 0) {
+		tst_resm(TFAIL, CP"expected hostname to match parent");
+		return 3;
+	} else {
+		tst_resm(TPASS, CP"hostname now as expected");
+	}
+	return 0;
+}
+
+static int do_child_newipc(void *arg)
+{
+	void *p;
+	int ns_flag = *(int *)arg;
+
+	p = shmat(shmid, NULL, 0);
+	if (p == (void *) -1) {
+		tst_resm(TPASS|TERRNO, CP"shmat failed as expected");
+	} else {
+		tst_resm(TFAIL, CP"shmat unexpectedly suceeded");
+		shmdt(p);
+		return 1;
+	}
+
+	tst_resm(TINFO, CP"attempting to switch ns back to parent ns");
+	if (syscall(__NR_setns, ns_ipc_fd, ns_flag) == -1) {
+		tst_resm(TFAIL|TERRNO, CP"setns");
+		return 2;
+	}
+
+	p = shmat(shmid, NULL, 0);
+	if (p == (void *) -1) {
+		tst_resm(TFAIL|TERRNO, CP"shmat failed after setns");
+		return 3;
+	} else {
+		tst_resm(TPASS, CP"shmat suceeded");
+		shmdt(p);
+	}
+
+	return 0;
+}
+
+static void test_flag(int clone_flag, int ns_flag, int (*fn) (void *arg))
+{
+	void *child_stack;
+	int ret, status;
+
+	child_stack = malloc(CHILD_STACK_SIZE);
+	if (child_stack == NULL)
+		tst_brkm(TBROK, cleanup, "Cannot allocate stack for child");
+
+	tst_resm(TINFO, "creating child with clone_flag=0x%x, ns_flag=0x%x",
+		clone_flag, ns_flag);
+	ret = ltp_clone(SIGCHLD|clone_flag, fn, &ns_flag,
+		CHILD_STACK_SIZE, child_stack);
+	if (ret == -1)
+		tst_brkm(TBROK|TERRNO, cleanup, "ltp_clone");
+
+	if (waitpid(ret, &status, 0) == -1)
+		tst_brkm(TBROK|TERRNO, cleanup, "waitpid");
+	if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
+		tst_resm(TFAIL, "child returns %d", status);
+	else
+		tst_resm(TPASS, "child finished succesfully");
+	free(child_stack);
+}
+
+int main(int argc, char *argv[])
+{
+	int lc;
+	char *msg;
+
+	msg = parse_opts(argc, argv, NULL, NULL);
+	if (msg != NULL)
+		tst_brkm(TBROK, tst_exit, "OPTION PARSING ERROR - %s", msg);
+
+	setup();
+	for (lc = 0; TEST_LOOPING(lc); lc++) {
+		if (ns_uts_fd != -1) {
+			tst_resm(TINFO, "test_newuts");
+			test_flag(CLONE_NEWUTS, CLONE_NEWUTS, do_child_newuts);
+			test_flag(CLONE_NEWUTS, 0, do_child_newuts);
+		}
+		if (ns_ipc_fd != -1) {
+			tst_resm(TINFO, "test_newipc");
+			test_flag(CLONE_NEWIPC, CLONE_NEWIPC, do_child_newipc);
+			test_flag(CLONE_NEWIPC, 0, do_child_newipc);
+		}
+	}
+	cleanup();
+	tst_exit();
+}
+
+static void setup(void)
+{
+	char tmp[PATH_MAX];
+
+	tst_require_root(NULL);
+
+	/* runtime check if syscall is supported */
+	ltp_syscall(__NR_setns, -1, 0);
+
+	/* check if kernel has CONFIG_*_NS set and exports /proc entries */
+	ns_ipc_fd = get_ns_fd(getpid(), "ipc");
+	ns_uts_fd = get_ns_fd(getpid(), "uts");
+	if (ns_ipc_fd == -1 && ns_uts_fd == -1)
+		tst_brkm(TCONF, NULL, "your kernel has CONFIG_IPC_NS, "
+			"CONFIG_UTS_NS or CONFIG_PROC disabled");
+
+	if (getcwd(tmp, PATH_MAX) == NULL)
+		tst_brkm(TBROK|TERRNO, NULL, "getcwd");
+	ipc_key = ftok(tmp, 65);
+	shmid = shmget(ipc_key, getpagesize(), IPC_CREAT | 0666);
+	if (shmid == -1)
+		tst_brkm(TBROK|TERRNO, NULL, "shmget");
+
+	TEST_PAUSE;
+}
+
+static void cleanup(void)
+{
+	if (ns_ipc_fd != -1)
+		close(ns_ipc_fd);
+	if (ns_uts_fd != -1)
+		close(ns_uts_fd);
+
+	shmctl(shmid, IPC_RMID, NULL);
+	TEST_CLEANUP;
+}
+#else
+int main(int argc, char *argv[])
+{
+	tst_brkm(TCONF, NULL, "__NR_setns, CLONE_NEWIPC or CLONE_NEWUTS "
+		" is not defined on your system.");
+}
+#endif
-- 
1.7.1


------------------------------------------------------------------------------
The Go Parallel Website, sponsored by Intel - in partnership with Geeknet, 
is your hub for all things parallel software development, from weekly thought 
leadership blogs to news, videos, case studies, tutorials, tech docs, 
whitepapers, evaluation guides, and opinion stories. Check out the most 
recent posts - join the conversation now. http://goparallel.sourceforge.net/
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [LTP] [PATCH v3 2/3] setns: add new syscall test setns01
  2013-02-18 14:05 ` [LTP] [PATCH v3 2/3] setns: add new syscall test setns01 Jan Stancek
@ 2013-02-18 18:17   ` chrubis
  0 siblings, 0 replies; 8+ messages in thread
From: chrubis @ 2013-02-18 18:17 UTC (permalink / raw)
  To: Jan Stancek; +Cc: ltp-list

Hi!
> +static void setup1(struct testcase_t *t, int i)
> +{
> +	t->ns_type = ns_types[i];
> +	t->fd = open("dummy", O_CREAT);

While I tried to compile this code, I've got error as open with O_CREAT
is required to pass the mode.

> +	if (t->fd == -1)
> +		tst_brkm(TFAIL|TERRNO, cleanup, "setup1:open failed");
> +	unlink("dummy");
> +}

-- 
Cyril Hrubis
chrubis@suse.cz

------------------------------------------------------------------------------
The Go Parallel Website, sponsored by Intel - in partnership with Geeknet, 
is your hub for all things parallel software development, from weekly thought 
leadership blogs to news, videos, case studies, tutorials, tech docs, 
whitepapers, evaluation guides, and opinion stories. Check out the most 
recent posts - join the conversation now. http://goparallel.sourceforge.net/
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [LTP] [PATCH v3 1/3] setns: setup directory at kernel/syscalls/setns
  2013-02-18 14:05 ` [LTP] [PATCH v3 1/3] setns: setup directory at kernel/syscalls/setns Jan Stancek
@ 2013-02-19  2:14   ` Wanlong Gao
  0 siblings, 0 replies; 8+ messages in thread
From: Wanlong Gao @ 2013-02-19  2:14 UTC (permalink / raw)
  To: Jan Stancek; +Cc: ltp-list

On 02/18/2013 10:05 PM, Jan Stancek wrote:
> Signed-off-by: Jan Stancek <jstancek@redhat.com>
> ---
>  testcases/kernel/syscalls/setns/Makefile |   23 +++++++++++++++++++++++
>  1 files changed, 23 insertions(+), 0 deletions(-)
>  create mode 100644 testcases/kernel/syscalls/setns/Makefile

Applied, thank you.

Wanlong Gao


------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [LTP] [PATCH v3 3/3] setns: add new syscall test setns02
  2013-02-18 14:05 ` [LTP] [PATCH v3 3/3] setns: add new syscall test setns02 Jan Stancek
@ 2013-02-19  2:16   ` Wanlong Gao
  0 siblings, 0 replies; 8+ messages in thread
From: Wanlong Gao @ 2013-02-19  2:16 UTC (permalink / raw)
  To: Jan Stancek; +Cc: ltp-list

On 02/18/2013 10:05 PM, Jan Stancek wrote:
> functional test for setns(2) - reassociate thread with a namespace
> involving CLONE_NEWIPC and CLONE_NEWUTS.
> 
> Signed-off-by: Jan Stancek <jstancek@redhat.com>

Applied, thank you.

Wanlong Gao


------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [LTP] [PATCH v3 2/3] setns: add new syscall test setns01
       [not found] ` <1360829341.5171174.1361259703806.JavaMail.root@redhat.com>
@ 2013-02-19 10:01   ` chrubis
  0 siblings, 0 replies; 8+ messages in thread
From: chrubis @ 2013-02-19 10:01 UTC (permalink / raw)
  To: Jan Stancek; +Cc: ltp-list

Hi!
> Thanks, that was error for sure. I just wonder what compiler/version
> Cyril used.

It's glibc feature. If you turn on FORTIFY_SOURCES the
/usr/include/fcntl.h includes /usr/include/bits/fcntl2.h which contains
checks for common open errors.

And there are other checks it enables too.

-- 
Cyril Hrubis
chrubis@suse.cz

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2013-02-19 10:01 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-02-18 14:05 [LTP] [PATCH v3 0/3] add new syscall test for setns(2) Jan Stancek
2013-02-18 14:05 ` [LTP] [PATCH v3 1/3] setns: setup directory at kernel/syscalls/setns Jan Stancek
2013-02-19  2:14   ` Wanlong Gao
2013-02-18 14:05 ` [LTP] [PATCH v3 2/3] setns: add new syscall test setns01 Jan Stancek
2013-02-18 18:17   ` chrubis
2013-02-18 14:05 ` [LTP] [PATCH v3 3/3] setns: add new syscall test setns02 Jan Stancek
2013-02-19  2:16   ` Wanlong Gao
     [not found] <5122E05A.6010507@cn.fujitsu.com>
     [not found] ` <1360829341.5171174.1361259703806.JavaMail.root@redhat.com>
2013-02-19 10:01   ` [LTP] [PATCH v3 2/3] setns: add new syscall test setns01 chrubis

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.