]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
env-file: add helper for printing a properly escaped env var file assignment
authorLennart Poettering <lennart@poettering.net>
Mon, 19 May 2025 09:02:41 +0000 (11:02 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 21 May 2025 15:33:40 +0000 (17:33 +0200)
src/basic/env-file.c
src/basic/env-file.h

index b0faeab4ccc9e4690510e660e497dc1161da8134..75bb47f3367675a34cab847818387724d4f5fb51 100644 (file)
@@ -570,6 +570,41 @@ int merge_env_file(
         return parse_env_file_internal(f, fname, merge_env_file_push, env);
 }
 
+static void env_file_fputs_escaped(FILE *f, const char *p) {
+        assert(f);
+        assert(p);
+
+        flockfile(f);
+
+        if (string_has_cc(p, NULL) || chars_intersect(p, WHITESPACE SHELL_NEED_QUOTES)) {
+                fputc_unlocked('"', f);
+
+                for (; *p; p++) {
+                        if (strchr(SHELL_NEED_ESCAPE, *p))
+                                fputc_unlocked('\\', f);
+
+                        fputc_unlocked(*p, f);
+                }
+
+                fputc_unlocked('"', f);
+        } else
+                fputs_unlocked(p, f);
+
+        funlockfile(f);
+}
+
+void env_file_fputs_assignment(FILE *f, const char *k, const char *v) {
+        assert(f);
+        assert(k);
+
+        if (!v)
+                return;
+
+        fputs(k, f);
+        env_file_fputs_escaped(f, v);
+        fputc('\n', f);
+}
+
 static void write_env_var(FILE *f, const char *v) {
         const char *p;
 
@@ -587,19 +622,7 @@ static void write_env_var(FILE *f, const char *v) {
         p++;
         fwrite_unlocked(v, 1, p-v, f);
 
-        if (string_has_cc(p, NULL) || chars_intersect(p, WHITESPACE SHELL_NEED_QUOTES)) {
-                fputc_unlocked('"', f);
-
-                for (; *p; p++) {
-                        if (strchr(SHELL_NEED_ESCAPE, *p))
-                                fputc_unlocked('\\', f);
-
-                        fputc_unlocked(*p, f);
-                }
-
-                fputc_unlocked('"', f);
-        } else
-                fputs_unlocked(p, f);
+        env_file_fputs_escaped(f, p);
 
         fputc_unlocked('\n', f);
 }
index 37db30765b7f4386246d8db7ade6aa6dc0d8311a..df3f29500f68ee60dd6daa77134998c4d336dce9 100644 (file)
@@ -22,3 +22,5 @@ int merge_env_file(char ***env, FILE *f, const char *fname);
 int write_env_file(int dir_fd, const char *fname, char **headers, char **l);
 
 int write_vconsole_conf(int dir_fd, const char *fname, char **l);
+
+void env_file_fputs_assignment(FILE *f, const char *k, const char *v);