summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am2
-rw-r--r--src/basic/copy.c1
-rw-r--r--src/basic/io-util.c261
-rw-r--r--src/basic/io-util.h39
-rw-r--r--src/basic/random-util.c1
-rw-r--r--src/basic/terminal-util.c1
-rw-r--r--src/basic/util.c236
-rw-r--r--src/basic/util.h14
-rw-r--r--src/bootchart/bootchart.c1
-rw-r--r--src/core/automount.c1
-rw-r--r--src/core/execute.c1
-rw-r--r--src/core/machine-id-setup.c1
-rw-r--r--src/core/manager.c1
-rw-r--r--src/import/import-raw.c1
-rw-r--r--src/import/import-tar.c1
-rw-r--r--src/import/pull-common.c1
-rw-r--r--src/import/pull-job.c1
-rw-r--r--src/journal/compress.c1
-rw-r--r--src/journal/journal-send.c1
-rw-r--r--src/journal/journalctl.c1
-rw-r--r--src/journal/sd-journal.c2
-rw-r--r--src/libsystemd/sd-id128/sd-id128.c3
-rw-r--r--src/libsystemd/sd-login/sd-login.c1
-rw-r--r--src/libsystemd/sd-resolve/sd-resolve.c1
-rw-r--r--src/libudev/libudev-queue.c1
-rw-r--r--src/login/logind-session.c2
-rw-r--r--src/random-seed/random-seed.c1
-rw-r--r--src/resolve/resolved-manager.c1
-rw-r--r--src/rfkill/rfkill.c1
-rw-r--r--src/shared/ask-password-api.c1
-rw-r--r--src/shared/efivars.c1
-rw-r--r--src/shared/logs-show.c1
-rw-r--r--src/shared/spawn-polkit-agent.c5
-rw-r--r--src/systemctl/systemctl.c1
-rw-r--r--src/test/test-util.c3
-rw-r--r--src/tmpfiles/tmpfiles.c1
-rw-r--r--src/tty-ask-password-agent/tty-ask-password-agent.c1
-rw-r--r--src/udev/udevd.c1
-rw-r--r--src/update-done/update-done.c1
-rw-r--r--src/vconsole/vconsole-setup.c1
40 files changed, 343 insertions, 254 deletions
diff --git a/Makefile.am b/Makefile.am
index 5c9bcb4568..459d54460c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -781,6 +781,8 @@ libbasic_la_SOURCES = \
src/basic/refcnt.h \
src/basic/util.c \
src/basic/util.h \
+ src/basic/io-util.c \
+ src/basic/io-util.h \
src/basic/string-util.c \
src/basic/string-util.h \
src/basic/fd-util.c \
diff --git a/src/basic/copy.c b/src/basic/copy.c
index c15527df22..9f274c4d51 100644
--- a/src/basic/copy.c
+++ b/src/basic/copy.c
@@ -25,6 +25,7 @@
#include "btrfs-util.h"
#include "copy.h"
#include "fd-util.h"
+#include "io-util.h"
#include "string-util.h"
#include "strv.h"
#include "util.h"
diff --git a/src/basic/io-util.c b/src/basic/io-util.c
new file mode 100644
index 0000000000..ac8f93ff57
--- /dev/null
+++ b/src/basic/io-util.c
@@ -0,0 +1,261 @@
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
+
+/***
+ This file is part of systemd.
+
+ Copyright 2010 Lennart Poettering
+
+ systemd is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ systemd is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include <poll.h>
+#include <unistd.h>
+
+#include "io-util.h"
+
+int flush_fd(int fd) {
+ struct pollfd pollfd = {
+ .fd = fd,
+ .events = POLLIN,
+ };
+
+ for (;;) {
+ char buf[LINE_MAX];
+ ssize_t l;
+ int r;
+
+ r = poll(&pollfd, 1, 0);
+ if (r < 0) {
+ if (errno == EINTR)
+ continue;
+
+ return -errno;
+
+ } else if (r == 0)
+ return 0;
+
+ l = read(fd, buf, sizeof(buf));
+ if (l < 0) {
+
+ if (errno == EINTR)
+ continue;
+
+ if (errno == EAGAIN)
+ return 0;
+
+ return -errno;
+ } else if (l == 0)
+ return 0;
+ }
+}
+
+ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll) {
+ uint8_t *p = buf;
+ ssize_t n = 0;
+
+ assert(fd >= 0);
+ assert(buf);
+
+ /* If called with nbytes == 0, let's call read() at least
+ * once, to validate the operation */
+
+ if (nbytes > (size_t) SSIZE_MAX)
+ return -EINVAL;
+
+ do {
+ ssize_t k;
+
+ k = read(fd, p, nbytes);
+ if (k < 0) {
+ if (errno == EINTR)
+ continue;
+
+ if (errno == EAGAIN && do_poll) {
+
+ /* We knowingly ignore any return value here,
+ * and expect that any error/EOF is reported
+ * via read() */
+
+ (void) fd_wait_for_event(fd, POLLIN, USEC_INFINITY);
+ continue;
+ }
+
+ return n > 0 ? n : -errno;
+ }
+
+ if (k == 0)
+ return n;
+
+ assert((size_t) k <= nbytes);
+
+ p += k;
+ nbytes -= k;
+ n += k;
+ } while (nbytes > 0);
+
+ return n;
+}
+
+int loop_read_exact(int fd, void *buf, size_t nbytes, bool do_poll) {
+ ssize_t n;
+
+ n = loop_read(fd, buf, nbytes, do_poll);
+ if (n < 0)
+ return (int) n;
+ if ((size_t) n != nbytes)
+ return -EIO;
+
+ return 0;
+}
+
+int loop_write(int fd, const void *buf, size_t nbytes, bool do_poll) {
+ const uint8_t *p = buf;
+
+ assert(fd >= 0);
+ assert(buf);
+
+ if (nbytes > (size_t) SSIZE_MAX)
+ return -EINVAL;
+
+ do {
+ ssize_t k;
+
+ k = write(fd, p, nbytes);
+ if (k < 0) {
+ if (errno == EINTR)
+ continue;
+
+ if (errno == EAGAIN && do_poll) {
+ /* We knowingly ignore any return value here,
+ * and expect that any error/EOF is reported
+ * via write() */
+
+ (void) fd_wait_for_event(fd, POLLOUT, USEC_INFINITY);
+ continue;
+ }
+
+ return -errno;
+ }
+
+ if (_unlikely_(nbytes > 0 && k == 0)) /* Can't really happen */
+ return -EIO;
+
+ assert((size_t) k <= nbytes);
+
+ p += k;
+ nbytes -= k;
+ } while (nbytes > 0);
+
+ return 0;
+}
+
+int pipe_eof(int fd) {
+ struct pollfd pollfd = {
+ .fd = fd,
+ .events = POLLIN|POLLHUP,
+ };
+
+ int r;
+
+ r = poll(&pollfd, 1, 0);
+ if (r < 0)
+ return -errno;
+
+ if (r == 0)
+ return 0;
+
+ return pollfd.revents & POLLHUP;
+}
+
+int fd_wait_for_event(int fd, int event, usec_t t) {
+
+ struct pollfd pollfd = {
+ .fd = fd,
+ .events = event,
+ };
+
+ struct timespec ts;
+ int r;
+
+ r = ppoll(&pollfd, 1, t == USEC_INFINITY ? NULL : timespec_store(&ts, t), NULL);
+ if (r < 0)
+ return -errno;
+
+ if (r == 0)
+ return 0;
+
+ return pollfd.revents;
+}
+
+static size_t nul_length(const uint8_t *p, size_t sz) {
+ size_t n = 0;
+
+ while (sz > 0) {
+ if (*p != 0)
+ break;
+
+ n++;
+ p++;
+ sz--;
+ }
+
+ return n;
+}
+
+ssize_t sparse_write(int fd, const void *p, size_t sz, size_t run_length) {
+ const uint8_t *q, *w, *e;
+ ssize_t l;
+
+ q = w = p;
+ e = q + sz;
+ while (q < e) {
+ size_t n;
+
+ n = nul_length(q, e - q);
+
+ /* If there are more than the specified run length of
+ * NUL bytes, or if this is the beginning or the end
+ * of the buffer, then seek instead of write */
+ if ((n > run_length) ||
+ (n > 0 && q == p) ||
+ (n > 0 && q + n >= e)) {
+ if (q > w) {
+ l = write(fd, w, q - w);
+ if (l < 0)
+ return -errno;
+ if (l != q -w)
+ return -EIO;
+ }
+
+ if (lseek(fd, n, SEEK_CUR) == (off_t) -1)
+ return -errno;
+
+ q += n;
+ w = q;
+ } else if (n > 0)
+ q += n;
+ else
+ q ++;
+ }
+
+ if (q > w) {
+ l = write(fd, w, q - w);
+ if (l < 0)
+ return -errno;
+ if (l != q - w)
+ return -EIO;
+ }
+
+ return q - (const uint8_t*) p;
+}
diff --git a/src/basic/io-util.h b/src/basic/io-util.h
new file mode 100644
index 0000000000..ff7c2a9ac4
--- /dev/null
+++ b/src/basic/io-util.h
@@ -0,0 +1,39 @@
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
+
+#pragma once
+
+/***
+ This file is part of systemd.
+
+ Copyright 2010 Lennart Poettering
+
+ systemd is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ systemd is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include <sys/types.h>
+#include <stdbool.h>
+
+#include "time-util.h"
+
+int flush_fd(int fd);
+
+ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll);
+int loop_read_exact(int fd, void *buf, size_t nbytes, bool do_poll);
+int loop_write(int fd, const void *buf, size_t nbytes, bool do_poll);
+
+int pipe_eof(int fd);
+
+int fd_wait_for_event(int fd, int event, usec_t timeout);
+
+ssize_t sparse_write(int fd, const void *p, size_t sz, size_t run_length);
diff --git a/src/basic/random-util.c b/src/basic/random-util.c
index e183165b9f..2f5c16e2af 100644
--- a/src/basic/random-util.c
+++ b/src/basic/random-util.c
@@ -29,6 +29,7 @@
#include <time.h>
#include "fd-util.h"
+#include "io-util.h"
#include "missing.h"
#include "random-util.h"
#include "time-util.h"
diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c
index 5949b99c95..3b3ca775d0 100644
--- a/src/basic/terminal-util.c
+++ b/src/basic/terminal-util.c
@@ -33,6 +33,7 @@
#include "fd-util.h"
#include "fileio.h"
+#include "io-util.h"
#include "path-util.h"
#include "process-util.h"
#include "string-util.h"
diff --git a/src/basic/util.c b/src/basic/util.c
index 05f34ea52c..c02dfc5bc9 100644
--- a/src/basic/util.c
+++ b/src/basic/util.c
@@ -1236,142 +1236,6 @@ bool fstype_is_network(const char *fstype) {
return nulstr_contains(table, fstype);
}
-int flush_fd(int fd) {
- struct pollfd pollfd = {
- .fd = fd,
- .events = POLLIN,
- };
-
- for (;;) {
- char buf[LINE_MAX];
- ssize_t l;
- int r;
-
- r = poll(&pollfd, 1, 0);
- if (r < 0) {
- if (errno == EINTR)
- continue;
-
- return -errno;
-
- } else if (r == 0)
- return 0;
-
- l = read(fd, buf, sizeof(buf));
- if (l < 0) {
-
- if (errno == EINTR)
- continue;
-
- if (errno == EAGAIN)
- return 0;
-
- return -errno;
- } else if (l == 0)
- return 0;
- }
-}
-
-ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll) {
- uint8_t *p = buf;
- ssize_t n = 0;
-
- assert(fd >= 0);
- assert(buf);
-
- /* If called with nbytes == 0, let's call read() at least
- * once, to validate the operation */
-
- if (nbytes > (size_t) SSIZE_MAX)
- return -EINVAL;
-
- do {
- ssize_t k;
-
- k = read(fd, p, nbytes);
- if (k < 0) {
- if (errno == EINTR)
- continue;
-
- if (errno == EAGAIN && do_poll) {
-
- /* We knowingly ignore any return value here,
- * and expect that any error/EOF is reported
- * via read() */
-
- (void) fd_wait_for_event(fd, POLLIN, USEC_INFINITY);
- continue;
- }
-
- return n > 0 ? n : -errno;
- }
-
- if (k == 0)
- return n;
-
- assert((size_t) k <= nbytes);
-
- p += k;
- nbytes -= k;
- n += k;
- } while (nbytes > 0);
-
- return n;
-}
-
-int loop_read_exact(int fd, void *buf, size_t nbytes, bool do_poll) {
- ssize_t n;
-
- n = loop_read(fd, buf, nbytes, do_poll);
- if (n < 0)
- return (int) n;
- if ((size_t) n != nbytes)
- return -EIO;
-
- return 0;
-}
-
-int loop_write(int fd, const void *buf, size_t nbytes, bool do_poll) {
- const uint8_t *p = buf;
-
- assert(fd >= 0);
- assert(buf);
-
- if (nbytes > (size_t) SSIZE_MAX)
- return -EINVAL;
-
- do {
- ssize_t k;
-
- k = write(fd, p, nbytes);
- if (k < 0) {
- if (errno == EINTR)
- continue;
-
- if (errno == EAGAIN && do_poll) {
- /* We knowingly ignore any return value here,
- * and expect that any error/EOF is reported
- * via write() */
-
- (void) fd_wait_for_event(fd, POLLOUT, USEC_INFINITY);
- continue;
- }
-
- return -errno;
- }
-
- if (_unlikely_(nbytes > 0 && k == 0)) /* Can't really happen */
- return -EIO;
-
- assert((size_t) k <= nbytes);
-
- p += k;
- nbytes -= k;
- } while (nbytes > 0);
-
- return 0;
-}
-
int parse_size(const char *t, uint64_t base, uint64_t *size) {
/* Soo, sometimes we want to parse IEC binary suffixes, and
@@ -2057,44 +1921,6 @@ bool plymouth_running(void) {
return access("/run/plymouth/pid", F_OK) >= 0;
}
-int pipe_eof(int fd) {
- struct pollfd pollfd = {
- .fd = fd,
- .events = POLLIN|POLLHUP,
- };
-
- int r;
-
- r = poll(&pollfd, 1, 0);
- if (r < 0)
- return -errno;
-
- if (r == 0)
- return 0;
-
- return pollfd.revents & POLLHUP;
-}
-
-int fd_wait_for_event(int fd, int event, usec_t t) {
-
- struct pollfd pollfd = {
- .fd = fd,
- .events = event,
- };
-
- struct timespec ts;
- int r;
-
- r = ppoll(&pollfd, 1, t == USEC_INFINITY ? NULL : timespec_store(&ts, t), NULL);
- if (r < 0)
- return -errno;
-
- if (r == 0)
- return 0;
-
- return pollfd.revents;
-}
-
int fopen_temporary(const char *path, FILE **_f, char **_temp_path) {
FILE *f;
char *t;
@@ -4661,68 +4487,6 @@ int read_attr_path(const char *p, unsigned *ret) {
return read_attr_fd(fd, ret);
}
-static size_t nul_length(const uint8_t *p, size_t sz) {
- size_t n = 0;
-
- while (sz > 0) {
- if (*p != 0)
- break;
-
- n++;
- p++;
- sz--;
- }
-
- return n;
-}
-
-ssize_t sparse_write(int fd, const void *p, size_t sz, size_t run_length) {
- const uint8_t *q, *w, *e;
- ssize_t l;
-
- q = w = p;
- e = q + sz;
- while (q < e) {
- size_t n;
-
- n = nul_length(q, e - q);
-
- /* If there are more than the specified run length of
- * NUL bytes, or if this is the beginning or the end
- * of the buffer, then seek instead of write */
- if ((n > run_length) ||
- (n > 0 && q == p) ||
- (n > 0 && q + n >= e)) {
- if (q > w) {
- l = write(fd, w, q - w);
- if (l < 0)
- return -errno;
- if (l != q -w)
- return -EIO;
- }
-
- if (lseek(fd, n, SEEK_CUR) == (off_t) -1)
- return -errno;
-
- q += n;
- w = q;
- } else if (n > 0)
- q += n;
- else
- q ++;
- }
-
- if (q > w) {
- l = write(fd, w, q - w);
- if (l < 0)
- return -errno;
- if (l != q - w)
- return -EIO;
- }
-
- return q - (const uint8_t*) p;
-}
-
void sigkill_wait(pid_t *pid) {
if (!pid)
return;
diff --git a/src/basic/util.h b/src/basic/util.h
index e50fd69664..1a56257cce 100644
--- a/src/basic/util.h
+++ b/src/basic/util.h
@@ -237,14 +237,8 @@ ssize_t string_table_lookup(const char * const *table, size_t len, const char *k
bool fstype_is_network(const char *fstype);
-int flush_fd(int fd);
-
int fopen_temporary(const char *path, FILE **_f, char **_temp_path);
-ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll);
-int loop_read_exact(int fd, void *buf, size_t nbytes, bool do_poll);
-int loop_write(int fd, const void *buf, size_t nbytes, bool do_poll);
-
bool is_device_path(const char *path);
int dir_is_empty(const char *path);
@@ -274,8 +268,6 @@ int path_check_fstype(const char *path, statfs_f_type_t magic_value);
bool is_temporary_fs(const struct statfs *s) _pure_;
int fd_is_temporary_fs(int fd);
-int pipe_eof(int fd);
-
#define xsprintf(buf, fmt, ...) \
assert_message_se((size_t) snprintf(buf, ELEMENTSOF(buf), fmt, __VA_ARGS__) < ELEMENTSOF(buf), \
"xsprintf: " #buf "[] must be big enough")
@@ -370,8 +362,6 @@ int prot_from_flags(int flags) _const_;
char *format_bytes(char *buf, size_t l, uint64_t t);
-int fd_wait_for_event(int fd, int event, usec_t timeout);
-
void* memdup(const void *p, size_t l) _alloc_(2);
int fd_inc_sndbuf(int fd, size_t n);
@@ -647,8 +637,6 @@ int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int userns_fd, int
int getpeercred(int fd, struct ucred *ucred);
int getpeersec(int fd, char **ret);
-int writev_safe(int fd, const struct iovec *w, int j);
-
int mkostemp_safe(char *pattern, int flags);
int open_tmpfile(const char *path, int flags);
@@ -721,8 +709,6 @@ int read_attr_path(const char *p, unsigned *ret);
#define RLIMIT_MAKE_CONST(lim) ((struct rlimit) { lim, lim })
-ssize_t sparse_write(int fd, const void *p, size_t sz, size_t run_length);
-
void sigkill_wait(pid_t *pid);
#define _cleanup_sigkill_wait_ _cleanup_(sigkill_wait)
diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
index a1699f8736..ef113ed40c 100644
--- a/src/bootchart/bootchart.c
+++ b/src/bootchart/bootchart.c
@@ -52,6 +52,7 @@
#include "conf-parser.h"
#include "fd-util.h"
#include "fileio.h"
+#include "io-util.h"
#include "list.h"
#include "macro.h"
#include "path-util.h"
diff --git a/src/core/automount.c b/src/core/automount.c
index c25038ca50..d362d6579d 100644
--- a/src/core/automount.c
+++ b/src/core/automount.c
@@ -36,6 +36,7 @@
#include "dbus-automount.h"
#include "fd-util.h"
#include "formats-util.h"
+#include "io-util.h"
#include "label.h"
#include "mkdir.h"
#include "mount.h"
diff --git a/src/core/execute.c b/src/core/execute.c
index 83ae3f6253..55da8ba4b7 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -69,6 +69,7 @@
#include "fd-util.h"
#include "fileio.h"
#include "formats-util.h"
+#include "io-util.h"
#include "ioprio.h"
#include "log.h"
#include "macro.h"
diff --git a/src/core/machine-id-setup.c b/src/core/machine-id-setup.c
index f59bf56c73..c72892b343 100644
--- a/src/core/machine-id-setup.c
+++ b/src/core/machine-id-setup.c
@@ -31,6 +31,7 @@
#include "fd-util.h"
#include "fileio.h"
+#include "io-util.h"
#include "log.h"
#include "machine-id-setup.h"
#include "macro.h"
diff --git a/src/core/manager.c b/src/core/manager.c
index 400c66977b..287676ff27 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -55,6 +55,7 @@
#include "exit-status.h"
#include "fd-util.h"
#include "hashmap.h"
+#include "io-util.h"
#include "locale-setup.h"
#include "log.h"
#include "macro.h"
diff --git a/src/import/import-raw.c b/src/import/import-raw.c
index f8fc6c108a..a34f30abfc 100644
--- a/src/import/import-raw.c
+++ b/src/import/import-raw.c
@@ -31,6 +31,7 @@
#include "import-common.h"
#include "import-compress.h"
#include "import-raw.h"
+#include "io-util.h"
#include "machine-pool.h"
#include "mkdir.h"
#include "path-util.h"
diff --git a/src/import/import-tar.c b/src/import/import-tar.c
index bc0cd9f5ba..9aade0f430 100644
--- a/src/import/import-tar.c
+++ b/src/import/import-tar.c
@@ -31,6 +31,7 @@
#include "import-common.h"
#include "import-compress.h"
#include "import-tar.h"
+#include "io-util.h"
#include "machine-pool.h"
#include "mkdir.h"
#include "path-util.h"
diff --git a/src/import/pull-common.c b/src/import/pull-common.c
index e98554b60c..f465154b1d 100644
--- a/src/import/pull-common.c
+++ b/src/import/pull-common.c
@@ -26,6 +26,7 @@
#include "copy.h"
#include "escape.h"
#include "fd-util.h"
+#include "io-util.h"
#include "process-util.h"
#include "pull-common.h"
#include "pull-job.h"
diff --git a/src/import/pull-job.c b/src/import/pull-job.c
index 7a0fb54bbe..4736306de2 100644
--- a/src/import/pull-job.c
+++ b/src/import/pull-job.c
@@ -22,6 +22,7 @@
#include <sys/xattr.h>
#include "fd-util.h"
+#include "io-util.h"
#include "machine-pool.h"
#include "pull-job.h"
#include "string-util.h"
diff --git a/src/journal/compress.c b/src/journal/compress.c
index 92f584777c..9308e8b789 100644
--- a/src/journal/compress.c
+++ b/src/journal/compress.c
@@ -35,6 +35,7 @@
#include "compress.h"
#include "fd-util.h"
+#include "io-util.h"
#include "journal-def.h"
#include "macro.h"
#include "sparse-endian.h"
diff --git a/src/journal/journal-send.c b/src/journal/journal-send.c
index d42f8262a5..f388c30d2e 100644
--- a/src/journal/journal-send.c
+++ b/src/journal/journal-send.c
@@ -32,6 +32,7 @@
#include "sd-journal.h"
#include "fd-util.h"
+#include "io-util.h"
#include "memfd-util.h"
#include "socket-util.h"
#include "string-util.h"
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
index dbb05e0527..dee25841e1 100644
--- a/src/journal/journalctl.c
+++ b/src/journal/journalctl.c
@@ -46,6 +46,7 @@
#include "fileio.h"
#include "fsprg.h"
#include "hostname-util.h"
+#include "io-util.h"
#include "journal-def.h"
#include "journal-internal.h"
#include "journal-qrcode.h"
diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c
index d39c0a900c..9dcfc726ea 100644
--- a/src/journal/sd-journal.c
+++ b/src/journal/sd-journal.c
@@ -29,6 +29,7 @@
#include <unistd.h>
#include "sd-journal.h"
+
#include "catalog.h"
#include "compress.h"
#include "fd-util.h"
@@ -36,6 +37,7 @@
#include "formats-util.h"
#include "hashmap.h"
#include "hostname-util.h"
+#include "io-util.h"
#include "journal-def.h"
#include "journal-file.h"
#include "journal-internal.h"
diff --git a/src/libsystemd/sd-id128/sd-id128.c b/src/libsystemd/sd-id128/sd-id128.c
index ef89fd2572..335ad3b1b4 100644
--- a/src/libsystemd/sd-id128/sd-id128.c
+++ b/src/libsystemd/sd-id128/sd-id128.c
@@ -25,10 +25,11 @@
#include "sd-id128.h"
+#include "fd-util.h"
+#include "io-util.h"
#include "macro.h"
#include "random-util.h"
#include "util.h"
-#include "fd-util.h"
_public_ char *sd_id128_to_string(sd_id128_t id, char s[SD_ID128_STRING_MAX]) {
unsigned n;
diff --git a/src/libsystemd/sd-login/sd-login.c b/src/libsystemd/sd-login/sd-login.c
index 399918f834..e1f480d058 100644
--- a/src/libsystemd/sd-login/sd-login.c
+++ b/src/libsystemd/sd-login/sd-login.c
@@ -33,6 +33,7 @@
#include "fileio.h"
#include "formats-util.h"
#include "hostname-util.h"
+#include "io-util.h"
#include "login-util.h"
#include "macro.h"
#include "string-util.h"
diff --git a/src/libsystemd/sd-resolve/sd-resolve.c b/src/libsystemd/sd-resolve/sd-resolve.c
index 38e2dc0fdd..724405d534 100644
--- a/src/libsystemd/sd-resolve/sd-resolve.c
+++ b/src/libsystemd/sd-resolve/sd-resolve.c
@@ -34,6 +34,7 @@
#include "sd-resolve.h"
#include "fd-util.h"
+#include "io-util.h"
#include "list.h"
#include "missing.h"
#include "resolve-util.h"
diff --git a/src/libudev/libudev-queue.c b/src/libudev/libudev-queue.c
index 4d1a0adbf2..a22994c8a2 100644
--- a/src/libudev/libudev-queue.c
+++ b/src/libudev/libudev-queue.c
@@ -25,6 +25,7 @@
#include <sys/inotify.h>
#include "fd-util.h"
+#include "io-util.h"
#include "libudev-private.h"
/**
diff --git a/src/login/logind-session.c b/src/login/logind-session.c
index ead79ad327..10f1cfef81 100644
--- a/src/login/logind-session.c
+++ b/src/login/logind-session.c
@@ -35,8 +35,10 @@
#include "bus-util.h"
#include "escape.h"
#include "fd-util.h"
+#include "fd-util.h"
#include "fileio.h"
#include "formats-util.h"
+#include "io-util.h"
#include "logind-session.h"
#include "mkdir.h"
#include "path-util.h"
diff --git a/src/random-seed/random-seed.c b/src/random-seed/random-seed.c
index 42841480c5..fbfd3a3eba 100644
--- a/src/random-seed/random-seed.c
+++ b/src/random-seed/random-seed.c
@@ -26,6 +26,7 @@
#include <unistd.h>
#include "fd-util.h"
+#include "io-util.h"
#include "log.h"
#include "mkdir.h"
#include "string-util.h"
diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c
index 65476fa38b..6144eedfeb 100644
--- a/src/resolve/resolved-manager.c
+++ b/src/resolve/resolved-manager.c
@@ -29,6 +29,7 @@
#include "fd-util.h"
#include "fileio-label.h"
#include "hostname-util.h"
+#include "io-util.h"
#include "netlink-util.h"
#include "network-internal.h"
#include "ordered-set.h"
diff --git a/src/rfkill/rfkill.c b/src/rfkill/rfkill.c
index df8fc0690d..311343e454 100644
--- a/src/rfkill/rfkill.c
+++ b/src/rfkill/rfkill.c
@@ -28,6 +28,7 @@
#include "escape.h"
#include "fd-util.h"
#include "fileio.h"
+#include "io-util.h"
#include "mkdir.h"
#include "string-util.h"
#include "udev-util.h"
diff --git a/src/shared/ask-password-api.c b/src/shared/ask-password-api.c
index baa6f159f8..15203d21ea 100644
--- a/src/shared/ask-password-api.c
+++ b/src/shared/ask-password-api.c
@@ -35,6 +35,7 @@
#include "ask-password-api.h"
#include "fd-util.h"
#include "formats-util.h"
+#include "io-util.h"
#include "missing.h"
#include "mkdir.h"
#include "random-util.h"
diff --git a/src/shared/efivars.c b/src/shared/efivars.c
index b482603bce..4808ede60c 100644
--- a/src/shared/efivars.c
+++ b/src/shared/efivars.c
@@ -25,6 +25,7 @@
#include "efivars.h"
#include "fd-util.h"
+#include "io-util.h"
#include "utf8.h"
#include "util.h"
#include "virt.h"
diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c
index 6f5b83d08d..d8ea4c9f92 100644
--- a/src/shared/logs-show.c
+++ b/src/shared/logs-show.c
@@ -29,6 +29,7 @@
#include "formats-util.h"
#include "hashmap.h"
#include "hostname-util.h"
+#include "io-util.h"
#include "journal-internal.h"
#include "log.h"
#include "logs-show.h"
diff --git a/src/shared/spawn-polkit-agent.c b/src/shared/spawn-polkit-agent.c
index 472cdecf20..7cc9e7ccc1 100644
--- a/src/shared/spawn-polkit-agent.c
+++ b/src/shared/spawn-polkit-agent.c
@@ -25,11 +25,12 @@
#include <errno.h>
#include <poll.h>
+#include "fd-util.h"
+#include "io-util.h"
#include "log.h"
-#include "util.h"
#include "process-util.h"
#include "spawn-polkit-agent.h"
-#include "fd-util.h"
+#include "util.h"
#ifdef ENABLE_POLKIT
static pid_t agent_pid = 0;
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 213c3c30a0..49acea1dd2 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -54,6 +54,7 @@
#include "hostname-util.h"
#include "initreq.h"
#include "install.h"
+#include "io-util.h"
#include "list.h"
#include "log.h"
#include "logs-show.h"
diff --git a/src/test/test-util.c b/src/test/test-util.c
index ddfcdd857b..86895733c0 100644
--- a/src/test/test-util.c
+++ b/src/test/test-util.c
@@ -35,7 +35,9 @@
#include "cpu-set-util.h"
#include "def.h"
#include "escape.h"
+#include "fd-util.h"
#include "fileio.h"
+#include "io-util.h"
#include "mkdir.h"
#include "process-util.h"
#include "rm-rf.h"
@@ -44,7 +46,6 @@
#include "strv.h"
#include "util.h"
#include "virt.h"
-#include "fd-util.h"
static void test_streq_ptr(void) {
assert_se(streq_ptr(NULL, NULL));
diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
index e574e5ac26..457d721303 100644
--- a/src/tmpfiles/tmpfiles.c
+++ b/src/tmpfiles/tmpfiles.c
@@ -46,6 +46,7 @@
#include "escape.h"
#include "fd-util.h"
#include "formats-util.h"
+#include "io-util.h"
#include "label.h"
#include "log.h"
#include "macro.h"
diff --git a/src/tty-ask-password-agent/tty-ask-password-agent.c b/src/tty-ask-password-agent/tty-ask-password-agent.c
index 30f7f42a09..33419f6962 100644
--- a/src/tty-ask-password-agent/tty-ask-password-agent.c
+++ b/src/tty-ask-password-agent/tty-ask-password-agent.c
@@ -36,6 +36,7 @@
#include "conf-parser.h"
#include "def.h"
#include "fd-util.h"
+#include "io-util.h"
#include "mkdir.h"
#include "path-util.h"
#include "process-util.h"
diff --git a/src/udev/udevd.c b/src/udev/udevd.c
index a548f9ba49..df5fd88bff 100644
--- a/src/udev/udevd.c
+++ b/src/udev/udevd.c
@@ -51,6 +51,7 @@
#include "fileio.h"
#include "formats-util.h"
#include "hashmap.h"
+#include "io-util.h"
#include "netlink-util.h"
#include "process-util.h"
#include "selinux-util.h"
diff --git a/src/update-done/update-done.c b/src/update-done/update-done.c
index 4f67145b36..4c44d50613 100644
--- a/src/update-done/update-done.c
+++ b/src/update-done/update-done.c
@@ -20,6 +20,7 @@
***/
#include "fd-util.h"
+#include "io-util.h"
#include "selinux-util.h"
#include "util.h"
diff --git a/src/vconsole/vconsole-setup.c b/src/vconsole/vconsole-setup.c
index a06f61dd6f..49523a0a67 100644
--- a/src/vconsole/vconsole-setup.c
+++ b/src/vconsole/vconsole-setup.c
@@ -33,6 +33,7 @@
#include "fd-util.h"
#include "fileio.h"
+#include "io-util.h"
#include "log.h"
#include "process-util.h"
#include "signal-util.h"