/* Process options */ int run_parts_main(int argc, char **argv) { char **args = xmalloc(2 * sizeof(char *)); unsigned char test_mode = 0; unsigned short argcount = 1; int opt; umask(022); while ((opt = getopt_long (argc, argv, "tu:a:", runparts_long_options, NULL)) > 0) { switch (opt) { /* Enable test mode */ case 't': test_mode++; break; /* Set the umask of the programs executed */ case 'u': /* Check and set the umask of the program executed. As stated in the original * run-parts, the octal conversion in libc is not foolproof; it will take the * 8 and 9 digits under some circumstances. We'll just have to live with it. */ umask(bb_xgetlarg(optarg, 8, 0, 07777)); break; /* Pass an argument to the programs */ case 'a': /* Add an argument to the commands that we will call. * Called once for every argument. */ args = xrealloc(args, (argcount + 2) * (sizeof(char *))); args[argcount++] = optarg; break; default: bb_show_usage(); } } /* We require exactly one argument: the directory name */ if (optind != (argc - 1)) { bb_show_usage(); } args[0] = argv[optind]; args[argcount] = 0; return(run_parts(args, test_mode, environ)); }
/* * Handle bootstrap transition to configured runlevel, start TTYs * * This is the final stage of bootstrap. It changes to the default * (configured) runlevel, calls all external start scripts and final * bootstrap hooks before bringing up TTYs. * * We must ensure that all declared `task [S]` and `run [S]` jobs in * finit.conf, or *.conf in finit.d/, run to completion before we * finalize the bootstrap process by calling this function. */ static void finalize(void) { /* * Run startup scripts in the runparts directory, if any. */ if (runparts && fisdir(runparts) && !rescue) run_parts(runparts, NULL); /* * Start all tasks/services in the configured runlevel */ _d("Change to default runlevel, start all services ..."); service_runlevel(cfglevel); /* Clean up bootstrap-only tasks/services that never started */ _d("Clean up all bootstrap-only tasks/services ..."); svc_prune_bootstrap(); /* All services/tasks/inetd/etc. in configure runlevel have started */ _d("Running svc up hooks ..."); plugin_run_hooks(HOOK_SVC_UP); service_step_all(SVC_TYPE_ANY); /* Convenient SysV compat for when you just don't care ... */ if (!access(FINIT_RC_LOCAL, X_OK) && !rescue) run_interactive(FINIT_RC_LOCAL, "Calling %s", FINIT_RC_LOCAL); /* Hooks that should run at the very end */ _d("Calling all system up hooks ..."); plugin_run_hooks(HOOK_SYSTEM_UP); service_step_all(SVC_TYPE_ANY); /* Enable silent mode before starting TTYs */ _d("Going silent ..."); log_silent(); /* Delayed start of TTYs at bootstrap */ _d("Launching all getty services ..."); tty_runlevel(); }
static void setup(void *UNUSED(arg)) { #ifdef USE_ETC_RESOLVCONF_RUN DIR *dir; struct dirent *d; #endif _d("Setting up the resolver ..."); #ifdef USE_ETC_RESOLVCONF_RUN makepath("/dev/shm/network"); makepath("/dev/shm/resolvconf/interface"); if ((dir = opendir("/etc/resolvconf/run/interface")) != NULL) { while ((d = readdir(dir)) != NULL) { if (isalnum(d->d_name[0])) continue; snprintf(line, sizeof(line), "/etc/resolvconf/run/interface/%s", d->d_name); unlink(line); } closedir(dir); } #endif #ifdef USE_VAR_RUN_RESOLVCONF makepath("/var/run/resolvconf/interface"); symlink("../../../etc/resolv.conf", "/var/run/resolvconf/resolv.conf"); #endif #ifdef USE_ETC_RESOLVCONF_RUN touch("/etc/resolvconf/run/enable-updates"); chdir("/etc/resolvconf/run/interface"); run_parts("/etc/resolvconf/update.d", "-i", NULL); chdir("/"); #endif /* USE_ETC_RESOLVCONF_RUN */ }
int main(int argc, char* argv[]) { if (getpid() != 1) return client(argc, argv); /* * Hello world. */ banner(); /* * Initial setup of signals, ignore all until we're up. */ sig_init(); /* * Mount base file system, kernel is assumed to run devtmpfs for /dev */ chdir("/"); umask(0); mount("none", "/proc", "proc", 0, NULL); mount("none", "/proc/bus/usb", "usbfs", 0, NULL); mount("none", "/sys", "sysfs", 0, NULL); mkdir("/dev/pts", 0755); mkdir("/dev/shm", 0755); mount("none", "/dev/pts", "devpts", 0, "gid=5,mode=620"); mount("none", "/dev/shm", "tmpfs", 0, NULL); umask(022); /* * Parse kernel parameters */ parse_kernel_cmdline(); /* * Populate /dev and prepare for runtime events from kernel. */ run_interactive(SETUP_DEVFS, "Populating device tree"); /* * Parse configuration file */ parse_finit_conf(FINIT_CONF); /* * Load plugins. Must run after finit.conf has registered * all services, or service plugins won't have anything to * hook on to. */ print_desc("Loading plugins", NULL); print_result(plugin_load_all(PLUGIN_PATH)); /* * Mount filesystems */ #ifdef REMOUNT_ROOTFS_RW run("/bin/mount -n -o remount,rw /"); #endif #ifdef SYSROOT run(SYSROOT, "/", NULL, MS_MOVE, NULL); #endif _d("Root FS up, calling hooks ..."); plugin_run_hooks(HOOK_ROOTFS_UP); umask(0); run("/bin/mount -na"); run("/sbin/swapon -ea"); umask(0022); /* Cleanup stale files, if any still linger on. */ run_interactive("rm -rf /tmp/* /var/run/* /var/lock/*", "Cleanup temporary directories"); /* Base FS up, enable standard SysV init signals */ sig_setup(); _d("Base FS up, calling hooks ..."); plugin_run_hooks(HOOK_BASEFS_UP); /* * Start all bootstrap tasks, no network available! */ svc_bootstrap(); /* * Network stuff */ /* Setup kernel specific settings, e.g. allow broadcast ping, etc. */ run("/sbin/sysctl -e -p /etc/sysctl.conf >/dev/null"); /* Set initial hostname. */ set_hostname(hostname); ifconfig("lo", "127.0.0.1", "255.0.0.0", 1); if (network) run_interactive(network, "Starting networking: %s", network); umask(022); /* Hooks that rely on loopback, or basic networking being up. */ plugin_run_hooks(HOOK_NETWORK_UP); /* * Start all tasks/services in the configured runlevel */ svc_runlevel(cfglevel); _d("Running svc up hooks ..."); plugin_run_hooks(HOOK_SVC_UP); /* * Run startup scripts in /etc/finit.d/, if any. */ if (rcsd && fisdir(rcsd)) { _d("Running startup scripts in %s ...", rcsd); run_parts(rcsd, NULL); } /* Hooks that should run at the very end */ plugin_run_hooks(HOOK_SYSTEM_UP); /* * Enter main loop to monior /dev/initctl and services */ return run_loop(); }
int main(int UNUSED(args), char *argv[]) { /* * Initial setup of signals, ignore all until we're up. */ sig_init(); /* * Mount base file system, kernel is assumed to run devtmpfs for /dev */ chdir("/"); umask(0); mount("none", "/proc", "proc", 0, NULL); mount("none", "/proc/bus/usb", "usbfs", 0, NULL); mount("none", "/sys", "sysfs", 0, NULL); mkdir("/dev/pts", 0755); mkdir("/dev/shm", 0755); mount("none", "/dev/pts", "devpts", 0, "gid=5,mode=620"); mount("none", "/dev/shm", "tmpfs", 0, NULL); umask(022); /* * Parse kernel parameters */ parse_kernel_cmdline(); cls(); echo("finit " VERSION " (built " __DATE__ " " __TIME__ " by " WHOAMI ")"); /* * Populate /dev and prepare for runtime events from kernel. */ #if defined(USE_UDEV) run_interactive("udevd --daemon", "Populating device tree"); #elif defined (MDEV) run_interactive(MDEV " -s", "Populating device tree"); #endif /* * Parse configuration file */ parse_finit_conf(FINIT_CONF); /* * Load plugins. Must run after finit.conf has registered * all services, or service plugins won't have anything to * hook on to. */ print_desc("", "Loading plugins"); print_result(plugin_load_all(PLUGIN_PATH)); /* * Mount filesystems */ _d("Mount filesystems in /etc/fstab ..."); #ifdef REMOUNT_ROOTFS_RW run("/bin/mount -n -o remount,rw /"); #endif #ifdef SYSROOT run(SYSROOT, "/", NULL, MS_MOVE, NULL); #endif _d("Root FS up, calling hooks ..."); plugin_run_hooks(HOOK_ROOTFS_UP); umask(0); run("/bin/mount -na"); run("/sbin/swapon -ea"); umask(0022); /* Cleanup stale files, if any still linger on. */ run_interactive("rm -rf /tmp/* /var/run/* /var/lock/*", "Cleanup temporary directories"); /* * Base FS up, enable standard SysV init signals */ sig_setup(); _d("Base FS up, calling hooks ..."); plugin_run_hooks(HOOK_BASEFS_UP); /* * Network stuff */ /* Setup kernel specific settings, e.g. allow broadcast ping, etc. */ run("/sbin/sysctl -e -p /etc/sysctl.conf >/dev/null"); /* Set initial hostname. */ set_hostname(hostname); ifconfig("lo", "127.0.0.1", "255.0.0.0", 1); if (network) run_interactive(network, "Starting networking: %s", network); umask(022); /* * Hooks that rely on loopback, or basic networking being up. */ plugin_run_hooks(HOOK_NETWORK_UP); /* * Start service monitor framework */ _d("Starting all static services from %s", FINIT_CONF); svc_start_all(); /* * Run startup scripts in /etc/finit.d/, if any. */ if (rcsd && fisdir(rcsd)) { _d("Running startup scripts in %s ...", rcsd); run_parts(rcsd, NULL); } /* * Hooks that should run at the very end */ plugin_run_hooks(HOOK_SYSTEM_UP); /* Start GETTY on console */ _d("Starting getty on console ..."); run_getty(GETTY, argv); /* * Enter main loop to monior /dev/initctl and services */ _d("Entering main loop ..."); return run_loop(); }
/* Process options */ int main(int argc, char *argv[]) { umask(022); add_argument(0); for (;;) { int c; int option_index = 0; static struct option long_options[] = { {"test", 0, &test_mode, 1}, {"list", 0, &list_mode, 1}, {"verbose", 0, 0, 'v'}, {"report", 0, &report_mode, 1}, {"reverse", 0, &reverse_mode, 1}, {"umask", 1, 0, 'u'}, {"arg", 1, 0, 'a'}, {"help", 0, 0, 'h'}, {"version", 0, 0, 'V'}, {"lsbsysinit", 0, &lsbsysinit_mode, 1}, {"exit-on-error", 0, &exit_on_error_mode, 1}, {0, 0, 0, 0} }; c = getopt_long(argc, argv, "u:ha:vV", long_options, &option_index); if (c == EOF) break; switch (c) { case 0: break; case 'u': set_umask(); break; case 'a': add_argument(optarg); break; case 'h': usage(); break; case 'v': verbose_mode = 1; break; case 'V': version(); break; default: fprintf(stderr, "Try `run-parts --help' for more information.\n"); exit(1); } } /* We require exactly one argument: the directory name */ if (optind != (argc - 1)) { error("missing operand"); fprintf(stderr, "Try run-parts --help' for more information.\n"); exit(1); } if (list_mode && test_mode) { error("--list and --test can not be used together"); fprintf(stderr, "Try run-parts --help' for more information.\n"); exit(1); } run_parts(argv[optind]); return exitstatus; }