22
22
namespace LIBC_NAMESPACE ::internal {
23
23
24
24
int fcntl (int fd, int cmd, void *arg) {
25
+ #if SYS_fcntl
26
+ constexpr auto FCNTL_SYSCALL_ID = SYS_fcntl;
27
+ #elif defined(SYS_fcntl64)
28
+ constexpr auto FCNTL_SYSCALL_ID = SYS_fcntl64;
29
+ #else
30
+ #error "fcntl and fcntl64 syscalls not available."
31
+ #endif
32
+
25
33
switch (cmd) {
26
34
case F_OFD_SETLKW: {
27
35
struct flock *flk = reinterpret_cast <struct flock *>(arg);
@@ -33,7 +41,7 @@ int fcntl(int fd, int cmd, void *arg) {
33
41
flk64.l_len = flk->l_len ;
34
42
flk64.l_pid = flk->l_pid ;
35
43
// create a syscall
36
- return LIBC_NAMESPACE::syscall_impl<int >(SYS_fcntl , fd, cmd, &flk64);
44
+ return LIBC_NAMESPACE::syscall_impl<int >(FCNTL_SYSCALL_ID , fd, cmd, &flk64);
37
45
}
38
46
case F_OFD_GETLK:
39
47
case F_OFD_SETLK: {
@@ -46,7 +54,8 @@ int fcntl(int fd, int cmd, void *arg) {
46
54
flk64.l_len = flk->l_len ;
47
55
flk64.l_pid = flk->l_pid ;
48
56
// create a syscall
49
- int retVal = LIBC_NAMESPACE::syscall_impl<int >(SYS_fcntl, fd, cmd, &flk64);
57
+ int retVal =
58
+ LIBC_NAMESPACE::syscall_impl<int >(FCNTL_SYSCALL_ID, fd, cmd, &flk64);
50
59
// On failure, return
51
60
if (retVal == -1 )
52
61
return -1 ;
@@ -67,8 +76,8 @@ int fcntl(int fd, int cmd, void *arg) {
67
76
}
68
77
case F_GETOWN: {
69
78
struct f_owner_ex fex;
70
- int ret =
71
- LIBC_NAMESPACE::syscall_impl< int >(SYS_fcntl, fd, F_GETOWN_EX, &fex);
79
+ int ret = LIBC_NAMESPACE::syscall_impl< int >(FCNTL_SYSCALL_ID, fd,
80
+ F_GETOWN_EX, &fex);
72
81
if (ret >= 0 )
73
82
return fex.type == F_OWNER_PGRP ? -fex.pid : fex.pid ;
74
83
libc_errno = -ret;
@@ -77,7 +86,7 @@ int fcntl(int fd, int cmd, void *arg) {
77
86
// The general case
78
87
default : {
79
88
int retVal = LIBC_NAMESPACE::syscall_impl<int >(
80
- SYS_fcntl , fd, cmd, reinterpret_cast <void *>(arg));
89
+ FCNTL_SYSCALL_ID , fd, cmd, reinterpret_cast <void *>(arg));
81
90
if (retVal >= 0 ) {
82
91
return retVal;
83
92
}
0 commit comments