diff options
Diffstat (limited to 'src/unistd')
| -rw-r--r-- | src/unistd/dup3.c | 6 | ||||
| -rw-r--r-- | src/unistd/faccessat.c | 2 | ||||
| -rw-r--r-- | src/unistd/ftruncate.c | 2 | ||||
| -rw-r--r-- | src/unistd/isatty.c | 6 | ||||
| -rw-r--r-- | src/unistd/lseek.c | 1 | ||||
| -rw-r--r-- | src/unistd/mipsn32/lseek.c | 1 | ||||
| -rw-r--r-- | src/unistd/pause.c | 6 | ||||
| -rw-r--r-- | src/unistd/pipe2.c | 1 | ||||
| -rw-r--r-- | src/unistd/pread.c | 2 | ||||
| -rw-r--r-- | src/unistd/preadv.c | 2 | ||||
| -rw-r--r-- | src/unistd/pwrite.c | 13 | ||||
| -rw-r--r-- | src/unistd/pwritev.c | 12 | ||||
| -rw-r--r-- | src/unistd/setxid.c | 2 | ||||
| -rw-r--r-- | src/unistd/truncate.c | 2 | ||||
| -rw-r--r-- | src/unistd/x32/lseek.c | 1 | 
15 files changed, 30 insertions, 29 deletions
| diff --git a/src/unistd/dup3.c b/src/unistd/dup3.c index f919f791..40798bde 100644 --- a/src/unistd/dup3.c +++ b/src/unistd/dup3.c @@ -9,12 +9,14 @@ int __dup3(int old, int new, int flags)  	int r;  #ifdef SYS_dup2  	if (old==new) return __syscall_ret(-EINVAL); -	if (flags & O_CLOEXEC) { +	if (flags) {  		while ((r=__syscall(SYS_dup3, old, new, flags))==-EBUSY);  		if (r!=-ENOSYS) return __syscall_ret(r); +		if (flags & ~O_CLOEXEC) return __syscall_ret(-EINVAL);  	}  	while ((r=__syscall(SYS_dup2, old, new))==-EBUSY); -	if (flags & O_CLOEXEC) __syscall(SYS_fcntl, new, F_SETFD, FD_CLOEXEC); +	if (r >= 0 && (flags & O_CLOEXEC)) +		__syscall(SYS_fcntl, new, F_SETFD, FD_CLOEXEC);  #else  	while ((r=__syscall(SYS_dup3, old, new, flags))==-EBUSY);  #endif diff --git a/src/unistd/faccessat.c b/src/unistd/faccessat.c index 557503eb..43052dd7 100644 --- a/src/unistd/faccessat.c +++ b/src/unistd/faccessat.c @@ -53,7 +53,7 @@ int faccessat(int fd, const char *filename, int amode, int flag)  	if (pid<0 || __syscall(SYS_read, p[0], &ret, sizeof ret) != sizeof(ret))  		ret = -EBUSY;  	__syscall(SYS_close, p[0]); -	__syscall(SYS_wait4, pid, &status, __WCLONE, 0); +	__sys_wait4(pid, &status, __WCLONE, 0);  	__restore_sigs(&set); diff --git a/src/unistd/ftruncate.c b/src/unistd/ftruncate.c index b41be0fa..54ff34bc 100644 --- a/src/unistd/ftruncate.c +++ b/src/unistd/ftruncate.c @@ -5,5 +5,3 @@ int ftruncate(int fd, off_t length)  {  	return syscall(SYS_ftruncate, fd, __SYSCALL_LL_O(length));  } - -weak_alias(ftruncate, ftruncate64); diff --git a/src/unistd/isatty.c b/src/unistd/isatty.c index 75a9c186..21222eda 100644 --- a/src/unistd/isatty.c +++ b/src/unistd/isatty.c @@ -6,8 +6,6 @@  int isatty(int fd)  {  	struct winsize wsz; -	unsigned long r = syscall(SYS_ioctl, fd, TIOCGWINSZ, &wsz); -	if (r == 0) return 1; -	if (errno != EBADF) errno = ENOTTY; -	return 0; +	/* +1 converts from error status (0/-1) to boolean (1/0) */ +	return syscall(SYS_ioctl, fd, TIOCGWINSZ, &wsz) + 1;  } diff --git a/src/unistd/lseek.c b/src/unistd/lseek.c index b4984f3e..f5b66682 100644 --- a/src/unistd/lseek.c +++ b/src/unistd/lseek.c @@ -12,4 +12,3 @@ off_t __lseek(int fd, off_t offset, int whence)  }  weak_alias(__lseek, lseek); -weak_alias(__lseek, lseek64); diff --git a/src/unistd/mipsn32/lseek.c b/src/unistd/mipsn32/lseek.c index 60e74a51..0f6cbcaa 100644 --- a/src/unistd/mipsn32/lseek.c +++ b/src/unistd/mipsn32/lseek.c @@ -17,4 +17,3 @@ off_t __lseek(int fd, off_t offset, int whence)  }  weak_alias(__lseek, lseek); -weak_alias(__lseek, lseek64); diff --git a/src/unistd/pause.c b/src/unistd/pause.c index 90bbf4ca..90cc8db5 100644 --- a/src/unistd/pause.c +++ b/src/unistd/pause.c @@ -3,9 +3,5 @@  int pause(void)  { -#ifdef SYS_pause -	return syscall_cp(SYS_pause); -#else -	return syscall_cp(SYS_ppoll, 0, 0, 0, 0); -#endif +	return sys_pause_cp();  } diff --git a/src/unistd/pipe2.c b/src/unistd/pipe2.c index f24f74fb..a096990b 100644 --- a/src/unistd/pipe2.c +++ b/src/unistd/pipe2.c @@ -8,6 +8,7 @@ int pipe2(int fd[2], int flag)  	if (!flag) return pipe(fd);  	int ret = __syscall(SYS_pipe2, fd, flag);  	if (ret != -ENOSYS) return __syscall_ret(ret); +	if (flag & ~(O_CLOEXEC|O_NONBLOCK)) return __syscall_ret(-EINVAL);  	ret = pipe(fd);  	if (ret) return ret;  	if (flag & O_CLOEXEC) { diff --git a/src/unistd/pread.c b/src/unistd/pread.c index 5681b045..b03fb0ad 100644 --- a/src/unistd/pread.c +++ b/src/unistd/pread.c @@ -5,5 +5,3 @@ ssize_t pread(int fd, void *buf, size_t size, off_t ofs)  {  	return syscall_cp(SYS_pread, fd, buf, size, __SYSCALL_LL_PRW(ofs));  } - -weak_alias(pread, pread64); diff --git a/src/unistd/preadv.c b/src/unistd/preadv.c index 8376d60f..890ab403 100644 --- a/src/unistd/preadv.c +++ b/src/unistd/preadv.c @@ -8,5 +8,3 @@ ssize_t preadv(int fd, const struct iovec *iov, int count, off_t ofs)  	return syscall_cp(SYS_preadv, fd, iov, count,  		(long)(ofs), (long)(ofs>>32));  } - -weak_alias(preadv, preadv64); diff --git a/src/unistd/pwrite.c b/src/unistd/pwrite.c index ca376576..a008b3ec 100644 --- a/src/unistd/pwrite.c +++ b/src/unistd/pwrite.c @@ -1,9 +1,18 @@ +#define _GNU_SOURCE  #include <unistd.h> +#include <sys/uio.h> +#include <fcntl.h>  #include "syscall.h"  ssize_t pwrite(int fd, const void *buf, size_t size, off_t ofs)  { +	if (ofs == -1) ofs--; +	int r = __syscall_cp(SYS_pwritev2, fd, +		(&(struct iovec){ .iov_base = (void *)buf, .iov_len = size }), +		1, (long)(ofs), (long)(ofs>>32), RWF_NOAPPEND); +	if (r != -EOPNOTSUPP && r != -ENOSYS) +		return __syscall_ret(r); +	if (fcntl(fd, F_GETFL) & O_APPEND) +		return __syscall_ret(-EOPNOTSUPP);  	return syscall_cp(SYS_pwrite, fd, buf, size, __SYSCALL_LL_PRW(ofs));  } - -weak_alias(pwrite, pwrite64); diff --git a/src/unistd/pwritev.c b/src/unistd/pwritev.c index f5a612c4..44a53d85 100644 --- a/src/unistd/pwritev.c +++ b/src/unistd/pwritev.c @@ -1,12 +1,18 @@ -#define _BSD_SOURCE +#define _GNU_SOURCE  #include <sys/uio.h>  #include <unistd.h> +#include <fcntl.h>  #include "syscall.h"  ssize_t pwritev(int fd, const struct iovec *iov, int count, off_t ofs)  { +	if (ofs == -1) ofs--; +	int r = __syscall_cp(SYS_pwritev2, fd, iov, count, +		(long)(ofs), (long)(ofs>>32), RWF_NOAPPEND); +	if (r != -EOPNOTSUPP && r != -ENOSYS) +		return __syscall_ret(r); +	if (fcntl(fd, F_GETFL) & O_APPEND) +		return __syscall_ret(-EOPNOTSUPP);  	return syscall_cp(SYS_pwritev, fd, iov, count,  		(long)(ofs), (long)(ofs>>32));  } - -weak_alias(pwritev, pwritev64); diff --git a/src/unistd/setxid.c b/src/unistd/setxid.c index 487c1a16..a629ed4b 100644 --- a/src/unistd/setxid.c +++ b/src/unistd/setxid.c @@ -30,5 +30,5 @@ int __setxid(int nr, int id, int eid, int sid)  	 * trigger the safety kill above. */  	struct ctx c = { .nr = nr, .id = id, .eid = eid, .sid = sid, .ret = 1 };  	__synccall(do_setxid, &c); -	return __syscall_ret(c.ret); +	return __syscall_ret(c.ret > 0 ? -EAGAIN : c.ret);  } diff --git a/src/unistd/truncate.c b/src/unistd/truncate.c index 97296800..077351e1 100644 --- a/src/unistd/truncate.c +++ b/src/unistd/truncate.c @@ -5,5 +5,3 @@ int truncate(const char *path, off_t length)  {  	return syscall(SYS_truncate, path, __SYSCALL_LL_O(length));  } - -weak_alias(truncate, truncate64); diff --git a/src/unistd/x32/lseek.c b/src/unistd/x32/lseek.c index 32636429..5f93292f 100644 --- a/src/unistd/x32/lseek.c +++ b/src/unistd/x32/lseek.c @@ -12,4 +12,3 @@ off_t __lseek(int fd, off_t offset, int whence)  }  weak_alias(__lseek, lseek); -weak_alias(__lseek, lseek64); | 
