X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Ffirstboot%2Ffirstboot.c;h=93273d903c7299e040e81e1ac13296e6dd4db6b2;hp=57173a56695b4905f73099af33916738fb4d6e0b;hb=9f03ee51a2207954ef18be79ca3e11cd14ca56fd;hpb=3250929b7049f3fbbb610a92438c8a8b638ec155;ds=sidebyside diff --git a/src/firstboot/firstboot.c b/src/firstboot/firstboot.c index 57173a566..93273d903 100644 --- a/src/firstboot/firstboot.c +++ b/src/firstboot/firstboot.c @@ -68,7 +68,7 @@ static bool press_any_key(void) { printf("-- Press any key to proceed --"); fflush(stdout); - read_one_char(stdin, &k, (usec_t) -1, &need_nl); + (void) read_one_char(stdin, &k, USEC_INFINITY, &need_nl); if (need_nl) putchar('\n'); @@ -451,9 +451,6 @@ static int process_machine_id(void) { if (faccessat(AT_FDCWD, etc_machine_id, F_OK, AT_SYMLINK_NOFOLLOW) >= 0) return 0; - if (!arg_root) - return 0; - if (sd_id128_equal(arg_machine_id, SD_ID128_NULL)) return 0; @@ -491,7 +488,7 @@ static int prompt_root_password(void) { for (;;) { _cleanup_free_ char *a = NULL, *b = NULL; - r = ask_password_tty(msg1, 0, NULL, &a); + r = ask_password_tty(msg1, 0, false, NULL, &a); if (r < 0) { log_error("Failed to query root password: %s", strerror(-r)); return r; @@ -502,7 +499,7 @@ static int prompt_root_password(void) { break; } - r = ask_password_tty(msg2, 0, NULL, &b); + r = ask_password_tty(msg2, 0, false, NULL, &b); if (r < 0) { log_error("Failed to query root password: %s", strerror(-r)); clear_string(a); @@ -530,7 +527,6 @@ static int write_root_shadow(const char *path, const struct spwd *p) { assert(path); assert(p); - mkdir_parents(path, 0755); RUN_WITH_UMASK(0777) f = fopen(path, "wex"); if (!f) @@ -560,6 +556,8 @@ static int process_root_password(void) { .sp_expire = -1, .sp_flag = (unsigned long) -1, /* this appears to be what everybody does ... */ }; + + _cleanup_close_ int lock = -1; char salt[3+16+1+1]; uint8_t raw[16]; unsigned i; @@ -572,6 +570,12 @@ static int process_root_password(void) { if (faccessat(AT_FDCWD, etc_shadow, F_OK, AT_SYMLINK_NOFOLLOW) >= 0) return 0; + mkdir_parents(etc_shadow, 0755); + + lock = take_password_lock(arg_root); + if (lock < 0) + return lock; + if (arg_copy_root_password && arg_root) { struct spwd *p; @@ -640,8 +644,7 @@ static int process_root_password(void) { return 0; } -static int help(void) { - +static void help(void) { printf("%s [OPTIONS...]\n\n" "Configures basic settings of the system.\n\n" " -h --help Show this help\n" @@ -663,10 +666,8 @@ static int help(void) { " --copy-timezone Copy timezone from host\n" " --copy-root-password Copy root password from host\n" " --copy Copy locale, timezone, root password\n" - " --setup-machine-id Generate a new random machine ID\n", - program_invocation_short_name); - - return 0; + " --setup-machine-id Generate a new random machine ID\n" + , program_invocation_short_name); } static int parse_argv(int argc, char *argv[]) { @@ -722,12 +723,13 @@ static int parse_argv(int argc, char *argv[]) { assert(argc >= 0); assert(argv); - while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0) switch (c) { case 'h': - return help(); + help(); + return 0; case ARG_VERSION: puts(PACKAGE_STRING); @@ -851,6 +853,7 @@ static int parse_argv(int argc, char *argv[]) { case ARG_COPY: arg_copy_locale = arg_copy_timezone = arg_copy_root_password = true; + break; case ARG_COPY_LOCALE: arg_copy_locale = true; @@ -880,7 +883,6 @@ static int parse_argv(int argc, char *argv[]) { default: assert_not_reached("Unhandled option"); } - } return 1; }