Line 13: |
Line 13: |
| ! <code>newns.c</code> | | ! <code>newns.c</code> |
| |- | | |- |
− | | <syntaxhighlight lang="c"> | + | | {{:VNC/newns.c}} |
− | #define _GNU_SOURCE
| |
− | #include <stdio.h>
| |
− | #include <stdlib.h>
| |
− | #include <unistd.h>
| |
− | #include <string.h>
| |
− | #include <errno.h>
| |
− | #include <sys/mount.h>
| |
− | #include <sys/types.h>
| |
− | #include <sys/stat.h>
| |
− | #include <sys/wait.h>
| |
− | #include <sys/param.h>
| |
− | #include <sys/mman.h>
| |
− | #include <fcntl.h>
| |
− | #include <signal.h>
| |
− | #include <sched.h>
| |
− | | |
− | #define STACK_SIZE (8 * 4096)
| |
− | | |
− | static int ac;
| |
− | static char **av;
| |
− | static int ns_exec(void *_arg)
| |
− | {
| |
− | int fd;
| |
− | | |
− | fd = open("newns.log", O_CREAT | O_TRUNC | O_RDWR | O_APPEND, 0600);
| |
− | if (fd >= 0) {
| |
− | close(0);
| |
− | dup2(fd, 1);
| |
− | dup2(fd, 2);
| |
− | close(fd);
| |
− | }
| |
− | | |
− | setsid();
| |
− | execvp(av[1], av + 1);
| |
− | return 1;
| |
− | } | |
− | | |
− | int main(int argc, char **argv)
| |
− | {
| |
− | void *stack;
| |
− | int ret;
| |
− | pid_t pid;
| |
− | | |
− | ac = argc;
| |
− | av = argv;
| |
− | | |
− | stack = mmap(NULL, STACK_SIZE, PROT_WRITE | PROT_READ,
| |
− | MAP_PRIVATE | MAP_GROWSDOWN | MAP_ANONYMOUS, -1, 0);
| |
− | if (stack == MAP_FAILED) {
| |
− | fprintf(stderr, "Can't map stack %m\n");
| |
− | exit(1);
| |
− | }
| |
− | pid = clone(ns_exec, stack + STACK_SIZE,
| |
− | CLONE_NEWPID | CLONE_NEWIPC | SIGCHLD, NULL);
| |
− | if (pid < 0) {
| |
− | fprintf(stderr, "clone() failed: %m\n");
| |
− | exit(1);
| |
− | }
| |
− | return 0;
| |
− | }
| |
− | </syntaxhighlight>
| |
| |} | | |} |
| | | |