X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmain.c;h=5d37f804d0513fa31661d7e2f7e6dd202aaf0575;hb=720ce21d444f6497299c4c99a76fda546b06716a;hp=2c02217d89b27453b4345832b19a43b4999f99f9;hpb=35b8ca3aaf8cb044ad76675dfcad89e000dd4a5c;p=elogind.git diff --git a/src/main.c b/src/main.c index 2c02217d8..5d37f804d 100644 --- a/src/main.c +++ b/src/main.c @@ -41,6 +41,7 @@ #include "kmod-setup.h" #include "locale-setup.h" #include "selinux-setup.h" +#include "machine-id-setup.h" #include "load-fragment.h" #include "fdset.h" #include "special.h" @@ -225,6 +226,8 @@ static int parse_proc_cmdline_word(const char *word) { static const char * const rlmap[] = { "emergency", SPECIAL_EMERGENCY_TARGET, + "-b", SPECIAL_EMERGENCY_TARGET, + "b", SPECIAL_EMERGENCY_TARGET, "single", SPECIAL_RESCUE_TARGET, "-s", SPECIAL_RESCUE_TARGET, "s", SPECIAL_RESCUE_TARGET, @@ -623,7 +626,7 @@ static int parse_argv(int argc, char *argv[]) { assert(argc >= 1); assert(argv); - while ((c = getopt_long(argc, argv, "hD", options, NULL)) >= 0) + while ((c = getopt_long(argc, argv, "hDbsz:", options, NULL)) >= 0) switch (c) { @@ -799,19 +802,29 @@ static int parse_argv(int argc, char *argv[]) { log_set_max_level(LOG_DEBUG); break; - case '?': - return -EINVAL; + case 'b': + case 's': + case 'z': + /* Just to eat away the sysvinit kernel + * cmdline args without getopt() error + * messages that we'll parse in + * parse_proc_cmdline_word() or ignore. */ + case '?': default: - log_error("Unknown option code %c", c); - return -EINVAL; + if (getpid() != 1) { + log_error("Unknown option code %c", c); + return -EINVAL; + } + + break; } /* PID 1 will get the kernel arguments as parameters, which we * ignore and unconditionally read from * /proc/cmdline. However, we need to ignore those arguments * here. */ - if (arg_running_as != MANAGER_SYSTEM && optind < argc) { + if (getpid() != 1 && optind < argc) { log_error("Excess arguments."); return -EINVAL; } @@ -941,27 +954,13 @@ static void test_mtab(void) { } static void test_usr(void) { - struct stat a, b; - bool seperate = false; - - /* Check that /usr is not a seperate fs */ - - if (lstat("/", &a) >= 0 && lstat("/usr", &b) >= 0) - if (a.st_dev != b.st_dev) - seperate = true; - /* This check won't work usually during boot, since /usr is - * probably not mounted yet, hence let's add a second - * check. We just check whether /usr is an empty directory. */ + /* Check that /usr is not a separate fs */ if (dir_is_empty("/usr") > 0) - seperate = true; - - if (!seperate) - return; - - log_warning("/usr appears to be on a different file system than /. This is not supported anymore. " - "Some things will probably break (sometimes even silently) in mysterious ways."); + log_warning("/usr appears to be on a different file system than /. This is not supported anymore. " + "Some things will probably break (sometimes even silently) in mysterious ways. " + "Consult http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken for more information."); } int main(int argc, char *argv[]) { @@ -1043,6 +1042,13 @@ int main(int argc, char *argv[]) { goto finish; } + if (arg_running_as == MANAGER_SYSTEM && + arg_action == ACTION_RUN && + running_in_chroot() > 0) { + log_error("Cannot be run in a chroot() environment."); + goto finish; + } + /* If Plymouth is being run make sure we show the status, so * that there's something nice to see when people press Esc */ if (access("/dev/.systemd/plymouth", F_OK) >= 0) @@ -1129,10 +1135,9 @@ int main(int argc, char *argv[]) { kmod_setup(); hostname_setup(); + machine_id_setup(); loopback_setup(); - mkdir_p("/dev/.systemd/ask-password/", 0755); - test_mtab(); test_usr(); }