diff options
| author | Kacper <kacper@mail.openlinux.dev> | 2025-12-07 20:10:31 +0100 |
|---|---|---|
| committer | Kacper <kacper@mail.openlinux.dev> | 2025-12-07 20:10:31 +0100 |
| commit | fc00c656c96528112d05cf0edf8631bd5eaea446 (patch) | |
| tree | a6e0e6c588191a8bd1c64afc3b7a258e3e66c236 /lib/libc/unistd | |
Add build system scaffolding and libc headers
Diffstat (limited to 'lib/libc/unistd')
77 files changed, 737 insertions, 0 deletions
diff --git a/lib/libc/unistd/_Fork.c b/lib/libc/unistd/_Fork.c new file mode 100644 index 00000000..080dd880 --- /dev/null +++ b/lib/libc/unistd/_Fork.c @@ -0,0 +1,8 @@ +#include <unistd.h> +#include <syscall.h> +#include <linux/signal.h> + +pid_t _Fork(void) +{ + return syscall(clone, SIGCHLD, 0); +} diff --git a/lib/libc/unistd/_exit.c b/lib/libc/unistd/_exit.c new file mode 100644 index 00000000..ffd502c4 --- /dev/null +++ b/lib/libc/unistd/_exit.c @@ -0,0 +1,7 @@ +#include <syscall.h> + +void _exit(int status) +{ + __syscall(exit, status); + __builtin_unreachable(); +} diff --git a/lib/libc/unistd/access.c b/lib/libc/unistd/access.c new file mode 100644 index 00000000..7735d8c4 --- /dev/null +++ b/lib/libc/unistd/access.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int access(const char *path, int amode) +{ + return syscall(access, path, amode); +} diff --git a/lib/libc/unistd/alarm.c b/lib/libc/unistd/alarm.c new file mode 100644 index 00000000..5d171cc7 --- /dev/null +++ b/lib/libc/unistd/alarm.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +unsigned alarm(unsigned seconds) +{ + return syscall(alarm, seconds); +} diff --git a/lib/libc/unistd/chdir.c b/lib/libc/unistd/chdir.c new file mode 100644 index 00000000..5c66cc0c --- /dev/null +++ b/lib/libc/unistd/chdir.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int chdir(const char *path) +{ + return syscall(chdir, path); +} diff --git a/lib/libc/unistd/chown.c b/lib/libc/unistd/chown.c new file mode 100644 index 00000000..fa7e0e7b --- /dev/null +++ b/lib/libc/unistd/chown.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int chown(const char *path, uid_t owner, gid_t group) +{ + return syscall(chown, path, owner, group); +} diff --git a/lib/libc/unistd/close.c b/lib/libc/unistd/close.c new file mode 100644 index 00000000..57e45c33 --- /dev/null +++ b/lib/libc/unistd/close.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int close(int fildes) +{ + return syscall(close, fildes); +} diff --git a/lib/libc/unistd/dup.c b/lib/libc/unistd/dup.c new file mode 100644 index 00000000..764c16f6 --- /dev/null +++ b/lib/libc/unistd/dup.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int dup(int fildes) +{ + return syscall(dup, fildes); +} diff --git a/lib/libc/unistd/dup2.c b/lib/libc/unistd/dup2.c new file mode 100644 index 00000000..ce1125ac --- /dev/null +++ b/lib/libc/unistd/dup2.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int dup2(int fildes, int fildes2) +{ + return syscall(dup2, fildes, fildes2); +} diff --git a/lib/libc/unistd/dup3.c b/lib/libc/unistd/dup3.c new file mode 100644 index 00000000..aa9c0fab --- /dev/null +++ b/lib/libc/unistd/dup3.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int dup3(int fildes, int fildes2, int flag) +{ + return syscall(dup3, fildes, fildes2, flag); +} diff --git a/lib/libc/unistd/execl.c b/lib/libc/unistd/execl.c new file mode 100644 index 00000000..5dc7bc74 --- /dev/null +++ b/lib/libc/unistd/execl.c @@ -0,0 +1,26 @@ +#include <stdarg.h> +#include <stddef.h> +#include <unistd.h> + +int execl(const char *path, const char *argv0, ...) +{ + int argc; + va_list ap; + va_start(ap, argv0); + + argc = 1; + while (va_arg(ap, const char *) != NULL) { + argc++; + } + va_end(ap); + + char *argv[argc + 1]; + va_start(ap, argv0); + for (int i = 1; i < argc; i++) { + argv[i] = (char *)va_arg(ap, const char *); + } + argv[argc] = NULL; + va_end(ap); + + return execvp(path, argv); +} diff --git a/lib/libc/unistd/execlp.c b/lib/libc/unistd/execlp.c new file mode 100644 index 00000000..4613a7ee --- /dev/null +++ b/lib/libc/unistd/execlp.c @@ -0,0 +1,27 @@ +#include <stdarg.h> +#include <stddef.h> +#include <syscall.h> + +// TODO: need to find in path and call execl +int execlp(const char *path, const char *argv0, ...) +{ + int argc; + va_list ap; + va_start(ap, argv0); + + argc = 1; + while (va_arg(ap, const char *) != NULL) { + argc++; + } + va_end(ap); + + char *argv[argc + 1]; + va_start(ap, argv0); + for (int i = 1; i < argc; i++) { + argv[i] = (char *)va_arg(ap, const char *); + } + argv[argc] = NULL; + va_end(ap); + + return syscall(execve, path, argv, 0); +} diff --git a/lib/libc/unistd/execv.c b/lib/libc/unistd/execv.c new file mode 100644 index 00000000..60ee6d87 --- /dev/null +++ b/lib/libc/unistd/execv.c @@ -0,0 +1,9 @@ +#include <unistd.h> +#include <syscall.h> + +extern char **environ; + +int execv(const char *path, char *const argv[]) +{ + return syscall(execve, path, argv, environ); +} diff --git a/lib/libc/unistd/execve.c b/lib/libc/unistd/execve.c new file mode 100644 index 00000000..43226d98 --- /dev/null +++ b/lib/libc/unistd/execve.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int execve(const char *file, char *const argv[], char *const envp[]) +{ + return syscall(execve, file, argv, envp); +} diff --git a/lib/libc/unistd/execvp.c b/lib/libc/unistd/execvp.c new file mode 100644 index 00000000..2ce69354 --- /dev/null +++ b/lib/libc/unistd/execvp.c @@ -0,0 +1,55 @@ +#include <errno.h> +#include <limits.h> +#include <string.h> +#include <unistd.h> +#include <stdio.h> + +extern char **environ; + +int execvp(const char *file, char *const argv[]) +{ + if (*file == '\0') { + errno = ENOENT; + return -1; + } + + if (strchr(file, '/') != NULL) { + return execv(file, argv); + } else { + char *ptr; + char *path = NULL; // TODO: getenv + + if (path == NULL || *path == '\0') { + path = "/bin"; + } + + do { + char buf[PATH_MAX]; + + if ((ptr = strchr(path, ':')) == NULL) { + if (snprintf(buf, PATH_MAX, "%s/%s", path, + file) >= PATH_MAX) { + errno = ENAMETOOLONG; + return -1; + } + + execv(buf, argv); + break; + } + + if (snprintf(buf, PATH_MAX, "%.*s/%s", + (int)(ptr - path), path, + file) >= PATH_MAX) { + errno = ENAMETOOLONG; + return -1; + } + + execv(buf, argv); + } while (*ptr != '\0'); + + errno = ENOENT; + return -1; + } + + return 0; +} diff --git a/lib/libc/unistd/faccessat.c b/lib/libc/unistd/faccessat.c new file mode 100644 index 00000000..61680aea --- /dev/null +++ b/lib/libc/unistd/faccessat.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int faccessat(int fd, const char *path, int amode, int flag) +{ + return syscall(faccessat, fd, path, amode, flag); +} diff --git a/lib/libc/unistd/fchdir.c b/lib/libc/unistd/fchdir.c new file mode 100644 index 00000000..9c0ed172 --- /dev/null +++ b/lib/libc/unistd/fchdir.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int fchdir(int fildes) +{ + return syscall(fchdir, fildes); +} diff --git a/lib/libc/unistd/fchown.c b/lib/libc/unistd/fchown.c new file mode 100644 index 00000000..ba0ff964 --- /dev/null +++ b/lib/libc/unistd/fchown.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int fchown(int fildes, uid_t owner, gid_t group) +{ + return syscall(fchown, fildes, owner, group); +} diff --git a/lib/libc/unistd/fchownat.c b/lib/libc/unistd/fchownat.c new file mode 100644 index 00000000..3e08472b --- /dev/null +++ b/lib/libc/unistd/fchownat.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag) +{ + return syscall(fchownat, fd, path, owner, group, flag); +} diff --git a/lib/libc/unistd/fdatasync.c b/lib/libc/unistd/fdatasync.c new file mode 100644 index 00000000..e65c79f0 --- /dev/null +++ b/lib/libc/unistd/fdatasync.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int fdatasync(int fildes) +{ + return syscall(fdatasync, fildes); +} diff --git a/lib/libc/unistd/fork.c b/lib/libc/unistd/fork.c new file mode 100644 index 00000000..38657406 --- /dev/null +++ b/lib/libc/unistd/fork.c @@ -0,0 +1,6 @@ +#include <unistd.h> + +pid_t fork(void) +{ + return _Fork(); +} diff --git a/lib/libc/unistd/fsync.c b/lib/libc/unistd/fsync.c new file mode 100644 index 00000000..e92e1cc1 --- /dev/null +++ b/lib/libc/unistd/fsync.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int fsync(int fildes) +{ + return syscall(fsync, fildes); +} diff --git a/lib/libc/unistd/ftruncate.c b/lib/libc/unistd/ftruncate.c new file mode 100644 index 00000000..f032ed1b --- /dev/null +++ b/lib/libc/unistd/ftruncate.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int ftruncate(int fildes, off_t length) +{ + return syscall(ftruncate, fildes, length); +} diff --git a/lib/libc/unistd/getcwd.c b/lib/libc/unistd/getcwd.c new file mode 100644 index 00000000..5494f6e3 --- /dev/null +++ b/lib/libc/unistd/getcwd.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +char *getcwd(char *buf, size_t size) +{ + return (char *)syscall(getcwd, buf, size); +} diff --git a/lib/libc/unistd/getegid.c b/lib/libc/unistd/getegid.c new file mode 100644 index 00000000..b50e5839 --- /dev/null +++ b/lib/libc/unistd/getegid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +gid_t getegid(void) +{ + return syscall(getegid); +} diff --git a/lib/libc/unistd/getentropy.c b/lib/libc/unistd/getentropy.c new file mode 100644 index 00000000..f55fed7a --- /dev/null +++ b/lib/libc/unistd/getentropy.c @@ -0,0 +1,8 @@ +#include <unistd.h> +#include <syscall.h> + +int getentropy(void *buffer, size_t length) +{ + // TODO + return 0; +} diff --git a/lib/libc/unistd/geteuid.c b/lib/libc/unistd/geteuid.c new file mode 100644 index 00000000..aee26a42 --- /dev/null +++ b/lib/libc/unistd/geteuid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +gid_t geteuid(void) +{ + return syscall(geteuid); +} diff --git a/lib/libc/unistd/getgid.c b/lib/libc/unistd/getgid.c new file mode 100644 index 00000000..7d19d58e --- /dev/null +++ b/lib/libc/unistd/getgid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +gid_t getgid(void) +{ + return syscall(getgid); +} diff --git a/lib/libc/unistd/getgroups.c b/lib/libc/unistd/getgroups.c new file mode 100644 index 00000000..fb1346e5 --- /dev/null +++ b/lib/libc/unistd/getgroups.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int getgroups(int gidsetsize, gid_t grouplist[]) +{ + return syscall(getgroups, gidsetsize, grouplist); +} diff --git a/lib/libc/unistd/gethostid.c b/lib/libc/unistd/gethostid.c new file mode 100644 index 00000000..e3079534 --- /dev/null +++ b/lib/libc/unistd/gethostid.c @@ -0,0 +1,7 @@ +#include <syscall.h> + +long gethostid(void) +{ + // TODO + return 0; +} diff --git a/lib/libc/unistd/gethostname.c b/lib/libc/unistd/gethostname.c new file mode 100644 index 00000000..a20808e1 --- /dev/null +++ b/lib/libc/unistd/gethostname.c @@ -0,0 +1,8 @@ +#include <unistd.h> +#include <syscall.h> + +int gethostname(char *name, size_t namelen) +{ + // TODO + return 0; +} diff --git a/lib/libc/unistd/getlogin.c b/lib/libc/unistd/getlogin.c new file mode 100644 index 00000000..04355db1 --- /dev/null +++ b/lib/libc/unistd/getlogin.c @@ -0,0 +1,7 @@ +#include <syscall.h> + +char *getlogin(void) +{ + // TODO + return 0; +} diff --git a/lib/libc/unistd/getlogin_r.c b/lib/libc/unistd/getlogin_r.c new file mode 100644 index 00000000..3dea2dff --- /dev/null +++ b/lib/libc/unistd/getlogin_r.c @@ -0,0 +1,8 @@ +#include <unistd.h> +#include <syscall.h> + +int getlogin_r(char *name, size_t namesize) +{ + // TODO + return 0; +} diff --git a/lib/libc/unistd/getopt.c b/lib/libc/unistd/getopt.c new file mode 100644 index 00000000..8ef18d37 --- /dev/null +++ b/lib/libc/unistd/getopt.c @@ -0,0 +1,114 @@ +#include <unistd.h> +#include <stdio.h> +#include <string.h> +#include <sys/uio.h> + +char *optarg; +int optind = 1, opterr = 1, optopt; + +int getopt(int argc, char *const argv[], const char *optstring) +{ + char *optchar; + char c, d; + int i; + static int optpos; + + if (optind == 0) { + optpos = 0; + optind = 1; + } + + if (optind >= argc || !argv[optind]) { + return -1; + } + + if (argv[optind][0] != '-') { + if (optstring[0] == '-') { + optarg = argv[optind++]; + return 1; + } + + return -1; + } + + if (argv[optind][1] == 0) { + return -1; + } + + if (argv[optind][1] == '-' && argv[optind][2] == 0) { + return optind++, -1; + } + + if (optpos == 0) + optpos++; + + c = argv[optind][optpos]; + optchar = argv[optind] + optpos++; + + if (argv[optind][optpos] == 0) { + optind++; + optpos = 0; + } + + i = 0; + + do { + d = optstring[i++]; + } while (d && d != c); + + if (d != c || c == ':') { + optopt = c; + if (optstring[0] != ':' && opterr) { + struct iovec iov[4]; + char opt_char[2] = { *optchar, '\0' }; + + iov[0].iov_base = argv[0]; + iov[0].iov_len = strlen(argv[0]); + iov[1].iov_base = ": invalid option -- "; + iov[1].iov_len = 20; + iov[2].iov_base = opt_char; + iov[2].iov_len = 1; + iov[3].iov_base = "\n"; + iov[3].iov_len = 1; + + writev(STDERR_FILENO, iov, 4); + } + return '?'; + } + + if (optstring[i] == ':') { + optarg = 0; + if (optstring[i + 1] != ':' || optpos) { + optarg = argv[optind++]; + if (optpos) { + optarg += optpos; + } + optpos = 0; + } + if (optind > argc) { + optopt = c; + if (optstring[0] == ':') { + return ':'; + } + if (opterr) { + struct iovec iov[4]; + char opt_char[2] = { *optchar, '\0' }; + + iov[0].iov_base = argv[0]; + iov[0].iov_len = strlen(argv[0]); + iov[1].iov_base = + ": option requires an argument -- "; + iov[1].iov_len = 33; + iov[2].iov_base = opt_char; + iov[2].iov_len = 1; + iov[3].iov_base = "\n"; + iov[3].iov_len = 1; + + writev(STDERR_FILENO, iov, 4); + } + return '?'; + } + } + + return c; +} diff --git a/lib/libc/unistd/getpgid.c b/lib/libc/unistd/getpgid.c new file mode 100644 index 00000000..aed55bb9 --- /dev/null +++ b/lib/libc/unistd/getpgid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +pid_t getpgid(pid_t pid) +{ + return syscall(getpgid, pid); +} diff --git a/lib/libc/unistd/getpid.c b/lib/libc/unistd/getpid.c new file mode 100644 index 00000000..46562867 --- /dev/null +++ b/lib/libc/unistd/getpid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +pid_t getpid(void) +{ + return syscall(getpid); +} diff --git a/lib/libc/unistd/getppid.c b/lib/libc/unistd/getppid.c new file mode 100644 index 00000000..16bf101e --- /dev/null +++ b/lib/libc/unistd/getppid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +pid_t getppid(void) +{ + return syscall(getppid); +} diff --git a/lib/libc/unistd/getresgid.c b/lib/libc/unistd/getresgid.c new file mode 100644 index 00000000..ccdbabaa --- /dev/null +++ b/lib/libc/unistd/getresgid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int getresgid(gid_t *restrict rgid, gid_t *restrict egid, gid_t *restrict sgid) +{ + return syscall(getresgid, rgid, egid, sgid); +} diff --git a/lib/libc/unistd/getresuid.c b/lib/libc/unistd/getresuid.c new file mode 100644 index 00000000..a9a405ae --- /dev/null +++ b/lib/libc/unistd/getresuid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int getresuid(uid_t *restrict ruid, uid_t *restrict euid, uid_t *restrict suid) +{ + return syscall(getresuid, ruid, euid, suid); +} diff --git a/lib/libc/unistd/getsid.c b/lib/libc/unistd/getsid.c new file mode 100644 index 00000000..e0a06780 --- /dev/null +++ b/lib/libc/unistd/getsid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +pid_t getsid(pid_t pid) +{ + return syscall(getsid, pid); +} diff --git a/lib/libc/unistd/getuid.c b/lib/libc/unistd/getuid.c new file mode 100644 index 00000000..9223ae6f --- /dev/null +++ b/lib/libc/unistd/getuid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +uid_t getuid(void) +{ + return syscall(getuid); +} diff --git a/lib/libc/unistd/isatty.c b/lib/libc/unistd/isatty.c new file mode 100644 index 00000000..afb15460 --- /dev/null +++ b/lib/libc/unistd/isatty.c @@ -0,0 +1,10 @@ +#include <termios.h> +#include <unistd.h> +#include <syscall.h> +#include <asm-generic/ioctls.h> + +int isatty(int fildes) +{ + struct winsize winsize; + return 1 + syscall(ioctl, fildes, TIOCGWINSZ, &winsize); +} diff --git a/lib/libc/unistd/lchown.c b/lib/libc/unistd/lchown.c new file mode 100644 index 00000000..a18be4c6 --- /dev/null +++ b/lib/libc/unistd/lchown.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int lchown(const char *path, uid_t owner, gid_t group) +{ + return syscall(lchown, path, owner, group); +} diff --git a/lib/libc/unistd/link.c b/lib/libc/unistd/link.c new file mode 100644 index 00000000..07204ed0 --- /dev/null +++ b/lib/libc/unistd/link.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int link(const char *path1, const char *path2) +{ + return syscall(link, path1, path2); +} diff --git a/lib/libc/unistd/linkat.c b/lib/libc/unistd/linkat.c new file mode 100644 index 00000000..72dca11e --- /dev/null +++ b/lib/libc/unistd/linkat.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int linkat(int fd1, const char *path1, int fd2, const char *path2, int flag) +{ + return syscall(linkat, fd1, path1, fd2, path2, flag); +} diff --git a/lib/libc/unistd/lockf.c b/lib/libc/unistd/lockf.c new file mode 100644 index 00000000..8b807c34 --- /dev/null +++ b/lib/libc/unistd/lockf.c @@ -0,0 +1,8 @@ +#include <unistd.h> +#include <syscall.h> + +int lockf(int fildes, int function, off_t size) +{ + // TODO + return 0; +} diff --git a/lib/libc/unistd/lseek.c b/lib/libc/unistd/lseek.c new file mode 100644 index 00000000..d8b41f88 --- /dev/null +++ b/lib/libc/unistd/lseek.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +off_t lseek(int fildes, off_t offset, int whence) +{ + return syscall(lseek, fildes, offset, whence); +} diff --git a/lib/libc/unistd/nice.c b/lib/libc/unistd/nice.c new file mode 100644 index 00000000..3b240c93 --- /dev/null +++ b/lib/libc/unistd/nice.c @@ -0,0 +1,8 @@ +#include <unistd.h> +#include <syscall.h> + +int nice(int incr) +{ + // TODO: needs getpriority and setpriority from sys/resouce.h + return 0; +} diff --git a/lib/libc/unistd/pause.c b/lib/libc/unistd/pause.c new file mode 100644 index 00000000..bd959bc5 --- /dev/null +++ b/lib/libc/unistd/pause.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int pause(void) +{ + return syscall(pause); +} diff --git a/lib/libc/unistd/pipe.c b/lib/libc/unistd/pipe.c new file mode 100644 index 00000000..4f8e0e98 --- /dev/null +++ b/lib/libc/unistd/pipe.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int pipe(int fildes[2]) +{ + return syscall(pipe, fildes); +} diff --git a/lib/libc/unistd/pipe2.c b/lib/libc/unistd/pipe2.c new file mode 100644 index 00000000..a28aecdd --- /dev/null +++ b/lib/libc/unistd/pipe2.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int pipe2(int fildes[2], int flag) +{ + return syscall(pipe2, fildes, flag); +} diff --git a/lib/libc/unistd/posix_close.c b/lib/libc/unistd/posix_close.c new file mode 100644 index 00000000..fe44a7b9 --- /dev/null +++ b/lib/libc/unistd/posix_close.c @@ -0,0 +1,7 @@ +#include <libc.h> +#include <syscall.h> + +int posix_close(int fildes, int unused flag) +{ + return syscall(close, fildes); +} diff --git a/lib/libc/unistd/pread.c b/lib/libc/unistd/pread.c new file mode 100644 index 00000000..ad8e71b0 --- /dev/null +++ b/lib/libc/unistd/pread.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset) +{ + return syscall(pread, fildes, buf, nbyte, offset); +} diff --git a/lib/libc/unistd/pwrite.c b/lib/libc/unistd/pwrite.c new file mode 100644 index 00000000..8a2eadbe --- /dev/null +++ b/lib/libc/unistd/pwrite.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset) +{ + return syscall(pwrite, fildes, buf, nbyte, offset); +} diff --git a/lib/libc/unistd/read.c b/lib/libc/unistd/read.c new file mode 100644 index 00000000..54c29586 --- /dev/null +++ b/lib/libc/unistd/read.c @@ -0,0 +1,7 @@ +#include <syscall.h> +#include <unistd.h> + +ssize_t read(int fildes, void *buf, size_t nbyte) +{ + return syscall(read, fildes, buf, nbyte); +} diff --git a/lib/libc/unistd/readlink.c b/lib/libc/unistd/readlink.c new file mode 100644 index 00000000..8587f526 --- /dev/null +++ b/lib/libc/unistd/readlink.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsize) +{ + return syscall(readlink, path, buf, bufsize); +} diff --git a/lib/libc/unistd/readlinkat.c b/lib/libc/unistd/readlinkat.c new file mode 100644 index 00000000..d2a87b2b --- /dev/null +++ b/lib/libc/unistd/readlinkat.c @@ -0,0 +1,8 @@ +#include <unistd.h> +#include <syscall.h> + +ssize_t readlinkat(int fd, const char *restrict path, char *restrict buf, + size_t bufsize) +{ + return syscall(readlinkat, fd, path, buf, bufsize); +} diff --git a/lib/libc/unistd/rmdir.c b/lib/libc/unistd/rmdir.c new file mode 100644 index 00000000..5aab225c --- /dev/null +++ b/lib/libc/unistd/rmdir.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int rmdir(const char *path) +{ + return syscall(rmdir, path); +} diff --git a/lib/libc/unistd/setegid.c b/lib/libc/unistd/setegid.c new file mode 100644 index 00000000..7fd9adb6 --- /dev/null +++ b/lib/libc/unistd/setegid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int setegid(gid_t gid) +{ + return syscall(setresgid, -1, gid, -1); +} diff --git a/lib/libc/unistd/seteuid.c b/lib/libc/unistd/seteuid.c new file mode 100644 index 00000000..6d86bee5 --- /dev/null +++ b/lib/libc/unistd/seteuid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int seteuid(uid_t uid) +{ + return syscall(setresuid, -1, uid, -1); +} diff --git a/lib/libc/unistd/setgid.c b/lib/libc/unistd/setgid.c new file mode 100644 index 00000000..aa07c330 --- /dev/null +++ b/lib/libc/unistd/setgid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int setgid(gid_t gid) +{ + return syscall(setgid, gid); +} diff --git a/lib/libc/unistd/setpgid.c b/lib/libc/unistd/setpgid.c new file mode 100644 index 00000000..e4fd6efd --- /dev/null +++ b/lib/libc/unistd/setpgid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int setpgid(pid_t pid, pid_t pgid) +{ + return syscall(setpgid, pid, pgid); +} diff --git a/lib/libc/unistd/setregid.c b/lib/libc/unistd/setregid.c new file mode 100644 index 00000000..633f22a6 --- /dev/null +++ b/lib/libc/unistd/setregid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int setregid(gid_t rgid, gid_t egid) +{ + return syscall(setregid, rgid, egid); +} diff --git a/lib/libc/unistd/setresgid.c b/lib/libc/unistd/setresgid.c new file mode 100644 index 00000000..6de609fa --- /dev/null +++ b/lib/libc/unistd/setresgid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int setresgid(gid_t rgid, gid_t egid, gid_t sgid) +{ + return syscall(setresgid, rgid, egid, sgid); +} diff --git a/lib/libc/unistd/setresuid.c b/lib/libc/unistd/setresuid.c new file mode 100644 index 00000000..1fd74baa --- /dev/null +++ b/lib/libc/unistd/setresuid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int setresuid(uid_t ruid, uid_t euid, uid_t suid) +{ + return syscall(setresuid, ruid, euid, suid); +} diff --git a/lib/libc/unistd/setreuid.c b/lib/libc/unistd/setreuid.c new file mode 100644 index 00000000..5f277ba3 --- /dev/null +++ b/lib/libc/unistd/setreuid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int setreuid(uid_t ruid, uid_t euid) +{ + return syscall(setreuid, ruid, euid); +} diff --git a/lib/libc/unistd/setsid.c b/lib/libc/unistd/setsid.c new file mode 100644 index 00000000..16b812e0 --- /dev/null +++ b/lib/libc/unistd/setsid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +pid_t setsid(void) +{ + return syscall(setsid); +} diff --git a/lib/libc/unistd/setuid.c b/lib/libc/unistd/setuid.c new file mode 100644 index 00000000..ab8ff73f --- /dev/null +++ b/lib/libc/unistd/setuid.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int setuid(uid_t uid) +{ + return syscall(setuid, uid); +} diff --git a/lib/libc/unistd/sleep.c b/lib/libc/unistd/sleep.c new file mode 100644 index 00000000..b2aef854 --- /dev/null +++ b/lib/libc/unistd/sleep.c @@ -0,0 +1,10 @@ +#include <time.h> +#include <unistd.h> + +unsigned sleep(unsigned seconds) +{ + struct timespec tv = { .tv_sec = seconds, .tv_nsec = 0 }; + if (nanosleep(&tv, &tv)) + return tv.tv_sec; + return 0; +} diff --git a/lib/libc/unistd/swab.c b/lib/libc/unistd/swab.c new file mode 100644 index 00000000..5e4e7e3b --- /dev/null +++ b/lib/libc/unistd/swab.c @@ -0,0 +1,17 @@ +#include <unistd.h> + +void swab(const void *restrict src, void *restrict dest, ssize_t nbytes) +{ + const char *s = src; + char *d = dest; + + if (nbytes <= 0) + return; + + ssize_t n = nbytes & ~1; + + for (ssize_t i = 0; i < n; i += 2) { + d[i] = s[i + 1]; + d[i + 1] = s[i]; + } +} diff --git a/lib/libc/unistd/symlink.c b/lib/libc/unistd/symlink.c new file mode 100644 index 00000000..0b84148e --- /dev/null +++ b/lib/libc/unistd/symlink.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int symlink(const char *path1, const char *path2) +{ + return syscall(symlink, path1, path2); +} diff --git a/lib/libc/unistd/symlinkat.c b/lib/libc/unistd/symlinkat.c new file mode 100644 index 00000000..d4dd2ee0 --- /dev/null +++ b/lib/libc/unistd/symlinkat.c @@ -0,0 +1,7 @@ +#include <syscall.h> + +int symlinkat(const char *path1, int fd, const char *path2) + +{ + return syscall(symlinkat, path1, fd, path2); +} diff --git a/lib/libc/unistd/sync.c b/lib/libc/unistd/sync.c new file mode 100644 index 00000000..e655213b --- /dev/null +++ b/lib/libc/unistd/sync.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +void sync(void) +{ + syscall(sync); +} diff --git a/lib/libc/unistd/truncate.c b/lib/libc/unistd/truncate.c new file mode 100644 index 00000000..2611d40a --- /dev/null +++ b/lib/libc/unistd/truncate.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +int truncate(const char *path, off_t length) +{ + return syscall(truncate, path, length); +} diff --git a/lib/libc/unistd/unlink.c b/lib/libc/unistd/unlink.c new file mode 100644 index 00000000..1d3859f9 --- /dev/null +++ b/lib/libc/unistd/unlink.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int unlink(const char *path) +{ + return syscall(unlink, path); +} diff --git a/lib/libc/unistd/unlinkat.c b/lib/libc/unistd/unlinkat.c new file mode 100644 index 00000000..837105a1 --- /dev/null +++ b/lib/libc/unistd/unlinkat.c @@ -0,0 +1,6 @@ +#include <syscall.h> + +int unlinkat(int fd, const char *path, int flag) +{ + return syscall(unlinkat, fd, path, flag); +} diff --git a/lib/libc/unistd/write.c b/lib/libc/unistd/write.c new file mode 100644 index 00000000..c7bd5dbc --- /dev/null +++ b/lib/libc/unistd/write.c @@ -0,0 +1,7 @@ +#include <unistd.h> +#include <syscall.h> + +ssize_t write(int fd, const void *buf, size_t count) +{ + return syscall(write, fd, buf, count); +} |
