int start_stop_daemon_main(int argc, char **argv) { unsigned long opt; char *signame = NULL; char *startas = NULL; bb_applet_long_options = ssd_long_options; bb_opt_complementaly = "K~S:S~K"; opt = bb_getopt_ulflags(argc, argv, "KSba:n:s:u:x:", &startas, &cmdname, &signame, &userspec, &execname); /* Check one and only one context option was given */ if ((opt & 0x80000000UL) || (opt & (SSD_CTX_STOP | SSD_CTX_START)) == 0) { bb_show_usage(); } if (signame) { signal_nr = bb_xgetlarg(signame, 10, 0, NSIG); } if (!execname && !userspec) bb_error_msg_and_die ("need at least one of -x or -u"); if (!startas) startas = execname; if ((opt & SSD_CTX_START) && !startas) bb_error_msg_and_die ("-S needs -x or -a"); argc -= optind; argv += optind; if (userspec && sscanf(userspec, "%d", &user_id) != 1) user_id = my_getpwnam(userspec); do_procfs(); if (opt & SSD_CTX_STOP) { do_stop(); return EXIT_SUCCESS; } if (found) { printf("%s already running.\n%d\n", execname ,found->pid); return EXIT_SUCCESS; } *--argv = startas; if (opt & SSD_OPT_BACKGROUND) { if (daemon(0, 0) == -1) bb_perror_msg_and_die ("unable to fork"); } setsid(); execv(startas, argv); bb_perror_msg_and_die ("unable to start %s", startas); }
int start_stop_daemon_main(int argc, char **argv) { int flags; char *signame = NULL; bb_applet_long_options = ssd_long_options; flags = bb_getopt_ulflags(argc, argv, "KSba:n:s:u:x:", &startas, &cmdname, &signame, &userspec, &execname); /* Be sneaky and avoid branching */ stop = (flags & 1); start = (flags & 2); fork_before_exec = (flags & 4); if (signame) { signal_nr = bb_xgetlarg(signame, 10, 0, NSIG); } if (start == stop) bb_error_msg_and_die ("need exactly one of -S or -K"); if (!execname && !userspec) bb_error_msg_and_die ("need at least one of -x or -u"); if (!startas) startas = execname; if (start && !startas) bb_error_msg_and_die ("-S needs -x or -a"); argc -= optind; argv += optind; if (userspec && sscanf(userspec, "%d", &user_id) != 1) user_id = my_getpwnam(userspec); do_procfs(); if (stop) { do_stop(); return EXIT_SUCCESS; } if (found) { printf("%s already running.\n%d\n", execname ,found->pid); return EXIT_SUCCESS; } *--argv = startas; if (fork_before_exec) { if (daemon(0, 0) == -1) bb_perror_msg_and_die ("unable to fork"); } setsid(); execv(startas, argv); bb_perror_msg_and_die ("unable to start %s", startas); }