int daemon_start(int argc, char **argv){ if(!myconfig_get_intval("foreground", 0)) { printf("Switching to background\n"); if(getppid() != 1) daemon(1, 1); } struct sigaction sa; sigset_t sset; memset(&sa, 0, sizeof(sa)); sa.sa_handler = sigterm_handler; sigaction(SIGINT, &sa, NULL); sigaction(SIGTERM, &sa, NULL); sigaction(SIGQUIT, &sa, NULL); sa.sa_handler = nop_handler; sigaction(SIGIO, &sa, NULL); sigaction(SIGALRM, &sa, NULL); sa.sa_handler = sighup_handler; sigaction(SIGHUP, &sa, NULL); sa.sa_handler = reload_handler; sigaction(SIGUSR1, &sa, NULL); signal(SIGPIPE, SIG_IGN); signal(SIGXFSZ, SIG_IGN); signal(SIGCHLD, SIG_DFL); sigemptyset(&sset); sigaddset(&sset, SIGSEGV); sigaddset(&sset, SIGBUS); sigaddset(&sset, SIGABRT); sigaddset(&sset, SIGILL); sigaddset(&sset, SIGCHLD); sigaddset(&sset, SIGFPE); sigaddset(&sset, SIGHUP); sigaddset(&sset, SIGTERM); sigaddset(&sset, SIGINT); sigaddset(&sset, SIGQUIT); sigprocmask(SIG_UNBLOCK, &sset, &sset); arg_start = argv[0]; arg_end = argv[argc - 1] + strlen(argv[argc - 1]) + 1; env_start = environ[0]; dup_argv(argc, argv); if(progname == NULL || saved_argv == NULL) { printf("can't resolve executable path, restart not support\n"); signal(SIGHUP, sigterm_handler); } return 0; }
errno_t uu_proc_setargs( int pid, const char **av, const char **env ) { errno_t r = 0; hal_mutex_lock(&proc_lock); uuprocess_t * u = proc_by_pid(pid); if( u ) { if(u->argv) free_argv(u->argv); if(u->envp) free_argv(u->envp); u->argv = dup_argv( &u->argc, av, 0 ); u->envp = dup_argv( 0, env, 0 ); flatten_argv( u->cmd, MAX_UU_CMD, u->argv ); } else r = ESRCH; hal_mutex_unlock(&proc_lock); return r; }
int daemon_start (int argc, char** argv) { struct sigaction sa; sigset_t sset; const char *style; rlimit_reset (); memset(&sa, 0, sizeof(sa)); sa.sa_handler = sigterm_handler; sigaction(SIGINT, &sa, NULL); sigaction(SIGTERM, &sa, NULL); sigaction(SIGQUIT, &sa, NULL); sa.sa_handler = sighup_handler; sigaction(SIGHUP, &sa, NULL); signal(SIGPIPE,SIG_IGN); signal(SIGCHLD,SIG_IGN); sigemptyset(&sset); sigaddset(&sset, SIGSEGV); sigaddset(&sset, SIGBUS); sigaddset(&sset, SIGABRT); sigaddset(&sset, SIGILL); sigaddset(&sset, SIGCHLD); sigaddset(&sset, SIGFPE); sigprocmask(SIG_UNBLOCK, &sset, &sset); arg_start = argv[0]; arg_end = argv[argc-1] + strlen (argv[argc - 1]) + 1; env_start = environ[0]; dup_argv(argc, argv); style = config_get_strval ("run_mode"); if (!style || !strcasecmp ("background", style)) { daemon (1, 1); backgd_mode = 1; BOOT_LOG (0, "switch to daemon mode"); } return 0; }