With new kernel headers and old libc, `SYS_openat2` can still end up
undefined, which triggers the fallback build-time code, that doesn't build:
```
openat2.cc: In function 'int openat2(int, const char*, open_how*, size_t)':
openat2.cc:35:2: error: 'errno' was not declared in this scope
35 | errno = ENOSYS;
| ^~~~~
openat2.cc:24:1: note: 'errno' is defined in header '<cerrno>'; did you forget to '#include <cerrno>'?
23 | #include <unistd.h>
+++ |+#include <cerrno>
24 |
openat2.cc:35:10: error: 'ENOSYS' was not declared in this scope
35 | errno = ENOSYS;
| ^~~~~~
openat2.cc:29:19: error: unused parameter 'dirfd' [-Werror=unused-parameter]
29 | openat2(int const dirfd, const char *const pathname, struct open_how *const how, size_t const size)
| ~~~~~~~~~~^~~~~
openat2.cc:29:44: error: unused parameter 'pathname' [-Werror=unused-parameter]
29 | openat2(int const dirfd, const char *const pathname, struct open_how *const how, size_t const size)
| ~~~~~~~~~~~~~~~~~~^~~~~~~~
openat2.cc:29:77: error: unused parameter 'how' [-Werror=unused-parameter]
29 | t dirfd, const char *const pathname, struct open_how *const how, size_t const size)
| ~~~~~~~~~~~~~~~~~~~~~~~^~~
openat2.cc:29:95: error: unused parameter 'size' [-Werror=unused-parameter]
29 | st char *const pathname, struct open_how *const how, size_t const size)
| ~~~~~~~~~~~~~^~~~
```
Skip the kernel version check and test for the definition of `SYS_openat2`
directly. If it's not there, plug in the constant so we can send the
call directly to the kernel, bypassing libc completely.
Fixes: https://github.com/Zygo/bees/issues/318
Signed-off-by: Zygo Blaxell <bees@furryterror.org>
openat2 allows closing more TOCTOU holes, but we can only use it when
the kernel supports it.
This should disappear seamlessly when libc implements the function.
Signed-off-by: Zygo Blaxell <bees@furryterror.org>