^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) #pragma once
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #undef NDEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #include <assert.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <dirent.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <stdbool.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <stdlib.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <unistd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <sys/syscall.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) static inline pid_t sys_getpid(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) return syscall(SYS_getpid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) static inline pid_t sys_gettid(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) return syscall(SYS_gettid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) static inline bool streq(const char *s1, const char *s2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) return strcmp(s1, s2) == 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) static unsigned long long xstrtoull(const char *p, char **end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) if (*p == '0') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) *end = (char *)p + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) } else if ('1' <= *p && *p <= '9') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) unsigned long long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) errno = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) val = strtoull(p, end, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) assert(errno == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) return val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) assert(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) static struct dirent *xreaddir(DIR *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) struct dirent *de;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) errno = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) de = readdir(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) assert(de || errno == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) return de;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) }