X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ffirstboot%2Ffirstboot.c;h=1f11a2aec6cc5b52f701b4c34baa89d6d4edf98c;hb=0a1beeb64207eaa88ab9236787b1cbc2f704ae14;hp=56893d0e37031f5db0670b561fdbf11524d3cace;hpb=418b9be50018303cde79b423d4701b7fd86ddbdc;p=elogind.git diff --git a/src/firstboot/firstboot.c b/src/firstboot/firstboot.c index 56893d0e3..1f11a2aec 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'); @@ -98,7 +98,7 @@ static void print_welcome(void) { } if (r < 0 && r != -ENOENT) - log_warning("Failed to read os-release file: %s", strerror(-r)); + log_warning_errno(-r, "Failed to read os-release file: %m"); printf("\nWelcome to your new installation of %s!\nPlease configure a few basic system settings:\n\n", isempty(pretty_name) ? "Linux" : pretty_name); @@ -167,7 +167,7 @@ static int prompt_loop(const char *text, char **l, bool (*is_valid)(const char * r = ask_string(&p, "%s %s (empty to skip): ", draw_special_char(DRAW_TRIANGULAR_BULLET), text); if (r < 0) { - log_error("Failed to query user: %s", strerror(-r)); + log_error_errno(-r, "Failed to query user: %m"); return r; } @@ -220,7 +220,7 @@ static int prompt_locale(void) { r = get_locales(&locales); if (r < 0) { - log_error("Cannot query locales list: %s", strerror(-r)); + log_error_errno(-r, "Cannot query locales list: %m"); return r; } @@ -263,7 +263,7 @@ static int process_locale(void) { r = copy_file("/etc/locale.conf", etc_localeconf, 0, 0644); if (r != -ENOENT) { if (r < 0) { - log_error("Failed to copy %s: %s", etc_localeconf, strerror(-r)); + log_error_errno(-r, "Failed to copy %s: %m", etc_localeconf); return r; } @@ -289,7 +289,7 @@ static int process_locale(void) { mkdir_parents(etc_localeconf, 0755); r = write_env_file(etc_localeconf, locales); if (r < 0) { - log_error("Failed to write %s: %s", etc_localeconf, strerror(-r)); + log_error_errno(-r, "Failed to write %s: %m", etc_localeconf); return r; } @@ -309,7 +309,7 @@ static int prompt_timezone(void) { r = get_timezones(&zones); if (r < 0) { - log_error("Cannot query timezone list: %s", strerror(-r)); + log_error_errno(-r, "Cannot query timezone list: %m"); return r; } @@ -343,7 +343,7 @@ static int process_timezone(void) { r = readlink_malloc("/etc/localtime", &p); if (r != -ENOENT) { if (r < 0) { - log_error("Failed to read host timezone: %s", strerror(-r)); + log_error_errno(-r, "Failed to read host timezone: %m"); return r; } @@ -394,7 +394,7 @@ static int prompt_hostname(void) { r = ask_string(&h, "%s Please enter hostname for new system (empty to skip): ", draw_special_char(DRAW_TRIANGULAR_BULLET)); if (r < 0) { - log_error("Failed to query hostname: %s", strerror(-r)); + log_error_errno(-r, "Failed to query hostname: %m"); return r; } @@ -434,7 +434,7 @@ static int process_hostname(void) { mkdir_parents(etc_hostname, 0755); r = write_string_file(etc_hostname, arg_hostname); if (r < 0) { - log_error("Failed to write %s: %s", etc_hostname, strerror(-r)); + log_error_errno(-r, "Failed to write %s: %m", etc_hostname); return r; } @@ -451,16 +451,13 @@ 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; mkdir_parents(etc_machine_id, 0755); r = write_string_file(etc_machine_id, sd_id128_to_string(arg_machine_id, id)); if (r < 0) { - log_error("Failed to write machine id: %s", strerror(-r)); + log_error_errno(-r, "Failed to write machine id: %m"); return r; } @@ -491,9 +488,9 @@ 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)); + log_error_errno(-r, "Failed to query root password: %m"); return r; } @@ -502,9 +499,9 @@ 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)); + log_error_errno(-r, "Failed to query root password: %m"); clear_string(a); return r; } @@ -530,8 +527,8 @@ static int write_root_shadow(const char *path, const struct spwd *p) { assert(path); assert(p); - mkdir_parents(path, 0755); - f = fopen(path, "wex"); + RUN_WITH_UMASK(0777) + f = fopen(path, "wex"); if (!f) return -errno; @@ -559,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; @@ -571,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; @@ -587,7 +592,7 @@ static int process_root_password(void) { r = write_root_shadow(etc_shadow, p); if (r < 0) { - log_error("Failed to write %s: %s", etc_shadow, strerror(-r)); + log_error_errno(-r, "Failed to write %s: %m", etc_shadow); return r; } @@ -605,7 +610,7 @@ static int process_root_password(void) { r = dev_urandom(raw, 16); if (r < 0) { - log_error("Failed to get salt: %s", strerror(-r)); + log_error_errno(-r, "Failed to get salt: %m"); return r; } @@ -631,7 +636,7 @@ static int process_root_password(void) { r = write_root_shadow(etc_shadow, &item); if (r < 0) { - log_error("Failed to write %s: %s", etc_shadow, strerror(-r)); + log_error_errno(-r, "Failed to write %s: %m", etc_shadow); return r; } @@ -639,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" @@ -662,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[]) { @@ -721,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); @@ -801,7 +804,7 @@ static int parse_argv(int argc, char *argv[]) { r = read_one_line_file(optarg, &arg_root_password); if (r < 0) { - log_error("Failed to read %s: %s", optarg, strerror(-r)); + log_error_errno(-r, "Failed to read %s: %m", optarg); return r; } @@ -850,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; @@ -867,7 +871,7 @@ static int parse_argv(int argc, char *argv[]) { r = sd_id128_randomize(&arg_machine_id); if (r < 0) { - log_error("Failed to generate randomized machine ID: %s", strerror(-r)); + log_error_errno(-r, "Failed to generate randomized machine ID: %m"); return r; } @@ -879,7 +883,6 @@ static int parse_argv(int argc, char *argv[]) { default: assert_not_reached("Unhandled option"); } - } return 1; }