7 int fcntl(int fd
, int cmd
, ...)
12 arg
= va_arg(ap
, unsigned long);
14 if (cmd
== F_SETFL
) arg
|= O_LARGEFILE
;
15 if (cmd
== F_SETLKW
) return syscall_cp(SYS_fcntl
, fd
, cmd
, (void *)arg
);
16 if (cmd
== F_GETOWN
) {
18 int ret
= __syscall(SYS_fcntl
, fd
, F_GETOWN_EX
, &ex
);
19 if (ret
== -EINVAL
) return __syscall(SYS_fcntl
, fd
, cmd
, (void *)arg
);
20 if (ret
) return __syscall_ret(ret
);
21 return ex
.type
== F_OWNER_PGRP
? -ex
.pid
: ex
.pid
;
23 if (cmd
== F_DUPFD_CLOEXEC
) {
24 int ret
= __syscall(SYS_fcntl
, fd
, F_DUPFD_CLOEXEC
, arg
);
27 __syscall(SYS_fcntl
, ret
, F_SETFD
, FD_CLOEXEC
);
28 return __syscall_ret(ret
);
30 ret
= __syscall(SYS_fcntl
, fd
, F_DUPFD_CLOEXEC
, 0);
32 if (ret
>= 0) __syscall(SYS_close
, ret
);
33 return __syscall_ret(-EINVAL
);
35 ret
= __syscall(SYS_fcntl
, fd
, F_DUPFD
, arg
);
36 if (ret
>= 0) __syscall(SYS_fcntl
, ret
, F_SETFD
, FD_CLOEXEC
);
37 return __syscall_ret(ret
);
44 return syscall(SYS_fcntl
, fd
, cmd
, (void *)arg
);
46 return syscall(SYS_fcntl
, fd
, cmd
, arg
);