summaryrefslogtreecommitdiff
path: root/lib/libc/unistd
diff options
context:
space:
mode:
authorKacper <kacper@mail.openlinux.dev>2025-12-07 20:10:31 +0100
committerKacper <kacper@mail.openlinux.dev>2025-12-07 20:10:31 +0100
commitfc00c656c96528112d05cf0edf8631bd5eaea446 (patch)
treea6e0e6c588191a8bd1c64afc3b7a258e3e66c236 /lib/libc/unistd
Add build system scaffolding and libc headers
Diffstat (limited to 'lib/libc/unistd')
-rw-r--r--lib/libc/unistd/_Fork.c8
-rw-r--r--lib/libc/unistd/_exit.c7
-rw-r--r--lib/libc/unistd/access.c6
-rw-r--r--lib/libc/unistd/alarm.c6
-rw-r--r--lib/libc/unistd/chdir.c6
-rw-r--r--lib/libc/unistd/chown.c7
-rw-r--r--lib/libc/unistd/close.c6
-rw-r--r--lib/libc/unistd/dup.c6
-rw-r--r--lib/libc/unistd/dup2.c6
-rw-r--r--lib/libc/unistd/dup3.c6
-rw-r--r--lib/libc/unistd/execl.c26
-rw-r--r--lib/libc/unistd/execlp.c27
-rw-r--r--lib/libc/unistd/execv.c9
-rw-r--r--lib/libc/unistd/execve.c6
-rw-r--r--lib/libc/unistd/execvp.c55
-rw-r--r--lib/libc/unistd/faccessat.c6
-rw-r--r--lib/libc/unistd/fchdir.c6
-rw-r--r--lib/libc/unistd/fchown.c7
-rw-r--r--lib/libc/unistd/fchownat.c7
-rw-r--r--lib/libc/unistd/fdatasync.c6
-rw-r--r--lib/libc/unistd/fork.c6
-rw-r--r--lib/libc/unistd/fsync.c6
-rw-r--r--lib/libc/unistd/ftruncate.c7
-rw-r--r--lib/libc/unistd/getcwd.c7
-rw-r--r--lib/libc/unistd/getegid.c7
-rw-r--r--lib/libc/unistd/getentropy.c8
-rw-r--r--lib/libc/unistd/geteuid.c7
-rw-r--r--lib/libc/unistd/getgid.c7
-rw-r--r--lib/libc/unistd/getgroups.c7
-rw-r--r--lib/libc/unistd/gethostid.c7
-rw-r--r--lib/libc/unistd/gethostname.c8
-rw-r--r--lib/libc/unistd/getlogin.c7
-rw-r--r--lib/libc/unistd/getlogin_r.c8
-rw-r--r--lib/libc/unistd/getopt.c114
-rw-r--r--lib/libc/unistd/getpgid.c7
-rw-r--r--lib/libc/unistd/getpid.c7
-rw-r--r--lib/libc/unistd/getppid.c7
-rw-r--r--lib/libc/unistd/getresgid.c7
-rw-r--r--lib/libc/unistd/getresuid.c7
-rw-r--r--lib/libc/unistd/getsid.c7
-rw-r--r--lib/libc/unistd/getuid.c7
-rw-r--r--lib/libc/unistd/isatty.c10
-rw-r--r--lib/libc/unistd/lchown.c7
-rw-r--r--lib/libc/unistd/link.c7
-rw-r--r--lib/libc/unistd/linkat.c7
-rw-r--r--lib/libc/unistd/lockf.c8
-rw-r--r--lib/libc/unistd/lseek.c7
-rw-r--r--lib/libc/unistd/nice.c8
-rw-r--r--lib/libc/unistd/pause.c6
-rw-r--r--lib/libc/unistd/pipe.c6
-rw-r--r--lib/libc/unistd/pipe2.c6
-rw-r--r--lib/libc/unistd/posix_close.c7
-rw-r--r--lib/libc/unistd/pread.c7
-rw-r--r--lib/libc/unistd/pwrite.c7
-rw-r--r--lib/libc/unistd/read.c7
-rw-r--r--lib/libc/unistd/readlink.c7
-rw-r--r--lib/libc/unistd/readlinkat.c8
-rw-r--r--lib/libc/unistd/rmdir.c6
-rw-r--r--lib/libc/unistd/setegid.c7
-rw-r--r--lib/libc/unistd/seteuid.c7
-rw-r--r--lib/libc/unistd/setgid.c7
-rw-r--r--lib/libc/unistd/setpgid.c7
-rw-r--r--lib/libc/unistd/setregid.c7
-rw-r--r--lib/libc/unistd/setresgid.c7
-rw-r--r--lib/libc/unistd/setresuid.c7
-rw-r--r--lib/libc/unistd/setreuid.c7
-rw-r--r--lib/libc/unistd/setsid.c7
-rw-r--r--lib/libc/unistd/setuid.c7
-rw-r--r--lib/libc/unistd/sleep.c10
-rw-r--r--lib/libc/unistd/swab.c17
-rw-r--r--lib/libc/unistd/symlink.c6
-rw-r--r--lib/libc/unistd/symlinkat.c7
-rw-r--r--lib/libc/unistd/sync.c6
-rw-r--r--lib/libc/unistd/truncate.c7
-rw-r--r--lib/libc/unistd/unlink.c6
-rw-r--r--lib/libc/unistd/unlinkat.c6
-rw-r--r--lib/libc/unistd/write.c7
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);
+}