From: Tiago Salem Herrmann Date: Tue, 12 Dec 2017 15:52:45 +0000 (-0200) Subject: sysctl: disable buffer while writing to /proc X-Git-Tag: v236~15^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=12ec9c309967d663e93254e3fca835f9a240e26f;p=thirdparty%2Fsystemd.git sysctl: disable buffer while writing to /proc fputs() writes only first 2048 bytes and fails to write to /proc when values are larger than that. This patch adds a new flag to WriteStringFileFlags that make it possible to disable the buffer under specific cases. --- diff --git a/src/basic/fileio.c b/src/basic/fileio.c index 12d6d06fa29..76c9333d261 100644 --- a/src/basic/fileio.c +++ b/src/basic/fileio.c @@ -167,6 +167,9 @@ int write_string_file_ts( } } + if (flags & WRITE_STRING_FILE_DISABLE_BUFFER) + setvbuf(f, NULL, _IONBF, 0); + r = write_string_stream_ts(f, line, flags, ts); if (r < 0) goto fail; diff --git a/src/basic/fileio.h b/src/basic/fileio.h index c283f41f09b..da5d5c66b51 100644 --- a/src/basic/fileio.h +++ b/src/basic/fileio.h @@ -35,6 +35,7 @@ typedef enum { WRITE_STRING_FILE_AVOID_NEWLINE = 1<<2, WRITE_STRING_FILE_VERIFY_ON_FAILURE = 1<<3, WRITE_STRING_FILE_SYNC = 1<<4, + WRITE_STRING_FILE_DISABLE_BUFFER = 1<<5, /* And before you wonder, why write_string_file_atomic_label_ts() is a separate function instead of just one more flag here: it's about linking: we don't want to pull -lselinux into all users of write_string_file() diff --git a/src/shared/sysctl-util.c b/src/shared/sysctl-util.c index 391065d804a..189580e3ed2 100644 --- a/src/shared/sysctl-util.c +++ b/src/shared/sysctl-util.c @@ -60,7 +60,7 @@ int sysctl_write(const char *property, const char *value) { log_debug("Setting '%s' to '%s'", property, value); p = strjoina("/proc/sys/", property); - return write_string_file(p, value, 0); + return write_string_file(p, value, WRITE_STRING_FILE_DISABLE_BUFFER); } int sysctl_read(const char *property, char **content) {