/* newnamespace.c */ #include #include #include #include #include #include #include typedef struct { char *path; char **argv; } FuncInfo; int childfn(void *p) { FuncInfo *fi = (FuncInfo *)p; /* setenv("PS1", "@@ ", 1); */ execv(fi->path, fi->argv); perror("execl"); fprintf(stderr, "Cannot exec '%s'\n", fi->path); exit(1); } static char *default_path = "/bin/ash"; static char *default_argv[] = {"ash", NULL}; int main(int argc, char *argv[]) { char buf[10000]; pid_t pid, p; FuncInfo fi; if (argc == 1) { /* No arguments given */ fi.path = default_path; fi.argv = default_argv; } else { int i; argc--; argv++; fi.path = *argv; fi.argv = (char **)malloc(sizeof(char *) * (argc + 1)); for (i = 0; i < argc; i++) { fi.argv[i] = argv[i]; } fi.argv[argc] = NULL; } pid = clone(childfn, buf + 5000, CLONE_NEWNS | SIGCHLD, &fi); if ((int) pid == -1) { perror("clone"); exit(1); } p = waitpid(pid, NULL, 0); if ((int) p == -1) { perror("waitpid"); exit(1); } exit(0); }