From cdf6f34a2fd1448c5d1b75f4717c57b057dd51b2 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 13 Jun 2024 09:29:10 +0200 Subject: [PATCH] io-util: add new helper fputs_with_newline() --- src/basic/io-util.c | 16 ++++++++++++++++ src/basic/io-util.h | 3 +++ src/core/unit.c | 6 ++---- 3 files changed, 21 insertions(+), 4 deletions(-) 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); -- 2.47.3