int ns_exec(void *_arg) { struct ns_exec_args *args = (struct ns_exec_args *) _arg; int ret; close(args->status_pipe[0]); setsid(); system("ip link set up dev lo"); ret = dup2(args->status_pipe[1], STATUS_FD); if (ret < 0) { fprintf(stderr, "dup2() failed: %m\n"); return -1; } close(args->status_pipe[1]); if (prepare_mntns()) return -1; setenv("ZDTM_NEWNS", "2", 1); execvp(args->argv[0], args->argv); fprintf(stderr, "exec(%s) failed: %m\n", args->argv[0]); return -1; }
static int prepare_namespaces(void) { if (setuid(0) || setgid(0) || setgroups(0, NULL)) { fprintf(stderr, "set*id failed: %m\n"); return -1; } system("ip link set up dev lo"); if (prepare_mntns()) return -1; return 0; }
int ns_exec(void *_arg) { struct ns_exec_args *args = (struct ns_exec_args *) _arg; char buf[4096]; int ret; close(args->status_pipe[0]); setsid(); read(args->status_pipe[1], buf, sizeof(buf)); shutdown(args->status_pipe[1], SHUT_RD); if (setuid(0) || setgid(0)) { fprintf(stderr, "set*id failed: %m\n"); return -1; } if (prepare_mntns()) return -1; return 0; }