]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Merge pull request #12390 from poettering/string-file-mkdir
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 28 May 2019 12:42:55 +0000 (14:42 +0200)
committerGitHub <noreply@github.com>
Tue, 28 May 2019 12:42:55 +0000 (14:42 +0200)
fileio: add a WRITE_STRING_FILE_MKDIR_0755 flag to write_string_file() that creates parent directories if needed

1  2 
src/firstboot/firstboot.c

index 7d97777b0dcef9efbc675a3c70fee1d342f7a071,ae2b1fd7fcbbde68cd57288bce3430e237c8988b..e6b40294bf6df17883eb6867c4a767e363136d11
@@@ -253,7 -253,7 +253,7 @@@ static int process_locale(void) 
  
          if (arg_copy_locale && arg_root) {
  
-                 mkdir_parents(etc_localeconf, 0755);
+                 (void) mkdir_parents(etc_localeconf, 0755);
                  r = copy_file("/etc/locale.conf", etc_localeconf, 0, 0644, 0, 0, COPY_REFLINK);
                  if (r != -ENOENT) {
                          if (r < 0)
  
          locales[i] = NULL;
  
-         mkdir_parents(etc_localeconf, 0755);
+         (void) mkdir_parents(etc_localeconf, 0755);
          r = write_env_file(etc_localeconf, locales);
          if (r < 0)
                  return log_error_errno(r, "Failed to write %s: %m", etc_localeconf);
@@@ -327,7 -327,7 +327,7 @@@ static int process_keymap(void) 
  
          if (arg_copy_keymap && arg_root) {
  
-                 mkdir_parents(etc_vconsoleconf, 0755);
+                 (void) mkdir_parents(etc_vconsoleconf, 0755);
                  r = copy_file("/etc/vconsole.conf", etc_vconsoleconf, 0, 0644, 0, 0, COPY_REFLINK);
                  if (r != -ENOENT) {
                          if (r < 0)
@@@ -411,7 -411,7 +411,7 @@@ static int process_timezone(void) 
                          if (r < 0)
                                  return log_error_errno(r, "Failed to read host timezone: %m");
  
-                         mkdir_parents(etc_localtime, 0755);
+                         (void) mkdir_parents(etc_localtime, 0755);
                          if (symlink(p, etc_localtime) < 0)
                                  return log_error_errno(errno, "Failed to create %s symlink: %m", etc_localtime);
  
  
          e = strjoina("../usr/share/zoneinfo/", arg_timezone);
  
-         mkdir_parents(etc_localtime, 0755);
+         (void) mkdir_parents(etc_localtime, 0755);
          if (symlink(e, etc_localtime) < 0)
                  return log_error_errno(errno, "Failed to create %s symlink: %m", etc_localtime);
  
@@@ -490,9 -490,8 +490,8 @@@ static int process_hostname(void) 
          if (isempty(arg_hostname))
                  return 0;
  
-         mkdir_parents(etc_hostname, 0755);
          r = write_string_file(etc_hostname, arg_hostname,
-                               WRITE_STRING_FILE_CREATE | WRITE_STRING_FILE_SYNC);
+                               WRITE_STRING_FILE_CREATE | WRITE_STRING_FILE_SYNC | WRITE_STRING_FILE_MKDIR_0755);
          if (r < 0)
                  return log_error_errno(r, "Failed to write %s: %m", etc_hostname);
  
@@@ -512,9 -511,8 +511,8 @@@ static int process_machine_id(void) 
          if (sd_id128_is_null(arg_machine_id))
                  return 0;
  
-         mkdir_parents(etc_machine_id, 0755);
          r = write_string_file(etc_machine_id, sd_id128_to_string(arg_machine_id, id),
-                               WRITE_STRING_FILE_CREATE | WRITE_STRING_FILE_SYNC);
+                               WRITE_STRING_FILE_CREATE | WRITE_STRING_FILE_SYNC | WRITE_STRING_FILE_MKDIR_0755);
          if (r < 0)
                  return log_error_errno(r, "Failed to write machine id: %m");
  
@@@ -595,6 -593,12 +593,6 @@@ static int write_root_shadow(const cha
  
  static int process_root_password(void) {
  
 -        static const char table[] =
 -                "abcdefghijklmnopqrstuvwxyz"
 -                "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 -                "0123456789"
 -                "./";
 -
          struct spwd item = {
                  .sp_namp = (char*) "root",
                  .sp_min = -1,
                  .sp_expire = -1,
                  .sp_flag = (unsigned long) -1, /* this appears to be what everybody does ... */
          };
 -
 +        _cleanup_free_ char *salt = NULL;
          _cleanup_close_ int lock = -1;
 -        char salt[3+16+1+1];
 -        uint8_t raw[16];
 -        unsigned i;
 -        char *j;
 +        struct crypt_data cd = {};
  
          const char *etc_shadow;
          int r;
          if (laccess(etc_shadow, F_OK) >= 0)
                  return 0;
  
-         mkdir_parents(etc_shadow, 0755);
+         (void) mkdir_parents(etc_shadow, 0755);
  
          lock = take_etc_passwd_lock(arg_root);
          if (lock < 0)
          if (!arg_root_password)
                  return 0;
  
 -        /* Insist on the best randomness by setting RANDOM_BLOCK, this is about keeping passwords secret after all. */
 -        r = genuine_random_bytes(raw, 16, RANDOM_BLOCK);
 +        r = make_salt(&salt);
          if (r < 0)
                  return log_error_errno(r, "Failed to get salt: %m");
  
 -        /* We only bother with SHA512 hashed passwords, the rest is legacy, and we don't do legacy. */
 -        assert_cc(sizeof(table) == 64 + 1);
 -        j = stpcpy(salt, "$6$");
 -        for (i = 0; i < 16; i++)
 -                j[i] = table[raw[i] & 63];
 -        j[i++] = '$';
 -        j[i] = 0;
 -
          errno = 0;
 -        item.sp_pwdp = crypt(arg_root_password, salt);
 -        if (!item.sp_pwdp) {
 -                if (!errno)
 -                        errno = EINVAL;
 -
 -                return log_error_errno(errno, "Failed to encrypt password: %m");
 -        }
 +        item.sp_pwdp = crypt_r(arg_root_password, salt, &cd);
 +        if (!item.sp_pwdp)
 +                return log_error_errno(errno == 0 ? SYNTHETIC_ERRNO(EINVAL) : errno,
 +                                       "Failed to encrypt password: %m");
  
          item.sp_lstchg = (long) (now(CLOCK_REALTIME) / USEC_PER_DAY);