author | Rich Felker <dalias@aerifal.cx> | 2014年01月08日 02:18:06 -0500 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2014年01月08日 02:18:06 -0500 |
commit | 131871a3d846369fd925d3f8edb692edbad77e4d (patch) | |
tree | bd22b296221578478c0b11afc80c6538f6550910 /src | |
parent | 1d23b3c9136f606276142ec0037ff78fbb95e26d (diff) | |
download | musl-131871a3d846369fd925d3f8edb692edbad77e4d.tar.gz |
-rw-r--r-- | src/fcntl/fcntl.c | 15 |
diff --git a/src/fcntl/fcntl.c b/src/fcntl/fcntl.c index 4c34ba04..4a713fd4 100644 --- a/src/fcntl/fcntl.c +++ b/src/fcntl/fcntl.c @@ -13,11 +13,11 @@ int fcntl(int fd, int cmd, ...) arg = va_arg(ap, long); va_end(ap); if (cmd == F_SETFL) arg |= O_LARGEFILE; - if (cmd == F_SETLKW) return syscall_cp(SYS_fcntl, fd, cmd, arg); + if (cmd == F_SETLKW) return syscall_cp(SYS_fcntl, fd, cmd, (void *)arg); if (cmd == F_GETOWN) { struct f_owner_ex ex; int ret = __syscall(SYS_fcntl, fd, F_GETOWN_EX, &ex); - if (ret == -EINVAL) return __syscall(SYS_fcntl, fd, cmd, arg); + if (ret == -EINVAL) return __syscall(SYS_fcntl, fd, cmd, (void *)arg); if (ret) return __syscall_ret(ret); return ex.type == F_OWNER_PGRP ? -ex.pid : ex.pid; } @@ -37,5 +37,14 @@ int fcntl(int fd, int cmd, ...) if (ret >= 0) __syscall(SYS_fcntl, ret, F_SETFD, FD_CLOEXEC); return __syscall_ret(ret); } - return syscall(SYS_fcntl, fd, cmd, arg); + switch (cmd) { + case F_SETLK: + case F_SETLKW: + case F_GETLK: + case F_GETOWN_EX: + case F_SETOWN_EX: + return syscall(SYS_fcntl, fd, cmd, (void *)arg); + default: + return syscall(SYS_fcntl, fd, cmd, arg); + } } |