diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2019-07-15 20:46:12 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-07-15 20:46:12 -0400 |
| commit | 3f4abe97bdbe666dbb3532c14a97e414aae4caca (patch) | |
| tree | ba08f2f14e79a8c8f7e83cea0344826fefffd9a2 /lib/libc/musl/src/linux | |
| parent | 33eaaadd01b20d1327b67758664ce1265216e471 (diff) | |
| parent | aff90c22520bbbadd56fbfd1378f161ee8a3cdb2 (diff) | |
| download | zig-3f4abe97bdbe666dbb3532c14a97e414aae4caca.tar.gz zig-3f4abe97bdbe666dbb3532c14a97e414aae4caca.zip | |
Merge pull request #2892 from ziglang/install-with-zig-build
move some of the installation from cmake to zig build
Diffstat (limited to 'lib/libc/musl/src/linux')
62 files changed, 813 insertions, 0 deletions
diff --git a/lib/libc/musl/src/linux/adjtime.c b/lib/libc/musl/src/linux/adjtime.c new file mode 100644 index 0000000000..fa8af9f021 --- /dev/null +++ b/lib/libc/musl/src/linux/adjtime.c @@ -0,0 +1,27 @@ +#define _GNU_SOURCE +#include <sys/time.h> +#include <sys/timex.h> +#include <errno.h> +#include "syscall.h" + +int adjtime(const struct timeval *in, struct timeval *out) +{ + struct timex tx = { 0 }; + if (in) { + if (in->tv_sec > 1000 || in->tv_usec > 1000000000) { + errno = EINVAL; + return -1; + } + tx.offset = in->tv_sec*1000000 + in->tv_usec; + tx.modes = ADJ_OFFSET_SINGLESHOT; + } + if (syscall(SYS_adjtimex, &tx) < 0) return -1; + if (out) { + out->tv_sec = tx.offset / 1000000; + if ((out->tv_usec = tx.offset % 1000000) < 0) { + out->tv_sec--; + out->tv_usec += 1000000; + } + } + return 0; +} diff --git a/lib/libc/musl/src/linux/adjtimex.c b/lib/libc/musl/src/linux/adjtimex.c new file mode 100644 index 0000000000..91de6824c3 --- /dev/null +++ b/lib/libc/musl/src/linux/adjtimex.c @@ -0,0 +1,7 @@ +#include <sys/timex.h> +#include "syscall.h" + +int adjtimex(struct timex *tx) +{ + return syscall(SYS_adjtimex, tx); +} diff --git a/lib/libc/musl/src/linux/arch_prctl.c b/lib/libc/musl/src/linux/arch_prctl.c new file mode 100644 index 0000000000..94603658ab --- /dev/null +++ b/lib/libc/musl/src/linux/arch_prctl.c @@ -0,0 +1,7 @@ +#include "syscall.h" +#ifdef SYS_arch_prctl +int arch_prctl(int code, unsigned long addr) +{ + return syscall(SYS_arch_prctl, code, addr); +} +#endif diff --git a/lib/libc/musl/src/linux/brk.c b/lib/libc/musl/src/linux/brk.c new file mode 100644 index 0000000000..a6173e07f3 --- /dev/null +++ b/lib/libc/musl/src/linux/brk.c @@ -0,0 +1,9 @@ +#define _BSD_SOURCE +#include <unistd.h> +#include <errno.h> +#include "syscall.h" + +int brk(void *end) +{ + return __syscall_ret(-ENOMEM); +} diff --git a/lib/libc/musl/src/linux/cache.c b/lib/libc/musl/src/linux/cache.c new file mode 100644 index 0000000000..84a138a415 --- /dev/null +++ b/lib/libc/musl/src/linux/cache.c @@ -0,0 +1,17 @@ +#include "syscall.h" + +#ifdef SYS_cacheflush +int _flush_cache(void *addr, int len, int op) +{ + return syscall(SYS_cacheflush, addr, len, op); +} +weak_alias(_flush_cache, cacheflush); +#endif + +#ifdef SYS_cachectl +int __cachectl(void *addr, int len, int op) +{ + return syscall(SYS_cachectl, addr, len, op); +} +weak_alias(__cachectl, cachectl); +#endif diff --git a/lib/libc/musl/src/linux/cap.c b/lib/libc/musl/src/linux/cap.c new file mode 100644 index 0000000000..8d035e07a4 --- /dev/null +++ b/lib/libc/musl/src/linux/cap.c @@ -0,0 +1,11 @@ +#include "syscall.h" + +int capset(void *a, void *b) +{ + return syscall(SYS_capset, a, b); +} + +int capget(void *a, void *b) +{ + return syscall(SYS_capget, a, b); +} diff --git a/lib/libc/musl/src/linux/chroot.c b/lib/libc/musl/src/linux/chroot.c new file mode 100644 index 0000000000..0e69f145de --- /dev/null +++ b/lib/libc/musl/src/linux/chroot.c @@ -0,0 +1,8 @@ +#define _GNU_SOURCE +#include <unistd.h> +#include "syscall.h" + +int chroot(const char *path) +{ + return syscall(SYS_chroot, path); +} diff --git a/lib/libc/musl/src/linux/clock_adjtime.c b/lib/libc/musl/src/linux/clock_adjtime.c new file mode 100644 index 0000000000..056ad6d341 --- /dev/null +++ b/lib/libc/musl/src/linux/clock_adjtime.c @@ -0,0 +1,7 @@ +#include <sys/timex.h> +#include "syscall.h" + +int clock_adjtime (clockid_t clock_id, struct timex *utx) +{ + return syscall(SYS_clock_adjtime, clock_id, utx); +} diff --git a/lib/libc/musl/src/linux/clone.c b/lib/libc/musl/src/linux/clone.c new file mode 100644 index 0000000000..8c1af7d3dc --- /dev/null +++ b/lib/libc/musl/src/linux/clone.c @@ -0,0 +1,21 @@ +#define _GNU_SOURCE +#include <stdarg.h> +#include <unistd.h> +#include <sched.h> +#include "pthread_impl.h" +#include "syscall.h" + +int clone(int (*func)(void *), void *stack, int flags, void *arg, ...) +{ + va_list ap; + pid_t *ptid, *ctid; + void *tls; + + va_start(ap, arg); + ptid = va_arg(ap, pid_t *); + tls = va_arg(ap, void *); + ctid = va_arg(ap, pid_t *); + va_end(ap); + + return __syscall_ret(__clone(func, stack, flags, arg, ptid, tls, ctid)); +} diff --git a/lib/libc/musl/src/linux/epoll.c b/lib/libc/musl/src/linux/epoll.c new file mode 100644 index 0000000000..deff5b101a --- /dev/null +++ b/lib/libc/musl/src/linux/epoll.c @@ -0,0 +1,37 @@ +#include <sys/epoll.h> +#include <signal.h> +#include <errno.h> +#include "syscall.h" + +int epoll_create(int size) +{ + return epoll_create1(0); +} + +int epoll_create1(int flags) +{ + int r = __syscall(SYS_epoll_create1, flags); +#ifdef SYS_epoll_create + if (r==-ENOSYS && !flags) r = __syscall(SYS_epoll_create, 1); +#endif + return __syscall_ret(r); +} + +int epoll_ctl(int fd, int op, int fd2, struct epoll_event *ev) +{ + return syscall(SYS_epoll_ctl, fd, op, fd2, ev); +} + +int epoll_pwait(int fd, struct epoll_event *ev, int cnt, int to, const sigset_t *sigs) +{ + int r = __syscall(SYS_epoll_pwait, fd, ev, cnt, to, sigs, _NSIG/8); +#ifdef SYS_epoll_wait + if (r==-ENOSYS && !sigs) r = __syscall(SYS_epoll_wait, fd, ev, cnt, to); +#endif + return __syscall_ret(r); +} + +int epoll_wait(int fd, struct epoll_event *ev, int cnt, int to) +{ + return epoll_pwait(fd, ev, cnt, to, 0); +} diff --git a/lib/libc/musl/src/linux/eventfd.c b/lib/libc/musl/src/linux/eventfd.c new file mode 100644 index 0000000000..68e489c836 --- /dev/null +++ b/lib/libc/musl/src/linux/eventfd.c @@ -0,0 +1,23 @@ +#include <sys/eventfd.h> +#include <unistd.h> +#include <errno.h> +#include "syscall.h" + +int eventfd(unsigned int count, int flags) +{ + int r = __syscall(SYS_eventfd2, count, flags); +#ifdef SYS_eventfd + if (r==-ENOSYS && !flags) r = __syscall(SYS_eventfd, count); +#endif + return __syscall_ret(r); +} + +int eventfd_read(int fd, eventfd_t *value) +{ + return (sizeof(*value) == read(fd, value, sizeof(*value))) ? 0 : -1; +} + +int eventfd_write(int fd, eventfd_t value) +{ + return (sizeof(value) == write(fd, &value, sizeof(value))) ? 0 : -1; +} diff --git a/lib/libc/musl/src/linux/fallocate.c b/lib/libc/musl/src/linux/fallocate.c new file mode 100644 index 0000000000..7d68bc8f64 --- /dev/null +++ b/lib/libc/musl/src/linux/fallocate.c @@ -0,0 +1,12 @@ +#define _GNU_SOURCE +#include <fcntl.h> +#include "syscall.h" + +int fallocate(int fd, int mode, off_t base, off_t len) +{ + return syscall(SYS_fallocate, fd, mode, __SYSCALL_LL_E(base), + __SYSCALL_LL_E(len)); +} + +#undef fallocate64 +weak_alias(fallocate, fallocate64); diff --git a/lib/libc/musl/src/linux/fanotify.c b/lib/libc/musl/src/linux/fanotify.c new file mode 100644 index 0000000000..c6211afc00 --- /dev/null +++ b/lib/libc/musl/src/linux/fanotify.c @@ -0,0 +1,14 @@ +#include "syscall.h" +#include <sys/fanotify.h> + +int fanotify_init(unsigned flags, unsigned event_f_flags) +{ + return syscall(SYS_fanotify_init, flags, event_f_flags); +} + +int fanotify_mark(int fanotify_fd, unsigned flags, unsigned long long mask, + int dfd, const char *pathname) +{ + return syscall(SYS_fanotify_mark, fanotify_fd, flags, __SYSCALL_LL_E(mask), dfd, pathname); +} + diff --git a/lib/libc/musl/src/linux/flock.c b/lib/libc/musl/src/linux/flock.c new file mode 100644 index 0000000000..87aa5cfed2 --- /dev/null +++ b/lib/libc/musl/src/linux/flock.c @@ -0,0 +1,7 @@ +#include <sys/file.h> +#include "syscall.h" + +int flock(int fd, int op) +{ + return syscall(SYS_flock, fd, op); +} diff --git a/lib/libc/musl/src/linux/getdents.c b/lib/libc/musl/src/linux/getdents.c new file mode 100644 index 0000000000..de6de3b425 --- /dev/null +++ b/lib/libc/musl/src/linux/getdents.c @@ -0,0 +1,10 @@ +#define _BSD_SOURCE +#include <dirent.h> +#include "syscall.h" + +int getdents(int fd, struct dirent *buf, size_t len) +{ + return syscall(SYS_getdents, fd, buf, len); +} + +weak_alias(getdents, getdents64); diff --git a/lib/libc/musl/src/linux/getrandom.c b/lib/libc/musl/src/linux/getrandom.c new file mode 100644 index 0000000000..6cc6f6b047 --- /dev/null +++ b/lib/libc/musl/src/linux/getrandom.c @@ -0,0 +1,7 @@ +#include <sys/random.h> +#include "syscall.h" + +ssize_t getrandom(void *buf, size_t buflen, unsigned flags) +{ + return syscall_cp(SYS_getrandom, buf, buflen, flags); +} diff --git a/lib/libc/musl/src/linux/inotify.c b/lib/libc/musl/src/linux/inotify.c new file mode 100644 index 0000000000..df5e48b31b --- /dev/null +++ b/lib/libc/musl/src/linux/inotify.c @@ -0,0 +1,26 @@ +#include <sys/inotify.h> +#include <errno.h> +#include "syscall.h" + +int inotify_init() +{ + return inotify_init1(0); +} +int inotify_init1(int flags) +{ + int r = __syscall(SYS_inotify_init1, flags); +#ifdef SYS_inotify_init + if (r==-ENOSYS && !flags) r = __syscall(SYS_inotify_init); +#endif + return __syscall_ret(r); +} + +int inotify_add_watch(int fd, const char *pathname, uint32_t mask) +{ + return syscall(SYS_inotify_add_watch, fd, pathname, mask); +} + +int inotify_rm_watch(int fd, int wd) +{ + return syscall(SYS_inotify_rm_watch, fd, wd); +} diff --git a/lib/libc/musl/src/linux/ioperm.c b/lib/libc/musl/src/linux/ioperm.c new file mode 100644 index 0000000000..08c6d8b86c --- /dev/null +++ b/lib/libc/musl/src/linux/ioperm.c @@ -0,0 +1,10 @@ +#include "syscall.h" + +#ifdef SYS_ioperm +#include <sys/io.h> + +int ioperm(unsigned long from, unsigned long num, int turn_on) +{ + return syscall(SYS_ioperm, from, num, turn_on); +} +#endif diff --git a/lib/libc/musl/src/linux/iopl.c b/lib/libc/musl/src/linux/iopl.c new file mode 100644 index 0000000000..835d3d4ed5 --- /dev/null +++ b/lib/libc/musl/src/linux/iopl.c @@ -0,0 +1,10 @@ +#include "syscall.h" + +#ifdef SYS_iopl +#include <sys/io.h> + +int iopl(int level) +{ + return syscall(SYS_iopl, level); +} +#endif diff --git a/lib/libc/musl/src/linux/klogctl.c b/lib/libc/musl/src/linux/klogctl.c new file mode 100644 index 0000000000..8102ee641c --- /dev/null +++ b/lib/libc/musl/src/linux/klogctl.c @@ -0,0 +1,7 @@ +#include <sys/klog.h> +#include "syscall.h" + +int klogctl (int type, char *buf, int len) +{ + return syscall(SYS_syslog, type, buf, len); +} diff --git a/lib/libc/musl/src/linux/memfd_create.c b/lib/libc/musl/src/linux/memfd_create.c new file mode 100644 index 0000000000..1649fe5548 --- /dev/null +++ b/lib/libc/musl/src/linux/memfd_create.c @@ -0,0 +1,8 @@ +#define _GNU_SOURCE 1 +#include <sys/mman.h> +#include "syscall.h" + +int memfd_create(const char *name, unsigned flags) +{ + return syscall(SYS_memfd_create, name, flags); +} diff --git a/lib/libc/musl/src/linux/mlock2.c b/lib/libc/musl/src/linux/mlock2.c new file mode 100644 index 0000000000..10132742d0 --- /dev/null +++ b/lib/libc/musl/src/linux/mlock2.c @@ -0,0 +1,10 @@ +#define _GNU_SOURCE 1 +#include <sys/mman.h> +#include "syscall.h" + +int mlock2(const void *addr, size_t len, unsigned flags) +{ + if (flags == 0) + return mlock(addr, len); + return syscall(SYS_mlock2, addr, len, flags); +} diff --git a/lib/libc/musl/src/linux/module.c b/lib/libc/musl/src/linux/module.c new file mode 100644 index 0000000000..33f69a0006 --- /dev/null +++ b/lib/libc/musl/src/linux/module.c @@ -0,0 +1,11 @@ +#include "syscall.h" + +int init_module(void *a, unsigned long b, const char *c) +{ + return syscall(SYS_init_module, a, b, c); +} + +int delete_module(const char *a, unsigned b) +{ + return syscall(SYS_delete_module, a, b); +} diff --git a/lib/libc/musl/src/linux/mount.c b/lib/libc/musl/src/linux/mount.c new file mode 100644 index 0000000000..34e11af120 --- /dev/null +++ b/lib/libc/musl/src/linux/mount.c @@ -0,0 +1,17 @@ +#include <sys/mount.h> +#include "syscall.h" + +int mount(const char *special, const char *dir, const char *fstype, unsigned long flags, const void *data) +{ + return syscall(SYS_mount, special, dir, fstype, flags, data); +} + +int umount(const char *special) +{ + return syscall(SYS_umount2, special, 0); +} + +int umount2(const char *special, int flags) +{ + return syscall(SYS_umount2, special, flags); +} diff --git a/lib/libc/musl/src/linux/name_to_handle_at.c b/lib/libc/musl/src/linux/name_to_handle_at.c new file mode 100644 index 0000000000..cd4075bd7e --- /dev/null +++ b/lib/libc/musl/src/linux/name_to_handle_at.c @@ -0,0 +1,10 @@ +#define _GNU_SOURCE +#include <fcntl.h> +#include "syscall.h" + +int name_to_handle_at(int dirfd, const char *pathname, + struct file_handle *handle, int *mount_id, int flags) +{ + return syscall(SYS_name_to_handle_at, dirfd, + pathname, handle, mount_id, flags); +} diff --git a/lib/libc/musl/src/linux/open_by_handle_at.c b/lib/libc/musl/src/linux/open_by_handle_at.c new file mode 100644 index 0000000000..1c9b6a2be4 --- /dev/null +++ b/lib/libc/musl/src/linux/open_by_handle_at.c @@ -0,0 +1,8 @@ +#define _GNU_SOURCE +#include <fcntl.h> +#include "syscall.h" + +int open_by_handle_at(int mount_fd, struct file_handle *handle, int flags) +{ + return syscall(SYS_open_by_handle_at, mount_fd, handle, flags); +} diff --git a/lib/libc/musl/src/linux/personality.c b/lib/libc/musl/src/linux/personality.c new file mode 100644 index 0000000000..e00cf7997f --- /dev/null +++ b/lib/libc/musl/src/linux/personality.c @@ -0,0 +1,8 @@ +#include <sys/personality.h> +#include "syscall.h" +#ifdef SYS_personality +int personality(unsigned long persona) +{ + return syscall(SYS_personality, persona); +} +#endif diff --git a/lib/libc/musl/src/linux/pivot_root.c b/lib/libc/musl/src/linux/pivot_root.c new file mode 100644 index 0000000000..17e70c916e --- /dev/null +++ b/lib/libc/musl/src/linux/pivot_root.c @@ -0,0 +1,6 @@ +#include "syscall.h" + +int pivot_root(const char *new, const char *old) +{ + return syscall(SYS_pivot_root, new, old); +} diff --git a/lib/libc/musl/src/linux/ppoll.c b/lib/libc/musl/src/linux/ppoll.c new file mode 100644 index 0000000000..9e262477ba --- /dev/null +++ b/lib/libc/musl/src/linux/ppoll.c @@ -0,0 +1,10 @@ +#define _GNU_SOURCE +#include <poll.h> +#include <signal.h> +#include "syscall.h" + +int ppoll(struct pollfd *fds, nfds_t n, const struct timespec *to, const sigset_t *mask) +{ + return syscall_cp(SYS_ppoll, fds, n, + to ? (struct timespec []){*to} : 0, mask, _NSIG/8); +} diff --git a/lib/libc/musl/src/linux/prctl.c b/lib/libc/musl/src/linux/prctl.c new file mode 100644 index 0000000000..19f4267cde --- /dev/null +++ b/lib/libc/musl/src/linux/prctl.c @@ -0,0 +1,14 @@ +#include <sys/prctl.h> +#include <stdarg.h> +#include "syscall.h" + +int prctl(int op, ...) +{ + unsigned long x[4]; + int i; + va_list ap; + va_start(ap, op); + for (i=0; i<4; i++) x[i] = va_arg(ap, unsigned long); + va_end(ap); + return syscall(SYS_prctl, op, x[0], x[1], x[2], x[3]); +} diff --git a/lib/libc/musl/src/linux/prlimit.c b/lib/libc/musl/src/linux/prlimit.c new file mode 100644 index 0000000000..3df9ffba7a --- /dev/null +++ b/lib/libc/musl/src/linux/prlimit.c @@ -0,0 +1,26 @@ +#define _GNU_SOURCE +#include <sys/resource.h> +#include "syscall.h" + +#define FIX(x) do{ if ((x)>=SYSCALL_RLIM_INFINITY) (x)=RLIM_INFINITY; }while(0) + +int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit) +{ + struct rlimit tmp; + int r; + if (new_limit && SYSCALL_RLIM_INFINITY != RLIM_INFINITY) { + tmp = *new_limit; + FIX(tmp.rlim_cur); + FIX(tmp.rlim_max); + new_limit = &tmp; + } + r = syscall(SYS_prlimit64, pid, resource, new_limit, old_limit); + if (!r && old_limit && SYSCALL_RLIM_INFINITY != RLIM_INFINITY) { + FIX(old_limit->rlim_cur); + FIX(old_limit->rlim_max); + } + return r; +} + +#undef prlimit64 +weak_alias(prlimit, prlimit64); diff --git a/lib/libc/musl/src/linux/process_vm.c b/lib/libc/musl/src/linux/process_vm.c new file mode 100644 index 0000000000..7703bdf0c9 --- /dev/null +++ b/lib/libc/musl/src/linux/process_vm.c @@ -0,0 +1,13 @@ +#define _GNU_SOURCE +#include <sys/uio.h> +#include "syscall.h" + +ssize_t process_vm_writev(pid_t pid, const struct iovec *lvec, unsigned long liovcnt, const struct iovec *rvec, unsigned long riovcnt, unsigned long flags) +{ + return syscall(SYS_process_vm_writev, pid, lvec, liovcnt, rvec, riovcnt, flags); +} + +ssize_t process_vm_readv(pid_t pid, const struct iovec *lvec, unsigned long liovcnt, const struct iovec *rvec, unsigned long riovcnt, unsigned long flags) +{ + return syscall(SYS_process_vm_readv, pid, lvec, liovcnt, rvec, riovcnt, flags); +} diff --git a/lib/libc/musl/src/linux/ptrace.c b/lib/libc/musl/src/linux/ptrace.c new file mode 100644 index 0000000000..a3f393d956 --- /dev/null +++ b/lib/libc/musl/src/linux/ptrace.c @@ -0,0 +1,29 @@ +#include <sys/ptrace.h> +#include <stdarg.h> +#include <unistd.h> +#include "syscall.h" + +long ptrace(int req, ...) +{ + va_list ap; + pid_t pid; + void *addr, *data, *addr2 = 0; + long ret, result; + + va_start(ap, req); + pid = va_arg(ap, pid_t); + addr = va_arg(ap, void *); + data = va_arg(ap, void *); + /* PTRACE_{READ,WRITE}{DATA,TEXT} (16...19) are specific to SPARC. */ +#ifdef PTRACE_READDATA + if ((unsigned)req - PTRACE_READDATA < 4) + addr2 = va_arg(ap, void *); +#endif + va_end(ap); + + if (req-1U < 3) data = &result; + ret = syscall(SYS_ptrace, req, pid, addr, data, addr2); + + if (ret < 0 || req-1U >= 3) return ret; + return result; +} diff --git a/lib/libc/musl/src/linux/quotactl.c b/lib/libc/musl/src/linux/quotactl.c new file mode 100644 index 0000000000..344eb0d169 --- /dev/null +++ b/lib/libc/musl/src/linux/quotactl.c @@ -0,0 +1,7 @@ +#include <sys/quota.h> +#include "syscall.h" + +int quotactl(int cmd, const char *special, int id, char *addr) +{ + return syscall(SYS_quotactl, cmd, special, id, addr); +} diff --git a/lib/libc/musl/src/linux/readahead.c b/lib/libc/musl/src/linux/readahead.c new file mode 100644 index 0000000000..5c70bfd6e1 --- /dev/null +++ b/lib/libc/musl/src/linux/readahead.c @@ -0,0 +1,8 @@ +#define _GNU_SOURCE +#include <fcntl.h> +#include "syscall.h" + +ssize_t readahead(int fd, off_t pos, size_t len) +{ + return syscall(SYS_readahead, fd, __SYSCALL_LL_O(pos), len); +} diff --git a/lib/libc/musl/src/linux/reboot.c b/lib/libc/musl/src/linux/reboot.c new file mode 100644 index 0000000000..7f12af79bc --- /dev/null +++ b/lib/libc/musl/src/linux/reboot.c @@ -0,0 +1,7 @@ +#include <sys/reboot.h> +#include "syscall.h" + +int reboot(int type) +{ + return syscall(SYS_reboot, 0xfee1dead, 672274793, type); +} diff --git a/lib/libc/musl/src/linux/remap_file_pages.c b/lib/libc/musl/src/linux/remap_file_pages.c new file mode 100644 index 0000000000..a9699ce2e4 --- /dev/null +++ b/lib/libc/musl/src/linux/remap_file_pages.c @@ -0,0 +1,8 @@ +#define _GNU_SOURCE +#include <sys/mman.h> +#include "syscall.h" + +int remap_file_pages(void *addr, size_t size, int prot, size_t pgoff, int flags) +{ + return syscall(SYS_remap_file_pages, addr, size, prot, pgoff, flags); +} diff --git a/lib/libc/musl/src/linux/sbrk.c b/lib/libc/musl/src/linux/sbrk.c new file mode 100644 index 0000000000..bb86630584 --- /dev/null +++ b/lib/libc/musl/src/linux/sbrk.c @@ -0,0 +1,11 @@ +#define _BSD_SOURCE +#include <unistd.h> +#include <stdint.h> +#include <errno.h> +#include "syscall.h" + +void *sbrk(intptr_t inc) +{ + if (inc) return (void *)__syscall_ret(-ENOMEM); + return (void *)__syscall(SYS_brk, 0); +} diff --git a/lib/libc/musl/src/linux/sendfile.c b/lib/libc/musl/src/linux/sendfile.c new file mode 100644 index 0000000000..9afe6dd61c --- /dev/null +++ b/lib/libc/musl/src/linux/sendfile.c @@ -0,0 +1,9 @@ +#include <sys/sendfile.h> +#include "syscall.h" + +ssize_t sendfile(int out_fd, int in_fd, off_t *ofs, size_t count) +{ + return syscall(SYS_sendfile, out_fd, in_fd, ofs, count); +} + +weak_alias(sendfile, sendfile64); diff --git a/lib/libc/musl/src/linux/setfsgid.c b/lib/libc/musl/src/linux/setfsgid.c new file mode 100644 index 0000000000..e29d9c0069 --- /dev/null +++ b/lib/libc/musl/src/linux/setfsgid.c @@ -0,0 +1,7 @@ +#include <sys/fsuid.h> +#include "syscall.h" + +int setfsgid(gid_t gid) +{ + return syscall(SYS_setfsgid, gid); +} diff --git a/lib/libc/musl/src/linux/setfsuid.c b/lib/libc/musl/src/linux/setfsuid.c new file mode 100644 index 0000000000..1bae44186f --- /dev/null +++ b/lib/libc/musl/src/linux/setfsuid.c @@ -0,0 +1,7 @@ +#include <sys/fsuid.h> +#include "syscall.h" + +int setfsuid(uid_t uid) +{ + return syscall(SYS_setfsuid, uid); +} diff --git a/lib/libc/musl/src/linux/setgroups.c b/lib/libc/musl/src/linux/setgroups.c new file mode 100644 index 0000000000..1248fdbfdc --- /dev/null +++ b/lib/libc/musl/src/linux/setgroups.c @@ -0,0 +1,8 @@ +#define _GNU_SOURCE +#include <unistd.h> +#include "syscall.h" + +int setgroups(size_t count, const gid_t list[]) +{ + return syscall(SYS_setgroups, count, list); +} diff --git a/lib/libc/musl/src/linux/sethostname.c b/lib/libc/musl/src/linux/sethostname.c new file mode 100644 index 0000000000..9313b32455 --- /dev/null +++ b/lib/libc/musl/src/linux/sethostname.c @@ -0,0 +1,8 @@ +#define _GNU_SOURCE +#include <unistd.h> +#include "syscall.h" + +int sethostname(const char *name, size_t len) +{ + return syscall(SYS_sethostname, name, len); +} diff --git a/lib/libc/musl/src/linux/setns.c b/lib/libc/musl/src/linux/setns.c new file mode 100644 index 0000000000..0afec813f1 --- /dev/null +++ b/lib/libc/musl/src/linux/setns.c @@ -0,0 +1,8 @@ +#define _GNU_SOURCE +#include <sched.h> +#include "syscall.h" + +int setns(int fd, int nstype) +{ + return syscall(SYS_setns, fd, nstype); +} diff --git a/lib/libc/musl/src/linux/settimeofday.c b/lib/libc/musl/src/linux/settimeofday.c new file mode 100644 index 0000000000..15c18c6379 --- /dev/null +++ b/lib/libc/musl/src/linux/settimeofday.c @@ -0,0 +1,8 @@ +#define _BSD_SOURCE +#include <sys/time.h> +#include "syscall.h" + +int settimeofday(const struct timeval *tv, const struct timezone *tz) +{ + return syscall(SYS_settimeofday, tv, 0); +} diff --git a/lib/libc/musl/src/linux/signalfd.c b/lib/libc/musl/src/linux/signalfd.c new file mode 100644 index 0000000000..4bf43326fe --- /dev/null +++ b/lib/libc/musl/src/linux/signalfd.c @@ -0,0 +1,21 @@ +#include <sys/signalfd.h> +#include <signal.h> +#include <errno.h> +#include <fcntl.h> +#include "syscall.h" + +int signalfd(int fd, const sigset_t *sigs, int flags) +{ + int ret = __syscall(SYS_signalfd4, fd, sigs, _NSIG/8, flags); +#ifdef SYS_signalfd + if (ret != -ENOSYS) return __syscall_ret(ret); + ret = __syscall(SYS_signalfd, fd, sigs, _NSIG/8); + if (ret >= 0) { + if (flags & SFD_CLOEXEC) + __syscall(SYS_fcntl, ret, F_SETFD, FD_CLOEXEC); + if (flags & SFD_NONBLOCK) + __syscall(SYS_fcntl, ret, F_SETFL, O_NONBLOCK); + } +#endif + return __syscall_ret(ret); +} diff --git a/lib/libc/musl/src/linux/splice.c b/lib/libc/musl/src/linux/splice.c new file mode 100644 index 0000000000..78b6220d8e --- /dev/null +++ b/lib/libc/musl/src/linux/splice.c @@ -0,0 +1,8 @@ +#define _GNU_SOURCE +#include <fcntl.h> +#include "syscall.h" + +ssize_t splice(int fd_in, off_t *off_in, int fd_out, off_t *off_out, size_t len, unsigned flags) +{ + return syscall(SYS_splice, fd_in, off_in, fd_out, off_out, len, flags); +} diff --git a/lib/libc/musl/src/linux/stime.c b/lib/libc/musl/src/linux/stime.c new file mode 100644 index 0000000000..7d0443ba3b --- /dev/null +++ b/lib/libc/musl/src/linux/stime.c @@ -0,0 +1,9 @@ +#define _GNU_SOURCE +#include <time.h> +#include <sys/time.h> + +int stime(const time_t *t) +{ + struct timeval tv = { .tv_sec = *t, .tv_usec = 0 }; + return settimeofday(&tv, (void *)0); +} diff --git a/lib/libc/musl/src/linux/swap.c b/lib/libc/musl/src/linux/swap.c new file mode 100644 index 0000000000..8137d51ebf --- /dev/null +++ b/lib/libc/musl/src/linux/swap.c @@ -0,0 +1,12 @@ +#include <sys/swap.h> +#include "syscall.h" + +int swapon(const char *path, int flags) +{ + return syscall(SYS_swapon, path, flags); +} + +int swapoff(const char *path) +{ + return syscall(SYS_swapoff, path); +} diff --git a/lib/libc/musl/src/linux/sync_file_range.c b/lib/libc/musl/src/linux/sync_file_range.c new file mode 100644 index 0000000000..6859abc05d --- /dev/null +++ b/lib/libc/musl/src/linux/sync_file_range.c @@ -0,0 +1,17 @@ +#define _GNU_SOURCE +#include <fcntl.h> +#include <errno.h> +#include "syscall.h" + +int sync_file_range(int fd, off_t pos, off_t len, unsigned flags) +{ +#if defined(SYS_sync_file_range2) + return syscall(SYS_sync_file_range2, fd, flags, + __SYSCALL_LL_E(pos), __SYSCALL_LL_E(len)); +#elif defined(SYS_sync_file_range) + return syscall(SYS_sync_file_range, fd, + __SYSCALL_LL_O(pos), __SYSCALL_LL_E(len), flags); +#else + return __syscall_ret(-ENOSYS); +#endif +} diff --git a/lib/libc/musl/src/linux/syncfs.c b/lib/libc/musl/src/linux/syncfs.c new file mode 100644 index 0000000000..bc7d301e51 --- /dev/null +++ b/lib/libc/musl/src/linux/syncfs.c @@ -0,0 +1,8 @@ +#define _GNU_SOURCE +#include <unistd.h> +#include "syscall.h" + +int syncfs(int fd) +{ + return syscall(SYS_syncfs, fd); +} diff --git a/lib/libc/musl/src/linux/sysinfo.c b/lib/libc/musl/src/linux/sysinfo.c new file mode 100644 index 0000000000..db86476d0f --- /dev/null +++ b/lib/libc/musl/src/linux/sysinfo.c @@ -0,0 +1,9 @@ +#include <sys/sysinfo.h> +#include "syscall.h" + +int __lsysinfo(struct sysinfo *info) +{ + return syscall(SYS_sysinfo, info); +} + +weak_alias(__lsysinfo, sysinfo); diff --git a/lib/libc/musl/src/linux/tee.c b/lib/libc/musl/src/linux/tee.c new file mode 100644 index 0000000000..a24748cfb0 --- /dev/null +++ b/lib/libc/musl/src/linux/tee.c @@ -0,0 +1,8 @@ +#define _GNU_SOURCE +#include <fcntl.h> +#include "syscall.h" + +ssize_t tee(int src, int dest, size_t len, unsigned flags) +{ + return syscall(SYS_tee, src, dest, len, flags); +} diff --git a/lib/libc/musl/src/linux/timerfd.c b/lib/libc/musl/src/linux/timerfd.c new file mode 100644 index 0000000000..62cc277365 --- /dev/null +++ b/lib/libc/musl/src/linux/timerfd.c @@ -0,0 +1,17 @@ +#include <sys/timerfd.h> +#include "syscall.h" + +int timerfd_create(int clockid, int flags) +{ + return syscall(SYS_timerfd_create, clockid, flags); +} + +int timerfd_settime(int fd, int flags, const struct itimerspec *new, struct itimerspec *old) +{ + return syscall(SYS_timerfd_settime, fd, flags, new, old); +} + +int timerfd_gettime(int fd, struct itimerspec *cur) +{ + return syscall(SYS_timerfd_gettime, fd, cur); +} diff --git a/lib/libc/musl/src/linux/unshare.c b/lib/libc/musl/src/linux/unshare.c new file mode 100644 index 0000000000..3861db3b20 --- /dev/null +++ b/lib/libc/musl/src/linux/unshare.c @@ -0,0 +1,8 @@ +#define _GNU_SOURCE +#include <sched.h> +#include "syscall.h" + +int unshare(int flags) +{ + return syscall(SYS_unshare, flags); +} diff --git a/lib/libc/musl/src/linux/utimes.c b/lib/libc/musl/src/linux/utimes.c new file mode 100644 index 0000000000..6ca025d95a --- /dev/null +++ b/lib/libc/musl/src/linux/utimes.c @@ -0,0 +1,8 @@ +#include <sys/time.h> +#include "fcntl.h" +#include "syscall.h" + +int utimes(const char *path, const struct timeval times[2]) +{ + return __futimesat(AT_FDCWD, path, times); +} diff --git a/lib/libc/musl/src/linux/vhangup.c b/lib/libc/musl/src/linux/vhangup.c new file mode 100644 index 0000000000..0203071506 --- /dev/null +++ b/lib/libc/musl/src/linux/vhangup.c @@ -0,0 +1,8 @@ +#define _GNU_SOURCE +#include <unistd.h> +#include "syscall.h" + +int vhangup(void) +{ + return syscall(SYS_vhangup); +} diff --git a/lib/libc/musl/src/linux/vmsplice.c b/lib/libc/musl/src/linux/vmsplice.c new file mode 100644 index 0000000000..ebf13ee44e --- /dev/null +++ b/lib/libc/musl/src/linux/vmsplice.c @@ -0,0 +1,8 @@ +#define _GNU_SOURCE +#include <fcntl.h> +#include "syscall.h" + +ssize_t vmsplice(int fd, const struct iovec *iov, size_t cnt, unsigned flags) +{ + return syscall(SYS_vmsplice, fd, iov, cnt, flags); +} diff --git a/lib/libc/musl/src/linux/wait3.c b/lib/libc/musl/src/linux/wait3.c new file mode 100644 index 0000000000..61c735947b --- /dev/null +++ b/lib/libc/musl/src/linux/wait3.c @@ -0,0 +1,9 @@ +#define _GNU_SOURCE +#include <sys/wait.h> +#include <sys/resource.h> +#include "syscall.h" + +pid_t wait3(int *status, int options, struct rusage *usage) +{ + return wait4(-1, status, options, usage); +} diff --git a/lib/libc/musl/src/linux/wait4.c b/lib/libc/musl/src/linux/wait4.c new file mode 100644 index 0000000000..97f12cc524 --- /dev/null +++ b/lib/libc/musl/src/linux/wait4.c @@ -0,0 +1,9 @@ +#define _GNU_SOURCE +#include <sys/wait.h> +#include <sys/resource.h> +#include "syscall.h" + +pid_t wait4(pid_t pid, int *status, int options, struct rusage *usage) +{ + return syscall(SYS_wait4, pid, status, options, usage); +} diff --git a/lib/libc/musl/src/linux/x32/sysinfo.c b/lib/libc/musl/src/linux/x32/sysinfo.c new file mode 100644 index 0000000000..59b3bb708f --- /dev/null +++ b/lib/libc/musl/src/linux/x32/sysinfo.c @@ -0,0 +1,49 @@ +#include <sys/sysinfo.h> +#include "syscall.h" + +#define klong long long +#define kulong unsigned long long + +struct kernel_sysinfo { + klong uptime; + kulong loads[3]; + kulong totalram; + kulong freeram; + kulong sharedram; + kulong bufferram; + kulong totalswap; + kulong freeswap; + short procs; + short pad; + kulong totalhigh; + kulong freehigh; + unsigned mem_unit; +}; + +int __lsysinfo(struct sysinfo *info) +{ + struct kernel_sysinfo tmp; + int ret = syscall(SYS_sysinfo, &tmp); + if(ret == -1) return ret; + info->uptime = tmp.uptime; + info->loads[0] = tmp.loads[0]; + info->loads[1] = tmp.loads[1]; + info->loads[2] = tmp.loads[2]; + kulong shifts; + kulong max = tmp.totalram | tmp.totalswap; + __asm__("bsr %1,%0" : "=r"(shifts) : "r"(max)); + shifts = shifts >= 32 ? shifts - 31 : 0; + info->totalram = tmp.totalram >> shifts; + info->freeram = tmp.freeram >> shifts; + info->sharedram = tmp.sharedram >> shifts; + info->bufferram = tmp.bufferram >> shifts; + info->totalswap = tmp.totalswap >> shifts; + info->freeswap = tmp.freeswap >> shifts; + info->procs = tmp.procs ; + info->totalhigh = tmp.totalhigh >> shifts; + info->freehigh = tmp.freehigh >> shifts; + info->mem_unit = (tmp.mem_unit ? tmp.mem_unit : 1) << shifts; + return ret; +} + +weak_alias(__lsysinfo, sysinfo); diff --git a/lib/libc/musl/src/linux/xattr.c b/lib/libc/musl/src/linux/xattr.c new file mode 100644 index 0000000000..fea0d209ac --- /dev/null +++ b/lib/libc/musl/src/linux/xattr.c @@ -0,0 +1,62 @@ +#include <sys/xattr.h> +#include "syscall.h" + +ssize_t getxattr(const char *path, const char *name, void *value, size_t size) +{ + return syscall(SYS_getxattr, path, name, value, size); +} + +ssize_t lgetxattr(const char *path, const char *name, void *value, size_t size) +{ + return syscall(SYS_lgetxattr, path, name, value, size); +} + +ssize_t fgetxattr(int filedes, const char *name, void *value, size_t size) +{ + return syscall(SYS_fgetxattr, filedes, name, value, size); +} + +ssize_t listxattr(const char *path, char *list, size_t size) +{ + return syscall(SYS_listxattr, path, list, size); +} + +ssize_t llistxattr(const char *path, char *list, size_t size) +{ + return syscall(SYS_llistxattr, path, list, size); +} + +ssize_t flistxattr(int filedes, char *list, size_t size) +{ + return syscall(SYS_flistxattr, filedes, list, size); +} + +int setxattr(const char *path, const char *name, const void *value, size_t size, int flags) +{ + return syscall(SYS_setxattr, path, name, value, size, flags); +} + +int lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags) +{ + return syscall(SYS_lsetxattr, path, name, value, size, flags); +} + +int fsetxattr(int filedes, const char *name, const void *value, size_t size, int flags) +{ + return syscall(SYS_fsetxattr, filedes, name, value, size, flags); +} + +int removexattr(const char *path, const char *name) +{ + return syscall(SYS_removexattr, path, name); +} + +int lremovexattr(const char *path, const char *name) +{ + return syscall(SYS_lremovexattr, path, name); +} + +int fremovexattr(int fd, const char *name) +{ + return syscall(SYS_fremovexattr, fd, name); +} |
