diff options
author | Lennart Poettering <lennart@poettering.net> | 2018-03-22 16:53:26 +0100 |
---|---|---|
committer | Sven Eden <yamakuzure@gmx.net> | 2018-08-24 16:47:08 +0200 |
commit | 0c2b96fea853ce7f16a9326c3c98117d75defdf6 (patch) | |
tree | ff3d108a1d7f295af840137e3c7f77e9d25692aa /src/basic/fileio.c | |
parent | 6895c0be1845203e14b776dd8a15a97780ac6942 (diff) |
macro: introduce TAKE_PTR() macro
This macro will read a pointer of any type, return it, and set the
pointer to NULL. This is useful as an explicit concept of passing
ownership of a memory area between pointers.
This takes inspiration from Rust:
https://doc.rust-lang.org/std/option/enum.Option.html#method.take
and was suggested by Alan Jenkins (@sourcejedi).
It drops ~160 lines of code from our codebase, which makes me like it.
Also, I think it clarifies passing of ownership, and thus helps
readability a bit (at least for the initiated who know the new macro)
Diffstat (limited to 'src/basic/fileio.c')
-rw-r--r-- | src/basic/fileio.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/src/basic/fileio.c b/src/basic/fileio.c index 2e8991925..dd8fb1fcb 100644 --- a/src/basic/fileio.c +++ b/src/basic/fileio.c @@ -330,8 +330,7 @@ int read_full_stream(FILE *f, char **contents, size_t *size) { } buf[l] = 0; - *contents = buf; - buf = NULL; /* do not free */ + *contents = TAKE_PTR(buf); if (size) *size = l; @@ -1441,8 +1440,7 @@ int open_tmpfile_linkable(const char *target, int flags, char **ret_path) { if (fd < 0) return -errno; - *ret_path = tmp; - tmp = NULL; + *ret_path = TAKE_PTR(tmp); return fd; } @@ -1530,8 +1528,7 @@ int read_nul_string(FILE *f, char **ret) { return -ENOMEM; } - *ret = x; - x = NULL; + *ret = TAKE_PTR(x); return 0; } |