int vsf_sysutil_fork_newnet() { #ifdef VSF_SYSDEP_HAVE_LINUX_CLONE static int cloneflags_work = -1; if (cloneflags_work < 0) { cloneflags_work = vsf_sysutil_netns_cleanup_is_fast(); } if (cloneflags_work) { int ret = syscall(__NR_clone, CLONE_NEWNET | SIGCHLD, NULL); if (ret != -1 || (errno != EINVAL && errno != EPERM)) { if (ret == 0) { vsf_sysutil_post_fork(); } return ret; } cloneflags_work = 0; } #endif return vsf_sysutil_fork(); }
int vsf_sysutil_fork_isolate_failok() { #ifdef VSF_SYSDEP_HAVE_LINUX_CLONE static int cloneflags_work = 1; if (cloneflags_work) { int ret = syscall(__NR_clone, CLONE_NEWPID | CLONE_NEWIPC | SIGCHLD, NULL); if (ret != -1 || (errno != EINVAL && errno != EPERM)) { if (ret == 0) { vsf_sysutil_post_fork(); } return ret; } cloneflags_work = 0; } #endif return vsf_sysutil_fork_failok(); }