int pause(void) { #ifdef SYS_pause return syscall_cp(SYS_pause); #else return syscall_cp(SYS_ppoll, 0, 0, 0, 0); #endif }
FILE *fopen(const char *filename, const char *mode) { FILE *f; int fd; int flags; int plus = !!strchr(mode, '+'); /* Check for valid initial mode character */ if (!strchr("rwa", *mode)) { errno = EINVAL; return 0; } /* Compute the flags to pass to open() */ if (plus) flags = O_RDWR; else if (*mode == 'r') flags = O_RDONLY; else flags = O_WRONLY; if (*mode != 'r') flags |= O_CREAT; if (*mode == 'w') flags |= O_TRUNC; if (*mode == 'a') flags |= O_APPEND; fd = syscall_cp(SYS_open, filename, flags|O_LARGEFILE, 0666); if (fd < 0) return 0; f = __fdopen(fd, mode); if (f) return f; __syscall(SYS_close, fd); return 0; }
int sigtimedwait(const sigset_t *mask, siginfo_t *si, const struct timespec *timeout) { int ret; do ret = syscall_cp(SYS_rt_sigtimedwait, mask, si, timeout, __SYSCALL_SSLEN); while (ret<0 && errno==EINTR); return ret; }
ssize_t sendto(int fd, const void* buf, size_t len, int flags, const struct sockaddr* addr, socklen_t alen) { return syscall_cp(SYS_sendto, fd, buf, len, flags, addr, alen); }
int open(const char *filename, int flags, ...) { mode_t mode; va_list ap; va_start(ap, flags); mode = va_arg(ap, mode_t); va_end(ap); return syscall_cp(SYS_open, filename, flags|O_LARGEFILE, mode); }
int openat(int fd, const char* filename, int flags, ...) { mode_t mode = 0; if ((flags & O_CREAT) || (flags & O_TMPFILE) == O_TMPFILE) { va_list ap; va_start(ap, flags); mode = va_arg(ap, mode_t); va_end(ap); } return syscall_cp(SYS_openat, fd, filename, flags | O_LARGEFILE, mode); }
int fcntl(int fd, int cmd, ...) { long arg; va_list ap; va_start(ap, 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_GETOWN) return __syscall(SYS_fcntl, fd, cmd, arg); return syscall(SYS_fcntl, fd, cmd, arg); }
int sendmmsg(int fd, struct mmsghdr *msgvec, unsigned int vlen, unsigned int flags) { #if LONG_MAX > INT_MAX /* Can't use the syscall directly because the kernel has the wrong * idea for the types of msg_iovlen, msg_controllen, and cmsg_len, * and the cmsg blocks cannot be modified in-place. */ int i; if (vlen > IOV_MAX) vlen = IOV_MAX; /* This matches the kernel. */ if (!vlen) return 0; for (i=0; i<vlen; i++) { /* As an unfortunate inconsistency, the sendmmsg API uses * unsigned int for the resulting msg_len, despite sendmsg * returning ssize_t. However Linux limits the total bytes * sent by sendmsg to INT_MAX, so the assignment is safe. */ ssize_t r = sendmsg(fd, &msgvec[i].msg_hdr, flags); if (r < 0) goto error; msgvec[i].msg_len = r; } error: return i ? i : -1; #else return syscall_cp(SYS_sendmmsg, fd, msgvec, vlen, flags); #endif }
ssize_t writev(int fd, const struct iovec *iov, int count) { return syscall_cp(SYS_writev, fd, iov, count); }
ssize_t mq_timedreceive(mqd_t mqd, char *msg, size_t len, unsigned *prio, const struct timespec *at) { return syscall_cp(SYS_mq_timedreceive, mqd, msg, len, prio, at); }
int poll(struct pollfd *fds, nfds_t n, int timeout) { return syscall_cp(SYS_poll, fds, n, timeout); }
pid_t waitpid(pid_t pid, int *status, int options) { return syscall_cp(SYS_wait4, pid, status, options, 0); }
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)); }
int mq_timedsend(mqd_t mqd, const char *msg, size_t len, unsigned prio, const struct timespec *at) { return syscall_cp(SYS_mq_timedsend, mqd, msg, len, prio, at); }
#define _GNU_SOURCE #include <sys/socket.h> #include <errno.h> #include <fcntl.h> #include "syscall.h" #include "libc.h" int accept4(int fd, struct sockaddr* restrict addr, socklen_t* restrict len, int flg) { if (!flg) return accept(fd, addr, len); int ret = syscall_cp(SYS_accept4, fd, addr, len, flg, 0, 0); if (ret >= 0 || (errno != ENOSYS && errno != EINVAL)) return ret; ret = accept(fd, addr, len); if (ret < 0) return ret; if (flg & SOCK_CLOEXEC) __syscall(SYS_fcntl, ret, F_SETFD, FD_CLOEXEC); if (flg & SOCK_NONBLOCK) __syscall(SYS_fcntl, ret, F_SETFL, O_NONBLOCK); return ret; }
int select(int n, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *tv) { return syscall_cp(SYS_select, n, rfds, wfds, efds, tv); }
ssize_t read(int fd, void *buf, size_t count) { return syscall_cp(SYS_read, fd, buf, count); }