From: Lennart Poettering Date: Thu, 13 Jun 2024 07:29:10 +0000 (+0200) Subject: io-util: add new helper fputs_with_newline() X-Git-Tag: v257-rc1~1171^2~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cdf6f34a2fd1448c5d1b75f4717c57b057dd51b2;p=thirdparty%2Fsystemd.git io-util: add new helper fputs_with_newline() --- diff --git a/src/basic/io-util.c b/src/basic/io-util.c index 6bcbef34136..e07e1a1e191 100644 --- a/src/basic/io-util.c +++ b/src/basic/io-util.c @@ -306,3 +306,19 @@ ssize_t sparse_write(int fd, const void *p, size_t sz, size_t run_length) { return q - (const uint8_t*) p; } + +int fputs_with_newline(const char *s, FILE *f) { + assert(s); + assert(f); + + /* This is like fputs() but outputs a trailing newline char, but only if the string doesn't end in a + * newline anyway. Just like fputs() returns EOF on error. Otherwise returns 0 in case we didn't + * append a newline, > 0 otherwise. */ + + if (fputs(s, f) == EOF) + return EOF; + if (endswith(s, "\n")) + return 0; + + return fputc('\n', f) == EOF ? EOF : 1; +} diff --git a/src/basic/io-util.h b/src/basic/io-util.h index e027c1a878c..0d9007a304d 100644 --- a/src/basic/io-util.h +++ b/src/basic/io-util.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include "macro.h" @@ -44,3 +45,5 @@ static inline bool FILE_SIZE_VALID_OR_INFINITY(uint64_t l) { return FILE_SIZE_VALID(l); } + +int fputs_with_newline(const char *s, FILE *f); diff --git a/src/core/unit.c b/src/core/unit.c index 35e790ebba5..99c1db3a1a6 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -33,6 +33,7 @@ #include "format-util.h" #include "id128-util.h" #include "install.h" +#include "io-util.h" #include "iovec-util.h" #include "label-util.h" #include "load-dropin.h" @@ -4569,10 +4570,7 @@ int unit_write_setting(Unit *u, UnitWriteFlags flags, const char *name, const ch if (u->transient_file) { /* When this is a transient unit file in creation, then let's not create a new drop-in but instead * write to the transient unit file. */ - fputs(data, u->transient_file); - - if (!endswith(data, "\n")) - fputc('\n', u->transient_file); + fputs_with_newline(data, u->transient_file); /* Remember which section we wrote this entry to */ u->last_section_private = !!(flags & UNIT_PRIVATE);