| 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>
| |
| | |} | | |} |
| | | | |