/* * Ported from WinNative (maxjivi05, feature/wayland-gamescope, 2026-09-18/19), GPL-3.0. */ #define _GNU_SOURCE #include #include #include #include #include #include #include static int unsupported(int error) { return error == ENOSYS || error == ENOTSUP || error == EOPNOTSUPP; } int flock(int fd, int operation) { static int (*real_flock)(int, int); int result; if (real_flock == NULL) real_flock = dlsym(RTLD_NEXT, "flock"); if (real_flock == NULL) return 0; result = real_flock(fd, operation); if (result < 0 && unsupported(errno)) return 0; return result; } static int is_lock_command(int cmd) { switch (cmd) { case F_SETLK: case F_SETLKW: #ifdef F_OFD_SETLK case F_OFD_SETLK: #endif #ifdef F_OFD_SETLKW case F_OFD_SETLKW: #endif return 1; default: return 0; } } static int is_lock_query(int cmd) { switch (cmd) { case F_GETLK: #ifdef F_OFD_GETLK case F_OFD_GETLK: #endif return 1; default: return 0; } } int bl_nl_before_dup(int fd, void **state) __attribute__((visibility("hidden"))); void bl_nl_after_dup(void *state, int fd) __attribute__((visibility("hidden"))); int fcntl(int fd, int cmd, ...) { static int (*real_fcntl)(int, int, ...); va_list ap; void *arg; int result; va_start(ap, cmd); arg = va_arg(ap, void *); va_end(ap); if (real_fcntl == NULL) real_fcntl = dlsym(RTLD_NEXT, "fcntl"); if (real_fcntl == NULL) { errno = ENOSYS; return -1; } void *nl_state = NULL; int duplicate = cmd == F_DUPFD || cmd == F_DUPFD_CLOEXEC; if (duplicate && bl_nl_before_dup(fd, &nl_state) != 0) return -1; result = real_fcntl(fd, cmd, arg); if (duplicate) bl_nl_after_dup(nl_state, result); if (result >= 0 || !unsupported(errno)) return result; if (is_lock_command(cmd)) return 0; if (is_lock_query(cmd) && arg != NULL) { ((struct flock *)arg)->l_type = F_UNLCK; return 0; } return result; } #if defined(__GLIBC__) && defined(F_SETLK64) int fcntl64(int fd, int cmd, ...) __attribute__((alias("fcntl"))); #endif