summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2018-03-22 17:04:29 +0100
committerLennart Poettering <lennart@poettering.net>2018-03-22 20:30:40 +0100
commitc10d6bdb891881f68471dabd8100ea6021e6cdbb (patch)
tree99f77908217b88a1b49c1ef23d1e27c493ba30e4
parent2f4cefe6ce00a38988830e88f7b16acfb6b21b3c (diff)
downloadsystemd-c10d6bdb891881f68471dabd8100ea6021e6cdbb.tar.gz
macro: introduce new TAKE_FD() macro
This is similar to TAKE_PTR() but operates on file descriptors, and thus assigns -1 to the fd parameter after returning it. Removes 60 lines from our codebase. Pretty good too I think.
-rw-r--r--coccinelle/take-fd.cocci14
-rw-r--r--src/basic/fd-util.c10
-rw-r--r--src/basic/fd-util.h8
-rw-r--r--src/basic/fs-util.c13
-rw-r--r--src/basic/memfd-util.c5
-rw-r--r--src/basic/terminal-util.c5
-rw-r--r--src/core/dynamic-user.c5
-rw-r--r--src/core/manager.c3
-rw-r--r--src/core/socket.c23
-rw-r--r--src/import/export-raw.c11
-rw-r--r--src/import/import-common.c12
-rw-r--r--src/import/import-raw.c3
-rw-r--r--src/import/importd.c3
-rw-r--r--src/import/pull-raw.c3
-rw-r--r--src/journal/journal-send.c4
-rw-r--r--src/libsystemd-network/arp-util.c5
-rw-r--r--src/libsystemd-network/dhcp-network.c10
-rw-r--r--src/libsystemd-network/dhcp6-network.c4
-rw-r--r--src/libsystemd-network/icmp6-util.c4
-rw-r--r--src/libsystemd-network/lldp-network.c5
-rw-r--r--src/login/logind-session.c3
-rw-r--r--src/resolve/resolved-dns-scope.c7
-rw-r--r--src/resolve/resolved-dns-stub.c8
-rw-r--r--src/shared/machine-pool.c12
-rw-r--r--src/vconsole/vconsole-setup.c14
25 files changed, 64 insertions, 130 deletions
diff --git a/coccinelle/take-fd.cocci b/coccinelle/take-fd.cocci
new file mode 100644
index 0000000000..ba242483cd
--- /dev/null
+++ b/coccinelle/take-fd.cocci
@@ -0,0 +1,14 @@
+@@
+local idexpression p;
+expression q;
+@@
+- p = q;
+- q = -1;
+- return p;
++ return TAKE_FD(q);
+@@
+expression p, q;
+@@
+- p = q;
+- q = -1;
++ p = TAKE_FD(q);
diff --git a/src/basic/fd-util.c b/src/basic/fd-util.c
index 6d7875361c..0726aac38c 100644
--- a/src/basic/fd-util.c
+++ b/src/basic/fd-util.c
@@ -484,10 +484,7 @@ int acquire_data_fd(const void *data, size_t size, unsigned flags) {
if (r < 0)
return r;
- r = fd;
- fd = -1;
-
- return r;
+ return TAKE_FD(fd);
}
try_pipe:
@@ -524,10 +521,7 @@ try_pipe:
(void) fd_nonblock(pipefds[0], false);
- r = pipefds[0];
- pipefds[0] = -1;
-
- return r;
+ return TAKE_FD(pipefds[0]);
}
try_dev_shm:
diff --git a/src/basic/fd-util.h b/src/basic/fd-util.h
index 635a538b5a..007580b48f 100644
--- a/src/basic/fd-util.h
+++ b/src/basic/fd-util.h
@@ -105,3 +105,11 @@ int rearrange_stdio(int original_input_fd, int original_output_fd, int original_
static inline int make_null_stdio(void) {
return rearrange_stdio(-1, -1, -1);
}
+
+/* Like TAKE_PTR() but for file descriptors, resetting them to -1 */
+#define TAKE_FD(fd) \
+ ({ \
+ int _fd_ = (fd); \
+ (fd) = -1; \
+ _fd_; \
+ })
diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c
index aec8b00744..150c47a719 100644
--- a/src/basic/fs-util.c
+++ b/src/basic/fs-util.c
@@ -730,8 +730,7 @@ int chase_symlinks(const char *path, const char *original_root, unsigned flags,
}
safe_close(fd);
- fd = fd_parent;
- fd_parent = -1;
+ fd = TAKE_FD(fd_parent);
continue;
}
@@ -849,8 +848,7 @@ int chase_symlinks(const char *path, const char *original_root, unsigned flags,
/* And iterate again, but go one directory further down. */
safe_close(fd);
- fd = child;
- child = -1;
+ fd = TAKE_FD(child);
}
if (!done) {
@@ -864,16 +862,11 @@ int chase_symlinks(const char *path, const char *original_root, unsigned flags,
*ret = TAKE_PTR(done);
if (flags & CHASE_OPEN) {
- int q;
-
/* Return the O_PATH fd we currently are looking to the caller. It can translate it to a proper fd by
* opening /proc/self/fd/xyz. */
assert(fd >= 0);
- q = fd;
- fd = -1;
-
- return q;
+ return TAKE_FD(fd);
}
return exists;
diff --git a/src/basic/memfd-util.c b/src/basic/memfd-util.c
index e7eb895462..758ba6458a 100644
--- a/src/basic/memfd-util.c
+++ b/src/basic/memfd-util.c
@@ -168,8 +168,5 @@ int memfd_new_and_map(const char *name, size_t sz, void **p) {
if (r < 0)
return r;
- r = fd;
- fd = -1;
-
- return r;
+ return TAKE_FD(fd);
}
diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c
index 87691d1d38..c7e2d2abb7 100644
--- a/src/basic/terminal-util.c
+++ b/src/basic/terminal-util.c
@@ -496,10 +496,7 @@ int acquire_terminal(
fd = safe_close(fd);
}
- r = fd;
- fd = -1;
-
- return r;
+ return TAKE_FD(fd);
}
int release_terminal(void) {
diff --git a/src/core/dynamic-user.c b/src/core/dynamic-user.c
index f87a5a20d4..7236dcfabd 100644
--- a/src/core/dynamic-user.c
+++ b/src/core/dynamic-user.c
@@ -319,10 +319,7 @@ static int pick_uid(char **suggested_paths, const char *name, uid_t *ret_uid) {
(void) make_uid_symlinks(candidate, name, true); /* also add direct lookup symlinks */
*ret_uid = candidate;
- r = lock_fd;
- lock_fd = -1;
-
- return r;
+ return TAKE_FD(lock_fd);
next:
;
diff --git a/src/core/manager.c b/src/core/manager.c
index 7026a58d73..9a71f5f2e7 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -844,8 +844,7 @@ static int manager_setup_notify(Manager *m) {
if (r < 0)
return log_error_errno(errno, "SO_PASSCRED failed: %m");
- m->notify_fd = fd;
- fd = -1;
+ m->notify_fd = TAKE_FD(fd);
log_debug("Using notification socket %s", m->notify_socket);
}
diff --git a/src/core/socket.c b/src/core/socket.c
index b3c09f67c0..eecf6fbe18 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -1238,10 +1238,7 @@ static int fifo_address_create(
goto fail;
}
- r = fd;
- fd = -1;
-
- return r;
+ return TAKE_FD(fd);
fail:
mac_selinux_create_file_clear();
@@ -1251,7 +1248,6 @@ fail:
static int special_address_create(const char *path, bool writable) {
_cleanup_close_ int fd = -1;
struct stat st;
- int r;
assert(path);
@@ -1266,16 +1262,12 @@ static int special_address_create(const char *path, bool writable) {
if (!S_ISREG(st.st_mode) && !S_ISCHR(st.st_mode))
return -EEXIST;
- r = fd;
- fd = -1;
-
- return r;
+ return TAKE_FD(fd);
}
static int usbffs_address_create(const char *path) {
_cleanup_close_ int fd = -1;
struct stat st;
- int r;
assert(path);
@@ -1290,10 +1282,7 @@ static int usbffs_address_create(const char *path) {
if (!S_ISREG(st.st_mode))
return -EEXIST;
- r = fd;
- fd = -1;
-
- return r;
+ return TAKE_FD(fd);
}
static int mq_address_create(
@@ -1306,7 +1295,6 @@ static int mq_address_create(
struct stat st;
mode_t old_mask;
struct mq_attr _attr, *attr = NULL;
- int r;
assert(path);
@@ -1338,10 +1326,7 @@ static int mq_address_create(
st.st_gid != getgid())
return -EEXIST;
- r = fd;
- fd = -1;
-
- return r;
+ return TAKE_FD(fd);
}
static int socket_symlink(Socket *s) {
diff --git a/src/import/export-raw.c b/src/import/export-raw.c
index eaa6d10915..9cab838b96 100644
--- a/src/import/export-raw.c
+++ b/src/import/export-raw.c
@@ -326,13 +326,10 @@ int raw_export_start(RawExport *e, const char *path, int fd, ImportCompressType
/* Try to take a reflink snapshot of the file, if we can t make the export atomic */
tfd = reflink_snapshot(sfd, path);
- if (tfd >= 0) {
- e->input_fd = tfd;
- tfd = -1;
- } else {
- e->input_fd = sfd;
- sfd = -1;
- }
+ if (tfd >= 0)
+ e->input_fd = TAKE_FD(tfd);
+ else
+ e->input_fd = TAKE_FD(sfd);
r = import_compress_init(&e->compress, compress);
if (r < 0)
diff --git a/src/import/import-common.c b/src/import/import-common.c
index a3dc1dde8c..b9d8c23905 100644
--- a/src/import/import-common.c
+++ b/src/import/import-common.c
@@ -117,13 +117,9 @@ int import_fork_tar_x(const char *path, pid_t *ret) {
_exit(EXIT_FAILURE);
}
- pipefd[0] = safe_close(pipefd[0]);
- r = pipefd[1];
- pipefd[1] = -1;
-
*ret = pid;
- return r;
+ return TAKE_FD(pipefd[1]);
}
int import_fork_tar_c(const char *path, pid_t *ret) {
@@ -165,11 +161,7 @@ int import_fork_tar_c(const char *path, pid_t *ret) {
_exit(EXIT_FAILURE);
}
- pipefd[1] = safe_close(pipefd[1]);
- r = pipefd[0];
- pipefd[0] = -1;
-
*ret = pid;
- return r;
+ return TAKE_FD(pipefd[0]);
}
diff --git a/src/import/import-raw.c b/src/import/import-raw.c
index f117c94da2..032b3dcda2 100644
--- a/src/import/import-raw.c
+++ b/src/import/import-raw.c
@@ -210,8 +210,7 @@ static int raw_import_maybe_convert_qcow2(RawImport *i) {
free_and_replace(i->temp_path, t);
safe_close(i->output_fd);
- i->output_fd = converted_fd;
- converted_fd = -1;
+ i->output_fd = TAKE_FD(converted_fd);
return 1;
}
diff --git a/src/import/importd.c b/src/import/importd.c
index a0c02b26ab..55e61b485f 100644
--- a/src/import/importd.c
+++ b/src/import/importd.c
@@ -453,8 +453,7 @@ static int transfer_start(Transfer *t) {
}
pipefd[1] = safe_close(pipefd[1]);
- t->log_fd = pipefd[0];
- pipefd[0] = -1;
+ t->log_fd = TAKE_FD(pipefd[0]);
t->stdin_fd = safe_close(t->stdin_fd);
diff --git a/src/import/pull-raw.c b/src/import/pull-raw.c
index 880cb84ba8..9784141871 100644
--- a/src/import/pull-raw.c
+++ b/src/import/pull-raw.c
@@ -272,8 +272,7 @@ static int raw_pull_maybe_convert_qcow2(RawPull *i) {
free_and_replace(i->temp_path, t);
safe_close(i->raw_job->disk_fd);
- i->raw_job->disk_fd = converted_fd;
- converted_fd = -1;
+ i->raw_job->disk_fd = TAKE_FD(converted_fd);
return 1;
}
diff --git a/src/journal/journal-send.c b/src/journal/journal-send.c
index 73329ba024..b6adf64c27 100644
--- a/src/journal/journal-send.c
+++ b/src/journal/journal-send.c
@@ -441,9 +441,7 @@ _public_ int sd_journal_stream_fd(const char *identifier, int priority, int leve
if (r < 0)
return r;
- r = fd;
- fd = -1;
- return r;
+ return TAKE_FD(fd);
}
_public_ int sd_journal_print_with_location(int priority, const char *file, const char *line, const char *func, const char *format, ...) {
diff --git a/src/libsystemd-network/arp-util.c b/src/libsystemd-network/arp-util.c
index b8e9b2e496..3217ac0d1f 100644
--- a/src/libsystemd-network/arp-util.c
+++ b/src/libsystemd-network/arp-util.c
@@ -103,10 +103,7 @@ int arp_network_bind_raw_socket(int ifindex, be32_t address, const struct ether_
if (r < 0)
return -errno;
- r = s;
- s = -1;
-
- return r;
+ return TAKE_FD(s);
}
static int arp_send_packet(int fd, int ifindex,
diff --git a/src/libsystemd-network/dhcp-network.c b/src/libsystemd-network/dhcp-network.c
index 602bf08a60..ac9a7a31b6 100644
--- a/src/libsystemd-network/dhcp-network.c
+++ b/src/libsystemd-network/dhcp-network.c
@@ -123,10 +123,7 @@ static int _bind_raw_socket(int ifindex, union sockaddr_union *link,
if (r < 0)
return -errno;
- r = s;
- s = -1;
-
- return r;
+ return TAKE_FD(s);
}
int dhcp_network_bind_raw_socket(int ifindex, union sockaddr_union *link,
@@ -211,10 +208,7 @@ int dhcp_network_bind_udp_socket(int ifindex, be32_t address, uint16_t port) {
if (r < 0)
return -errno;
- r = s;
- s = -1;
-
- return r;
+ return TAKE_FD(s);
}
int dhcp_network_send_raw_socket(int s, const union sockaddr_union *link,
diff --git a/src/libsystemd-network/dhcp6-network.c b/src/libsystemd-network/dhcp6-network.c
index b3b8fddbcb..70f5909304 100644
--- a/src/libsystemd-network/dhcp6-network.c
+++ b/src/libsystemd-network/dhcp6-network.c
@@ -67,9 +67,7 @@ int dhcp6_network_bind_udp_socket(int index, struct in6_addr *local_address) {
if (r < 0)
return -errno;
- r = s;
- s = -1;
- return r;
+ return TAKE_FD(s);
}
int dhcp6_network_send_udp_socket(int s, struct in6_addr *server_address,
diff --git a/src/libsystemd-network/icmp6-util.c b/src/libsystemd-network/icmp6-util.c
index dd4e28bfd9..2347251572 100644
--- a/src/libsystemd-network/icmp6-util.c
+++ b/src/libsystemd-network/icmp6-util.c
@@ -98,9 +98,7 @@ static int icmp6_bind_router_message(const struct icmp6_filter *filter,
if (r < 0)
return -errno;
- r = s;
- s = -1;
- return r;
+ return TAKE_FD(s);
}
int icmp6_bind_router_solicitation(int index) {
diff --git a/src/libsystemd-network/lldp-network.c b/src/libsystemd-network/lldp-network.c
index cb3841ef22..c653813cfb 100644
--- a/src/libsystemd-network/lldp-network.c
+++ b/src/libsystemd-network/lldp-network.c
@@ -92,8 +92,5 @@ int lldp_network_bind_raw_socket(int ifindex) {
if (r < 0)
return -errno;
- r = fd;
- fd = -1;
-
- return r;
+ return TAKE_FD(fd);
}
diff --git a/src/login/logind-session.c b/src/login/logind-session.c
index 7aeeafd8e1..5673ea4f9e 100644
--- a/src/login/logind-session.c
+++ b/src/login/logind-session.c
@@ -1145,8 +1145,7 @@ void session_restore_vt(Session *s) {
* little dance to avoid having the terminal be available
* for reuse before we've cleaned it up.
*/
- old_fd = s->vtfd;
- s->vtfd = -1;
+ old_fd = TAKE_FD(s->vtfd);
vt = session_open_vt(s);
safe_close(old_fd);
diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c
index bf6aac8300..305bb6afe8 100644
--- a/src/resolve/resolved-dns-scope.c
+++ b/src/resolve/resolved-dns-scope.c
@@ -325,7 +325,7 @@ static int dns_scope_socket(
union sockaddr_union sa = {};
socklen_t salen;
static const int one = 1;
- int ret, r, ifindex;
+ int r, ifindex;
assert(s);
@@ -409,10 +409,7 @@ static int dns_scope_socket(
if (r < 0 && errno != EINPROGRESS)
return -errno;
- ret = fd;
- fd = -1;
-
- return ret;
+ return TAKE_FD(fd);
}
int dns_scope_socket_udp(DnsScope *s, DnsServer *server, uint16_t port) {
diff --git a/src/resolve/resolved-dns-stub.c b/src/resolve/resolved-dns-stub.c
index 5ce8d240dd..20ff8a1d3b 100644
--- a/src/resolve/resolved-dns-stub.c
+++ b/src/resolve/resolved-dns-stub.c
@@ -447,10 +447,8 @@ static int manager_dns_stub_udp_fd(Manager *m) {
return r;
(void) sd_event_source_set_description(m->dns_stub_udp_event_source, "dns-stub-udp");
- m->dns_stub_udp_fd = fd;
- fd = -1;
- return m->dns_stub_udp_fd;
+ return m->dns_stub_udp_fd = TAKE_FD(fd);
}
static int on_dns_stub_stream_packet(DnsStream *s) {
@@ -542,10 +540,8 @@ static int manager_dns_stub_tcp_fd(Manager *m) {
return r;
(void) sd_event_source_set_description(m->dns_stub_tcp_event_source, "dns-stub-tcp");
- m->dns_stub_tcp_fd = fd;
- fd = -1;
- return m->dns_stub_tcp_fd;
+ return m->dns_stub_tcp_fd = TAKE_FD(fd);
}
int manager_dns_stub_start(Manager *m) {
diff --git a/src/shared/machine-pool.c b/src/shared/machine-pool.c
index 031d443e9e..68e5bd19a0 100644
--- a/src/shared/machine-pool.c
+++ b/src/shared/machine-pool.c
@@ -89,11 +89,8 @@ static int setup_machine_raw(uint64_t size, sd_bus_error *error) {
* /var/lib/machines. */
fd = open("/var/lib/machines.raw", O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
- if (fd >= 0) {
- r = fd;
- fd = -1;
- return r;
- }
+ if (fd >= 0)
+ return TAKE_FD(fd);
if (errno != ENOENT)
return sd_bus_error_set_errnof(error, errno, "Failed to open /var/lib/machines.raw: %m");
@@ -162,10 +159,7 @@ static int setup_machine_raw(uint64_t size, sd_bus_error *error) {
goto fail;
}
- r = fd;
- fd = -1;
-
- return r;
+ return TAKE_FD(fd);
fail:
unlink_noerrno(tmp);
diff --git a/src/vconsole/vconsole-setup.c b/src/vconsole/vconsole-setup.c
index 6bde3da1c8..92656c6383 100644
--- a/src/vconsole/vconsole-setup.c
+++ b/src/vconsole/vconsole-setup.c
@@ -325,8 +325,8 @@ static void setup_remaining_vcs(int src_fd, unsigned src_idx, bool utf8) {
static int find_source_vc(char **ret_path, unsigned *ret_idx) {
_cleanup_free_ char *path = NULL;
+ int r, err = 0;
unsigned i;
- int ret_fd, r, err = 0;
path = new(char, sizeof("/dev/tty63"));
if (!path)
@@ -359,18 +359,16 @@ static int find_source_vc(char **ret_path, unsigned *ret_idx) {
/* all checks passed, return this one as a source console */
*ret_idx = i;
*ret_path = TAKE_PTR(path);
- ret_fd = fd;
- fd = -1;
- return ret_fd;
+ return TAKE_FD(fd);
}
return log_error_errno(err, "No usable source console found: %m");
}
static int verify_source_vc(char **ret_path, const char *src_vc) {
- char *path;
_cleanup_close_ int fd = -1;
- int ret_fd, r;
+ char *path;
+ int r;
fd = open_terminal(src_vc, O_RDWR|O_CLOEXEC|O_NOCTTY);
if (fd < 0)
@@ -393,9 +391,7 @@ static int verify_source_vc(char **ret_path, const char *src_vc) {
return log_oom();
*ret_path = path;
- ret_fd = fd;
- fd = -1;
- return ret_fd;
+ return TAKE_FD(fd);
}
int main(int argc, char **argv) {