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@xxxxxxxxxx> --- 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 _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers