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
This commit is contained in:
Lennart Poettering 2021-11-14 22:31:27 +01:00 committed by Zbigniew Jędrzejewski-Szmek
parent cb3763d57b
commit ef470ffa23

View File

@ -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] */