[PATCH 2/2] Add a simple UTS test program

Dan Smith danms at us.ibm.com
Tue Mar 17 09:18:21 PDT 2009


This program creates a top-level UTS namespace and then forks a child.  The
parent sets the hostname to a different value every second and the child
prints the value.  If the child's value changes with the parent, even after
restart, then the pair are running in the same UTS namespace.  The test
self-checkpoints every iteration.

Signed-off-by: Dan Smith <danms at us.ibm.com>
---
 utstest.c |  114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 114 insertions(+), 0 deletions(-)
 create mode 100644 utstest.c

diff --git a/utstest.c b/utstest.c
new file mode 100644
index 0000000..1afca49
--- /dev/null
+++ b/utstest.c
@@ -0,0 +1,114 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sched.h>
+#include <string.h>
+#include <stdlib.h>
+#include <asm/unistd.h>
+
+#define OUTFILE "/tmp/cr-test.out"
+#define CKPTDIR "/tmp"
+
+int ckpt = 0;
+
+int do_checkpoint(void)
+{
+	char fn[256];
+	int fd;
+	int ret;
+
+	snprintf(fn, sizeof(fn)-1, CKPTDIR "/ckpt-%i", ckpt++);
+
+	fd = open(fn, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+	if (fd < 0) {
+		perror(fn);
+		return -1;
+	}
+
+	ret = syscall(__NR_checkpoint, getpid(), fd, 0);
+	if (ret < 0)
+		printf("Checkpoint to %s returned %i (%m)\n", fn, ret);
+
+	close(fd);
+
+	return ret;
+}
+
+void child(int fd, int subunshare)
+{
+	char hostname[256] = "foo";
+	int ret;
+
+	if (subunshare) {
+		ret = unshare(CLONE_NEWUTS);
+		if (ret) {
+			printf("unshare: %m");
+			exit(1);
+		}
+	}
+
+	while (1) {
+		ret = gethostname(hostname, sizeof(hostname));
+		if (ret) {
+			perror("gethostname");
+			_exit(1);
+		}
+
+		printf("Hostname in child is:  %s\n", hostname);
+		sleep(1);
+	}
+}
+
+int main(int argc, char **argv)
+{
+	int ret;
+	int fd;
+	int i = 0;
+	int subunshare = 0;
+
+#ifndef NOUTS
+	ret = unshare(CLONE_NEWUTS);
+	if (ret) {
+		perror("unshare");
+		return 1;
+	}
+#endif
+
+	/* Pass '-u' to test nested namespace */
+	if ((argc == 2) && (strcmp(argv[1], "-u") == 0))
+		subunshare = 1;
+
+	fd = open(OUTFILE, O_RDWR | O_CREAT | O_TRUNC, 0666);
+	if (fd < 0) {
+		perror(OUTFILE);
+		return 1;
+	}
+
+	dup2(fd, 1);
+	dup2(fd, 2);
+	close(0);
+
+	setlinebuf(stdout);
+	setlinebuf(stderr);
+
+	if (fork() == 0)
+		child(fd, subunshare);
+
+	while (1) {
+#ifndef NOUTS
+		char hostname[256];
+
+		snprintf(hostname, sizeof(hostname)-1, "test%i", i++);
+		ret = sethostname(hostname, strlen(hostname));
+		if (ret) {
+			perror("sethostname");
+			return 1;
+		}
+
+		printf("Hostname in parent is: %s\n", hostname);
+#endif
+		do_checkpoint();
+		sleep(1);
+	}
+}
-- 
1.5.6.3



More information about the Containers mailing list