X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fmain.c;h=9cdbf2e896442a7885f5fa75af39970d41984c5e;hp=5c2af042d9a73937ef310fe271532ba43a9dc7e2;hb=41192f6e8af0004c5d736df31c25b849e34e7ac6;hpb=9a34ec5fbb4b55413dc9d610b636fe760d34ecd7 diff --git a/src/main.c b/src/main.c index 5c2af042d..9cdbf2e89 100644 --- a/src/main.c +++ b/src/main.c @@ -45,7 +45,8 @@ static enum { ACTION_RUN, ACTION_HELP, ACTION_TEST, - ACTION_DUMP_CONFIGURATION_ITEMS + ACTION_DUMP_CONFIGURATION_ITEMS, + ACTION_DONE } action = ACTION_RUN; static char *default_unit = NULL; @@ -57,7 +58,7 @@ static int crash_chvt = -1; static bool confirm_spawn = false; static FILE* serialization = NULL; -_noreturn static void freeze(void) { +_noreturn_ static void freeze(void) { for (;;) pause(); } @@ -65,7 +66,7 @@ _noreturn static void freeze(void) { static void nop_handler(int sig) { } -_noreturn static void crash(int sig) { +_noreturn_ static void crash(int sig) { if (!dump_core) log_error("Caught <%s>, not dumping core.", strsignal(sig)); @@ -165,7 +166,7 @@ static void install_crash_handler(void) { sa.sa_handler = crash; sa.sa_flags = SA_NODEFER; - sigaction_many(&sa, SIGNALS_CRASH_HANLDER, -1); + sigaction_many(&sa, SIGNALS_CRASH_HANDLER, -1); } static int make_null_stdio(void) { @@ -232,8 +233,8 @@ static int parse_proc_cmdline_word(const char *word) { "5", SPECIAL_RUNLEVEL5_TARGET }; - if (startswith(word, "systemd.default=")) - return set_default_unit(word + 16); + if (startswith(word, "systemd.unit=")) + return set_default_unit(word + 13); else if (startswith(word, "systemd.log_target=")) { @@ -283,7 +284,7 @@ static int parse_proc_cmdline_word(const char *word) { log_warning("Unknown kernel switch %s. Ignoring.", word); log_info("Supported kernel switches:"); - log_info("systemd.default=UNIT Default unit to start"); + log_info("systemd.unit=UNIT Default unit to start"); log_info("systemd.log_target=console|kmsg|syslog Log target"); log_info("systemd.log_level=LEVEL Log level"); log_info("systemd.dump_core=0|1 Dump core on crash"); @@ -342,24 +343,26 @@ static int parse_argv(int argc, char *argv[]) { enum { ARG_LOG_LEVEL = 0x100, ARG_LOG_TARGET, - ARG_DEFAULT, + ARG_UNIT, ARG_RUNNING_AS, ARG_TEST, ARG_DUMP_CONFIGURATION_ITEMS, ARG_CONFIRM_SPAWN, - ARG_DESERIALIZE + ARG_DESERIALIZE, + ARG_INTROSPECT }; static const struct option options[] = { { "log-level", required_argument, NULL, ARG_LOG_LEVEL }, { "log-target", required_argument, NULL, ARG_LOG_TARGET }, - { "default", required_argument, NULL, ARG_DEFAULT }, + { "unit", required_argument, NULL, ARG_UNIT }, { "running-as", required_argument, NULL, ARG_RUNNING_AS }, { "test", no_argument, NULL, ARG_TEST }, { "help", no_argument, NULL, 'h' }, { "dump-configuration-items", no_argument, NULL, ARG_DUMP_CONFIGURATION_ITEMS }, { "confirm-spawn", no_argument, NULL, ARG_CONFIRM_SPAWN }, { "deserialize", required_argument, NULL, ARG_DESERIALIZE }, + { "introspect", optional_argument, NULL, ARG_INTROSPECT }, { NULL, 0, NULL, 0 } }; @@ -389,7 +392,7 @@ static int parse_argv(int argc, char *argv[]) { break; - case ARG_DEFAULT: + case ARG_UNIT: if ((r = set_default_unit(optarg)) < 0) { log_error("Failed to set default unit %s: %s", optarg, strerror(-r)); @@ -444,6 +447,27 @@ static int parse_argv(int argc, char *argv[]) { break; } + case ARG_INTROSPECT: { + const char * const * i = NULL; + + for (i = bus_interface_table; *i; i += 2) + if (!optarg || streq(i[0], optarg)) { + fputs(DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE + "\n", stdout); + fputs(i[1], stdout); + fputs("\n", stdout); + + if (optarg) + break; + } + + if (!i[0] && optarg) + log_error("Unknown interface %s.", optarg); + + action = ACTION_DONE; + break; + } + case 'h': action = ACTION_HELP; break; @@ -472,13 +496,14 @@ static int help(void) { printf("%s [options]\n\n" " -h --help Show this help\n" - " --default=UNIT Set default unit\n" + " --unit=UNIT Set default unit\n" " --log-level=LEVEL Set log level\n" " --log-target=TARGET Set log target (console, syslog, kmsg, syslog-or-kmsg)\n" " --running-as=AS Set running as (init, system, session)\n" " --test Determine startup sequence, dump it and exit\n" " --dump-configuration-items Dump understood unit configuration items\n" - " --confirm-spawn Ask for confirmation when spawning processes\n", + " --confirm-spawn Ask for confirmation when spawning processes\n" + " --introspect[=INTERFACE] Extract D-Bus interface data\n", __progname); return 0; @@ -557,8 +582,9 @@ int main(int argc, char *argv[]) { /* Mount /proc, /sys and friends, so that /proc/cmdline and * /proc/$PID/fd is available. */ - if (mount_setup() < 0) - goto finish; + if (geteuid() == 0) + if (mount_setup() < 0) + goto finish; /* Reset all signal handlers. */ assert_se(reset_all_signal_handlers() == 0); @@ -582,6 +608,9 @@ int main(int argc, char *argv[]) { unit_dump_config_items(stdout); retval = 0; goto finish; + } else if (action == ACTION_DONE) { + retval = 0; + goto finish; } assert_se(action == ACTION_RUN || action == ACTION_TEST);