#ifndef _WIN32
pid_t pid;
int error;
+ sigset_t prev_mask;
assert_single_threaded();
return error;
}
+ fatal_signal_block(&prev_mask);
pid = fork();
if (pid < 0) {
VLOG_WARN("fork failed: %s", ovs_strerror(errno));
- return errno;
+ error = errno;
} else if (pid) {
/* Running in parent process. */
*pp = process_register(argv[0], pid);
- return 0;
+ error = 0;
} else {
/* Running in child process. */
int fd_max = get_max_fds();
for (fd = 3; fd < fd_max; fd++) {
close(fd);
}
+ xpthread_sigmask(SIG_SETMASK, &prev_mask, NULL);
execvp(argv[0], argv);
fprintf(stderr, "execvp(\"%s\") failed: %s\n",
argv[0], ovs_strerror(errno));
_exit(1);
}
+ xpthread_sigmask(SIG_SETMASK, &prev_mask, NULL);
+ return error;
#else
*pp = NULL;
return ENOSYS;