From ef470ffa234c8c824897488195fb2fc9a4a520e6 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sun, 14 Nov 2021 22:31:27 +0100 Subject: [PATCH] macro: add new helper RET_NERRNO() This new helper converts libc style syscall return values into systemd-kernel (actually: kernel style) negative errno values. It's implemented as macro-like inline function, and propagates return values >= 0 as themselves and returns -errno for negative error returns. THis is supposed to be little more than syntactic sugar so that we can reduce a lot of (short, but still) boilerplate code whever we convert libc style error handling into our own. As discussed here: https://github.com/systemd/systemd/pull/21326#discussion_r748413537 --- src/basic/errno-util.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/basic/errno-util.h b/src/basic/errno-util.h index 3f2d0af56d9..6d79723b392 100644 --- a/src/basic/errno-util.h +++ b/src/basic/errno-util.h @@ -31,6 +31,29 @@ static inline int negative_errno(void) { return -errno; } +static inline int RET_NERRNO(int ret) { + + /* Helper to wrap system calls in to make them return negative errno errors. This brings system call + * error handling in sync with how we usually handle errors in our own code, i.e. with immediate + * returning of negative errno. Usage is like this: + * + * … + * r = RET_NERRNO(unlink(t)); + * … + * + * or + * + * … + * fd = RET_NERRNO(open("/etc/fstab", O_RDONLY|O_CLOEXEC)); + * … + */ + + if (ret < 0) + return negative_errno(); + + return ret; +} + static inline const char *strerror_safe(int error) { /* 'safe' here does NOT mean thread safety. */ return strerror(abs(error)); /* lgtm [cpp/potentially-dangerous-function] */