From: Lennart Poettering Date: Mon, 19 May 2025 09:02:41 +0000 (+0200) Subject: env-file: add helper for printing a properly escaped env var file assignment X-Git-Tag: v258-rc1~529^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e27333b2ccd34545dbc7d26d34a1c24179f989ce;p=thirdparty%2Fsystemd.git env-file: add helper for printing a properly escaped env var file assignment --- diff --git a/src/basic/env-file.c b/src/basic/env-file.c index b0faeab4ccc..75bb47f3367 100644 --- a/src/basic/env-file.c +++ b/src/basic/env-file.c @@ -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); } diff --git a/src/basic/env-file.h b/src/basic/env-file.h index 37db30765b7..df3f29500f6 100644 --- a/src/basic/env-file.h +++ b/src/basic/env-file.h @@ -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);