]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
env-util: make write_env_file() optionally take headers
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 30 Oct 2023 06:04:18 +0000 (15:04 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 31 Oct 2023 08:15:21 +0000 (17:15 +0900)
This also makes write_env_file() and write_env_file_label() optionally
take dir_fd, and drop write_env_file_at().

Preparation for later commits.

src/basic/env-file.c
src/basic/env-file.h
src/firstboot/firstboot.c
src/hostname/hostnamed.c
src/locale/localed-util.c
src/shared/env-file-label.c
src/shared/env-file-label.h
src/shared/locale-setup.c
src/test/test-env-file.c
src/test/test-fileio.c

index 5fe045018dba80abaff677e26d76cf93ef4b3926..226d578d389899fff185142b26ff14cfd4d2b905 100644 (file)
@@ -603,7 +603,7 @@ static void write_env_var(FILE *f, const char *v) {
         fputc_unlocked('\n', f);
 }
 
-int write_env_file_at(int dir_fd, const char *fname, char **l) {
+int write_env_file(int dir_fd, const char *fname, char **headers, char **l) {
         _cleanup_fclose_ FILE *f = NULL;
         _cleanup_free_ char *p = NULL;
         int r;
@@ -617,6 +617,12 @@ int write_env_file_at(int dir_fd, const char *fname, char **l) {
 
         (void) fchmod_umask(fileno(f), 0644);
 
+        STRV_FOREACH(i, headers) {
+                assert(isempty(*i) || startswith(*i, "#"));
+                fputs_unlocked(*i, f);
+                fputc_unlocked('\n', f);
+        }
+
         STRV_FOREACH(i, l)
                 write_env_var(f, *i);
 
index 2465eeddf4d6e3d7de6ac629783a9967d1f88b48..a9714cfd53a79ef00f2f1d5b4c0a0a2a07fcc4a3 100644 (file)
@@ -19,7 +19,4 @@ int load_env_file_pairs_fd(int fd, const char *fname, char ***ret);
 
 int merge_env_file(char ***env, FILE *f, const char *fname);
 
-int write_env_file_at(int dir_fd, const char *fname, char **l);
-static inline int write_env_file(const char *fname, char **l) {
-        return write_env_file_at(AT_FDCWD, fname, l);
-}
+int write_env_file(int dir_fd, const char *fname, char **headers, char **l);
index 87a82df4ee8302c95523a445a7718099f9575fd0..6a5b5715c1a90da79551f66b90aefae6c5865b4c 100644 (file)
@@ -446,7 +446,7 @@ static int process_locale(int rfd) {
 
         locales[i] = NULL;
 
-        r = write_env_file_at(pfd, f, locales);
+        r = write_env_file(pfd, f, NULL, locales);
         if (r < 0)
                 return log_error_errno(r, "Failed to write /etc/locale.conf: %m");
 
@@ -534,7 +534,7 @@ static int process_keymap(int rfd) {
 
         keymap = STRV_MAKE(strjoina("KEYMAP=", arg_keymap));
 
-        r = write_env_file_at(pfd, f, keymap);
+        r = write_env_file(pfd, f, NULL, keymap);
         if (r < 0)
                 return log_error_errno(r, "Failed to write /etc/vconsole.conf: %m");
 
index 85904aabe988c5ec1773f91dd8c40d038c4992ec..e1d53f239580b31a7e7bac90d292e4f6abbf55b2 100644 (file)
@@ -656,7 +656,7 @@ static int context_write_data_machine_info(Context *c) {
                 return 0;
         }
 
-        r = write_env_file_label("/etc/machine-info", l);
+        r = write_env_file_label(AT_FDCWD, "/etc/machine-info", NULL, l);
         if (r < 0)
                 return r;
 
index d78b878cf9580469aec0d8fc413a304aab7840f6..eca765c3f23b750eec8d13b526dfff95caf24f7b 100644 (file)
@@ -532,7 +532,7 @@ int vconsole_write_data(Context *c) {
                 return 0;
         }
 
-        r = write_env_file_label("/etc/vconsole.conf", l);
+        r = write_env_file_label(AT_FDCWD, "/etc/vconsole.conf", NULL, l);
         if (r < 0)
                 return r;
 
index 468afce2ba0ed347a47b8ac720d069623f53c7bb..0ab2bb9b7433e7191d98e3d65ed8d110552cc02a 100644 (file)
@@ -6,14 +6,14 @@
 #include "env-file.h"
 #include "selinux-util.h"
 
-int write_env_file_label(const char *fname, char **l) {
+int write_env_file_label(int dir_fd, const char *fname, char **headers, char **l) {
         int r;
 
         r = mac_selinux_create_file_prepare(fname, S_IFREG);
         if (r < 0)
                 return r;
 
-        r = write_env_file(fname, l);
+        r = write_env_file(dir_fd, fname, headers, l);
 
         mac_selinux_create_file_clear();
 
index d68058ab2ec95f0d3409b1a3f6ba9698fca9b8a4..1f1d727b6991dee6f5a6e97e0ad360cee17a5af2 100644 (file)
@@ -5,4 +5,4 @@
  * optimize linking: This way, -lselinux is needed only for the callers of these functions that need selinux, but not
  * for all */
 
-int write_env_file_label(const char *fname, char **l);
+int write_env_file_label(int dir_fd, const char *fname, char **headers, char **l);
index 8943a42c9d3bb39188b49b48930c1174b70a0189..4e7f486a237a660ee24324cc3be7079b135b7775 100644 (file)
@@ -208,7 +208,7 @@ int locale_context_save(LocaleContext *c, char ***ret_set, char ***ret_unset) {
                 return 0;
         }
 
-        r = write_env_file_label("/etc/locale.conf", set);
+        r = write_env_file_label(AT_FDCWD, "/etc/locale.conf", NULL, set);
         if (r < 0)
                 return r;
 
index 6480e7beb34b9685307e00a983774b6aa83ce1c3..3fc6d623fdd460fe38a6b0b8f8d4e69f2ef55177 100644 (file)
@@ -172,7 +172,7 @@ TEST(write_and_load_env_file) {
                 assert_se(tempfn_random_child(NULL, NULL, &p) >= 0);
 
                 assert_se(j = strjoin("TEST=", v));
-                assert_se(write_env_file(p, STRV_MAKE(j)) >= 0);
+                assert_se(write_env_file(AT_FDCWD, p, STRV_MAKE("# header 1", "", "# header 2"), STRV_MAKE(j)) >= 0);
 
                 assert_se(cmd = strjoin(". ", p, " && /bin/echo -n \"$TEST\""));
                 assert_se(f = popen(cmd, "re"));
index fd197ca62269bb06c1e9b6accaaf3d245608706c..d76a4ced916b71120e784beb7866516378b13f0e 100644 (file)
@@ -145,7 +145,7 @@ TEST(parse_env_file) {
                 assert_se(fd >= 0);
         }
 
-        r = write_env_file(p, a);
+        r = write_env_file(AT_FDCWD, p, NULL, a);
         assert_se(r >= 0);
 
         r = load_env_file(NULL, p, &b);
@@ -208,7 +208,7 @@ TEST(parse_multiline_env_file) {
                 assert_se(fd >= 0);
         }
 
-        r = write_env_file(p, a);
+        r = write_env_file(AT_FDCWD, p, NULL, a);
         assert_se(r >= 0);
 
         r = load_env_file(NULL, p, &b);