From: Lennart Poettering Date: Sun, 14 Nov 2021 21:31:27 +0000 (+0100) Subject: macro: add new helper RET_NERRNO() X-Git-Tag: v250-rc1~250 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ef470ffa234c8c824897488195fb2fc9a4a520e6;p=thirdparty%2Fsystemd.git 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 --- 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] */