aboutsummaryrefslogtreecommitdiff
path: root/sys/linux
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2021-11-19 05:44:21 -0800
committerNicholas Noll <nbnoll@eml.cc>2021-11-19 05:44:21 -0800
commit59d87ccc99f431da06a0ffab0d3e702d9ef82f48 (patch)
treee13de4f7e86cc731add3b3d3bcf3b32ce22adefc /sys/linux
parent835dea0eb6333a9ef452881ea073bfe59d14096a (diff)
chore: make dependence on static syscalls explicit
Diffstat (limited to 'sys/linux')
-rw-r--r--sys/linux/src/brk.c8
-rw-r--r--sys/linux/src/chdir.c8
-rw-r--r--sys/linux/src/chdirfd.c8
-rw-r--r--sys/linux/src/chmod.c8
-rw-r--r--sys/linux/src/close.c8
-rw-r--r--sys/linux/src/dirents.c8
-rw-r--r--sys/linux/src/dup.c8
-rw-r--r--sys/linux/src/errno.inc.h89
-rw-r--r--sys/linux/src/errormsg.c26
-rw-r--r--sys/linux/src/exec.c8
-rw-r--r--sys/linux/src/fork.c8
-rw-r--r--sys/linux/src/getgid.c8
-rw-r--r--sys/linux/src/getpgid.c8
-rw-r--r--sys/linux/src/getpid.c8
-rw-r--r--sys/linux/src/getuid.c8
-rw-r--r--sys/linux/src/info.c7
-rw-r--r--sys/linux/src/infoat.c8
-rw-r--r--sys/linux/src/infofd.c10
-rw-r--r--sys/linux/src/internal.h271
-rw-r--r--sys/linux/src/ioctl.c17
-rw-r--r--sys/linux/src/madvise.c8
-rw-r--r--sys/linux/src/mkdir.c8
-rw-r--r--sys/linux/src/mkdirat.c8
-rw-r--r--sys/linux/src/mkfifo.c8
-rw-r--r--sys/linux/src/mknode.c7
-rw-r--r--sys/linux/src/mknodeat.c8
-rw-r--r--sys/linux/src/mlock.c8
-rw-r--r--sys/linux/src/mmap.c17
-rw-r--r--sys/linux/src/mprotect.c14
-rw-r--r--sys/linux/src/mremap.c20
-rw-r--r--sys/linux/src/munlock.c8
-rw-r--r--sys/linux/src/munmap.c8
-rw-r--r--sys/linux/src/open.c8
-rw-r--r--sys/linux/src/read.c8
-rw-r--r--sys/linux/src/sbrk.c6
-rw-r--r--sys/linux/src/seek.c8
-rw-r--r--sys/linux/src/setpgid.c8
-rw-r--r--sys/linux/src/wait.c7
-rw-r--r--sys/linux/src/waitfor.c8
-rw-r--r--sys/linux/src/write.c8
40 files changed, 715 insertions, 0 deletions
diff --git a/sys/linux/src/brk.c b/sys/linux/src/brk.c
new file mode 100644
index 0000000..85dd30c
--- /dev/null
+++ b/sys/linux/src/brk.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·brk(void *addr)
+{
+ long ret = syscall(·Brk, addr);
+ return error(ret);
+}
diff --git a/sys/linux/src/chdir.c b/sys/linux/src/chdir.c
new file mode 100644
index 0000000..d64446a
--- /dev/null
+++ b/sys/linux/src/chdir.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·chdir(char *path)
+{
+ intptr ret = syscall(·Chdir, path);
+ return error(ret);
+}
diff --git a/sys/linux/src/chdirfd.c b/sys/linux/src/chdirfd.c
new file mode 100644
index 0000000..ad84d2b
--- /dev/null
+++ b/sys/linux/src/chdirfd.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·chdirfd(int fd)
+{
+ intptr ret = syscall(·FChdir, fd);
+ return error(ret);
+}
diff --git a/sys/linux/src/chmod.c b/sys/linux/src/chmod.c
new file mode 100644
index 0000000..a37a037
--- /dev/null
+++ b/sys/linux/src/chmod.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·chmod(char *path, uint mode)
+{
+ long ret = syscall(·Chmod, path, mode);
+ return error(ret);
+}
diff --git a/sys/linux/src/close.c b/sys/linux/src/close.c
new file mode 100644
index 0000000..b9da3ab
--- /dev/null
+++ b/sys/linux/src/close.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·close(int fd)
+{
+ intptr ret = syscall(·Close, fd);
+ return error(ret);
+}
diff --git a/sys/linux/src/dirents.c b/sys/linux/src/dirents.c
new file mode 100644
index 0000000..c00ce15
--- /dev/null
+++ b/sys/linux/src/dirents.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·dirents(int fd, int len, void *buffer, int *size)
+{
+ long ret = *size = syscall(·GetDents, fd, buffer, len);
+ return error(ret);
+}
diff --git a/sys/linux/src/dup.c b/sys/linux/src/dup.c
new file mode 100644
index 0000000..5877df3
--- /dev/null
+++ b/sys/linux/src/dup.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·dup(int oldfd, int newfd)
+{
+ intptr ret = syscall(·Dup2, oldfd, newfd);
+ return error(ret);
+}
diff --git a/sys/linux/src/errno.inc.h b/sys/linux/src/errno.inc.h
new file mode 100644
index 0000000..58ee427
--- /dev/null
+++ b/sys/linux/src/errno.inc.h
@@ -0,0 +1,89 @@
+E(0, "no error information")
+E(sys·ErrorBadWideChar, "illegal byte sequence")
+E(sys·ErrorBadDomain, "domain error")
+E(sys·ErrorBadResult, "result not representable")
+E(sys·ErrorNotTTY, "not a tty")
+E(sys·ErrorAccess, "permission denied")
+E(sys·ErrorNotPermit, "operation not permitted")
+E(sys·ErrorNoEntry, "no such file or directory")
+E(sys·ErrorNoProc, "no such process")
+E(sys·ErrorExists, "file exists")
+E(sys·ErrorOverflow, "value too large for data type")
+E(sys·ErrorNoSpace, "no space left on device")
+E(sys·ErrorNoMemory, "out of memory")
+E(sys·ErrorBusy, "resource busy")
+E(sys·ErrorInterrupt, "interrupted system call")
+E(sys·ErrorAgain, "resource temporarily unavailable")
+E(sys·ErrorNoSeek, "invalid seek")
+E(sys·ErrorExDevice, "cross-device link")
+E(sys·ErrorReadOnly, "read-only file system")
+E(sys·ErrorNotEmptyDir, "directory not empty")
+E(sys·ErrorResetConnect, "connection reset by peer")
+E(sys·ErrorTimedOut, "operation timed out")
+E(sys·ErrorRefuseConnect, "connection refused")
+E(sys·ErrorHostDown, "host is down")
+E(sys·ErrorHostHang, "host is unreachable")
+E(sys·ErrorAddrInUse, "address in use")
+E(sys·ErrorBadPipe, "broken pipe")
+E(sys·ErrorIO, "i/o error")
+E(sys·ErrorNoDevAddr, "no such device or address")
+E(sys·ErrorNotBlk, "block device required")
+E(sys·ErrorNoDevice, "no such device")
+E(sys·ErrorNotDir, "not a directory")
+E(sys·ErrorIsDir, "is a directory")
+E(sys·ErrorTxtBusy, "text file busy")
+E(sys·ErrorExecFmt, "exec format error")
+E(sys·ErrorBadArg, "invalid argument")
+E(sys·ErrorArgLen, "argument list too long")
+E(sys·ErrorLinkLoop, "symbolic link loop")
+E(sys·ErrorNameLen, "filename too long")
+E(sys·ErrorNoFiles, "too many open files in system")
+E(sys·ErrorNoFd, "no file descriptors available")
+E(sys·ErrorBadFd, "bad file descriptor")
+E(sys·ErrorNoChild, "no child process")
+E(sys·ErrorBadAddr, "bad address")
+E(sys·ErrorBigFile, "file too large")
+E(sys·ErrorNoLink, "too many links")
+E(sys·ErrorNoLock, "no locks available")
+E(sys·ErrorDeadlock, "resource deadlock would occur")
+E(sys·ErrorNoRecover, "state not recoverable")
+E(sys·ErrorOwnerDie, "previous owner died")
+E(sys·ErrorCancel, "operation canceled")
+E(sys·ErrorNoSyscall, "function not implemented")
+E(sys·ErrorNoMsg, "no message of desired type")
+E(sys·ErrorNoIdent, "identifier removed")
+E(sys·ErrorNoStr, "device not a stream")
+E(sys·ErrorNoData, "no data available")
+E(sys·ErrorTimeout, "device timeout")
+E(sys·ErrorNoStream, "out of streams resources")
+E(sys·ErrorDeadLink, "link has been severed")
+E(sys·ErrorProtocol, "protocol error")
+E(sys·ErrorBadMsg, "bad message")
+E(sys·ErrorBadFdState, "file descriptor in bad state")
+E(sys·ErrorNotSocket, "not a socket")
+E(sys·ErrorNeedDstAddr, "destination address required")
+E(sys·ErrorMsgLen, "message too large")
+E(sys·ErrorBadProtocol, "protocol wrong type for socket")
+E(sys·ErrorNoProtocol, "protocol not available")
+E(sys·ErrorNoProtocolSupport, "protocol not supported")
+E(sys·ErrorNoSocketSupport, "socket type not supported")
+E(sys·ErrorNoSupport, "not supported")
+E(sys·ErrorNoPFSupport, "protocol family not supported")
+E(sys·ErrorNoAFSupport, "address family not supported by protocol")
+E(sys·ErrorAddrNotAvail, "address not available")
+E(sys·ErrorNetDown, "network is down")
+E(sys·ErrorNetHang, "network unreachable")
+E(sys·ErrorNetReset, "connection reset by network")
+E(sys·ErrorAbortConnect, "connection aborted")
+E(sys·ErrorNoBuffer, "no buffer space available")
+E(sys·ErrorIsConnect, "socket is connected")
+E(sys·ErrorNotConnect, "socket not connected")
+E(sys·ErrorShutdown, "cannot send after socket shutdown")
+E(sys·ErrorAlreadyConnect, "operation already in progress")
+E(sys·ErrorInProgress, "operation in progress")
+E(sys·ErrorStale, "stale file handle")
+E(sys·ErrorRemoteIO, "remote i/o error")
+E(sys·ErrorDiskQuota, "quota exceeded")
+E(sys·ErrorNoMedium, "no medium found")
+E(sys·ErrorBadMedium, "wrong medium type")
+E(sys·ErrorMultihop, "multihop attempted")
diff --git a/sys/linux/src/errormsg.c b/sys/linux/src/errormsg.c
new file mode 100644
index 0000000..e1d4b73
--- /dev/null
+++ b/sys/linux/src/errormsg.c
@@ -0,0 +1,26 @@
+#include "internal.h"
+
+static const struct ErrorMessage {
+#define E(n, s) char str##n[sizeof(s)];
+#include "errno.inc.h"
+#undef E
+} errormsg = {
+#define E(n, s) s,
+#include "errno.inc.h"
+#undef E
+};
+
+static const ushort errmsgidx[] = {
+#define E(n, s) [n] = offsetof(struct ErrorMessage, str##n),
+#include "errno.inc.h"
+#undef E
+};
+
+char *
+sys·errormsg(int errno)
+{
+ if(errno >= arrlen(errmsgidx))
+ errno=0;
+
+ return (char*)(&errormsg + errmsgidx[errno]);
+}
diff --git a/sys/linux/src/exec.c b/sys/linux/src/exec.c
new file mode 100644
index 0000000..d00e9dd
--- /dev/null
+++ b/sys/linux/src/exec.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·exec(char *prog, char *argv[], char *env[])
+{
+ intptr ret = syscall(·ExecVe, prog, argv, env);
+ return error(ret);
+}
diff --git a/sys/linux/src/fork.c b/sys/linux/src/fork.c
new file mode 100644
index 0000000..c33caa2
--- /dev/null
+++ b/sys/linux/src/fork.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·fork(void)
+{
+ intptr ret = syscall(·Fork);
+ return error(ret);
+}
diff --git a/sys/linux/src/getgid.c b/sys/linux/src/getgid.c
new file mode 100644
index 0000000..e9c6583
--- /dev/null
+++ b/sys/linux/src/getgid.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·getgid(void)
+{
+ long ret = syscall(·GetGid);
+ return error(ret);
+}
diff --git a/sys/linux/src/getpgid.c b/sys/linux/src/getpgid.c
new file mode 100644
index 0000000..7077c8b
--- /dev/null
+++ b/sys/linux/src/getpgid.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·getpgid(int pid)
+{
+ long ret = syscall(·GetPGid, pid);
+ return error(ret);
+}
diff --git a/sys/linux/src/getpid.c b/sys/linux/src/getpid.c
new file mode 100644
index 0000000..527bdb2
--- /dev/null
+++ b/sys/linux/src/getpid.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·getpid(void)
+{
+ long ret = syscall(·GetPid);
+ return error(ret);
+}
diff --git a/sys/linux/src/getuid.c b/sys/linux/src/getuid.c
new file mode 100644
index 0000000..aebf32b
--- /dev/null
+++ b/sys/linux/src/getuid.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·getuid(void)
+{
+ long ret = syscall(·GetUid);
+ return error(ret);
+}
diff --git a/sys/linux/src/info.c b/sys/linux/src/info.c
new file mode 100644
index 0000000..60f32a0
--- /dev/null
+++ b/sys/linux/src/info.c
@@ -0,0 +1,7 @@
+#include "internal.h"
+
+int
+sys·info(char *path, sys·Info *file)
+{
+ return sys·infoat(sys·FdCwd, path, 0, sys·InfoAll, file);
+}
diff --git a/sys/linux/src/infoat.c b/sys/linux/src/infoat.c
new file mode 100644
index 0000000..ccbaf18
--- /dev/null
+++ b/sys/linux/src/infoat.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·infoat(int dirfd, char *path, int flag, uint mask, sys·Info *file)
+{
+ long ret = syscall(·StatX, dirfd, path, flag, mask, file);
+ return error(ret);
+}
diff --git a/sys/linux/src/infofd.c b/sys/linux/src/infofd.c
new file mode 100644
index 0000000..8b2973b
--- /dev/null
+++ b/sys/linux/src/infofd.c
@@ -0,0 +1,10 @@
+#include "internal.h"
+#include <linux/stat.h>
+
+int
+sys·infofd(int fd, sys·Info *file)
+{
+ if(fd < 0)
+ return sys·ErrorBadFd;
+ return sys·infoat(fd, "", sys·AtEmptyPath, sys·InfoAll, file);
+}
diff --git a/sys/linux/src/internal.h b/sys/linux/src/internal.h
new file mode 100644
index 0000000..e8bb76c
--- /dev/null
+++ b/sys/linux/src/internal.h
@@ -0,0 +1,271 @@
+#pragma once
+
+#include <u.h>
+#include <sys.h>
+#include <syscall.h>
+
+#define syscall0(n) _syscall0(n)
+#define syscall1(n,a1) _syscall1(n,sysarg(a1))
+#define syscall2(n,a1,a2) _syscall2(n,sysarg(a1),sysarg(a2))
+#define syscall3(n,a1,a2,a3) _syscall3(n,sysarg(a1),sysarg(a2),sysarg(a3))
+#define syscall4(n,a1,a2,a3,a4) _syscall4(n,sysarg(a1),sysarg(a2),sysarg(a3),sysarg(a4))
+#define syscall5(n,a1,a2,a3,a4,a5) _syscall5(n,sysarg(a1),sysarg(a2),sysarg(a3),sysarg(a4),sysarg(a5))
+#define syscall6(n,a1,a2,a3,a4,a5,a6) _syscall6(n,sysarg(a1),sysarg(a2),sysarg(a3),sysarg(a4),sysarg(a5),sysarg(a6))
+#define syscall7(n,a1,a2,a3,a4,a5,a6,a7) _syscall7(n,sysarg(a1),sysarg(a2),sysarg(a3),sysarg(a4),sysarg(a5),sysarg(a6),sysarg(a7))
+
+#define __SYSCALL_NARGS_X(a,b,c,d,e,f,g,h,n,...) n
+#define __SYSCALL_NARGS(...) __SYSCALL_NARGS_X(__VA_ARGS__,7,6,5,4,3,2,1,0,)
+#define __SYSCALL_CONCAT_X(a,b) a##b
+#define __SYSCALL_CONCAT(a,b) __SYSCALL_CONCAT_X(a,b)
+#define __SYSCALL_DISP(b,...) __SYSCALL_CONCAT(b,__SYSCALL_NARGS(__VA_ARGS__))(__VA_ARGS__)
+
+#define syscall(...) __SYSCALL_DISP(syscall,__VA_ARGS__)
+
+#ifndef sysarg
+# define sysarg(x) ((long)(x))
+#endif
+
+#define error(ret) ((ret) < 0 && (ret) > -4096) ? (-(ret)) : 0
+
+/*********************************************
+ * XXX: below this line is computer generated
+ *********************************************/
+
+/* legacy cleanup */
+#ifdef ·SocketCall
+#endif
+
+#ifdef ·GetUid32
+# undef ·LChown
+# undef ·GetUid
+# undef ·GetGid
+# undef ·GetEUid
+# undef ·GetEGid
+# undef ·SetReUid
+# undef ·SetReGid
+# undef ·GetGroups
+# undef ·SetGroups
+# undef ·FChown
+# undef ·SetResUid
+# undef ·GetResUid
+# undef ·SetResGid
+# undef ·GetResGid
+# undef ·Chown
+# undef ·SetUid
+# undef ·SetGid
+# undef ·SetFsUid
+# undef ·SetFsGid
+# define ·LChown ·LChown32
+# define ·GetUid ·GetUid32
+# define ·GetGid ·GetGid32
+# define ·GetEUid ·GetEUid32
+# define ·GetEGid ·GetEGid32
+# define ·SetReUid ·SetReUid32
+# define ·SetReGid ·SetReGid32
+# define ·GetGroups ·GetGroups32
+# define ·SetGroups ·SetGroups32
+# define ·FChown ·FChown32
+# define ·SetResUid ·SetResUid32
+# define ·GetResUid ·GetResUid32
+# define ·SetResGid ·SetResGid32
+# define ·GetResGid ·GetResGid32
+# define ·Chown ·Chown32
+# define ·SetUid ·SetUid32
+# define ·SetGid ·SetGid32
+# define ·SetFsUid ·SetFsUid32
+# define ·SetFsGid ·SetFsGid32
+#endif
+
+#ifdef ·FCntl64
+# undef ·FCntl
+# define ·FCntl ·FCntl64
+#endif
+
+#ifdef ·GetDents64
+# undef ·GetDents
+# define ·GetDents ·GetDents64
+#endif
+
+#ifdef ·FTruncate64
+# undef ·FTruncate
+# undef ·Truncate
+# define ·FTruncate ·FTruncate64
+# define ·Truncate ·Truncate64
+#endif
+
+#ifdef ·Stat64
+# undef ·Stat
+# define ·Stat ·Stat64
+#endif
+
+#ifdef ·FStat64
+# undef ·FStat
+# define ·FStat ·FStat64
+#endif
+
+#ifdef ·LStat64
+# undef ·LStat
+# define ·LStat ·LStat64
+#endif
+
+#ifdef ·StatFs64
+# undef ·StatFs
+# define ·StatFs ·StatFs64
+#endif
+
+#ifdef ·FStatFs64
+# undef ·FStatFs
+# define ·FStatFs ·FStatFs64
+#endif
+
+#ifdef ·NewFStatAt
+# undef ·FStatAt
+# define ·FStatAt ·NewFStatAt
+# undef ·FStatAt
+# define ·FStatAt ·FStatAt64
+#endif
+
+#ifdef ·UGetRLimit
+# undef ·GetRLimit
+# define ·GetRLimit ·UGetRLimit
+#endif
+
+#ifdef ·NewSelect
+# undef ·Select
+# define ·Select ·NewSelect
+#endif
+
+#ifdef ·PRead64
+# undef ·PRead
+# undef ·PWrite
+# define ·PRead ·PRead64
+# define ·PWrite ·PWrite64
+#endif
+
+#ifdef ·FAdvise6464
+# undef ·FAdvise
+# define ·FAdvise ·FAdvise6464
+# undef ·FAdvise
+# define ·FAdvise ·FAdvise64
+#endif
+
+#ifdef ·SendFile64
+# undef ·SendFile
+# define ·SendFile ·SendFile64
+#endif
+
+#ifndef ·TimerSetTime
+# define ·TimerSetTime ·TimerSetTime32
+#endif
+
+#ifndef ·TimerGetTime
+# define ·TimerGetTime ·TimerGetTime32
+#endif
+
+#ifndef ·TimerFdSetTime
+# define ·TimerFdSetTime ·TimerFdSetTime32
+#endif
+
+#ifndef ·TimerFdGetTime
+# define ·TimerFdGetTime ·TimerFdGetTime32
+#endif
+
+#ifndef ·ClockSetTime
+# define ·ClockSetTime ·ClockSetTime32
+#endif
+
+#ifndef ·ClockGetTime
+# define ·ClockGetTime ·ClockGetTime32
+#endif
+
+#ifndef ·ClockGetRes
+# define ·ClockGetRes ·ClockGetResTime32
+#endif
+
+#ifndef ·ClockNanoSleep
+# define ·ClockNanoSleep ·ClockNanoSleepTime32
+#endif
+
+#ifndef ·GetTimeOfDay
+# define ·GetTimeOfDay ·GetTimeOfDayTime32
+#endif
+
+#ifndef ·SetTimeOfDay
+# define ·SetTimeOfDay ·SetTimeOfDayTime32
+#endif
+
+#ifndef ·ClockGetTime
+# define ·ClockGetTime ·ClockGetTime64
+#endif
+
+#ifndef ·ClockSetTime
+# define ·ClockSetTime ·ClockSetTime64
+#endif
+
+#ifndef ·ClockAdjTime
+# define ·ClockAdjTime ·ClockAdjTime64
+#endif
+
+#ifndef ·ClockGetRes
+# define ·ClockGetRes ·ClockGetResTime64
+#endif
+
+#ifndef ·ClockNanoSleep
+# define ·ClockNanoSleep ·ClockNanoSleepTime64
+#endif
+
+#ifndef ·TimerGetTime
+# define ·TimerGetTime ·TimerGetTime64
+#endif
+
+#ifndef ·TimerSetTime
+# define ·TimerSetTime ·TimerSetTime64
+#endif
+
+#ifndef ·TimerFdGetTime
+# define ·TimerFdGetTime ·TimerFdGetTime64
+#endif
+
+#ifndef ·TimerFdSetTime
+# define ·TimerFdSetTime ·TimerFdSetTime64
+#endif
+
+#ifndef ·UTimeNsAt
+# define ·UTimeNsAt ·UTimeNsAtTime64
+#endif
+
+#ifndef ·PSelect6
+# define ·PSelect6 ·PSelect6Time64
+#endif
+
+#ifndef ·PPoll
+# define ·PPoll ·PPollTime64
+#endif
+
+#ifndef ·RecvMMsg
+# define ·RecvMMsg ·RecvMMsgTime64
+#endif
+
+#ifndef ·MQTimedSend
+# define ·MQTimedSend ·MQTimedSendTime64
+#endif
+
+#ifndef ·MQTimedReceive
+# define ·MQTimedReceive ·MQTimedReceiveTime64
+#endif
+
+#ifndef ·RtSigTimedWait
+# define ·RtSigTimedWait ·RtSigTimedWaitTime64
+#endif
+
+#ifndef ·Futex
+# define ·Futex ·FutexTime64
+#endif
+
+#ifndef ·SchedRrGetInterval
+# define ·SchedRrGetInterval ·SchedRrGetIntervalTime64
+#endif
+
+#ifndef ·Accept
+# define ·Accept ·Accept4
+#endif
diff --git a/sys/linux/src/ioctl.c b/sys/linux/src/ioctl.c
new file mode 100644
index 0000000..30c7318
--- /dev/null
+++ b/sys/linux/src/ioctl.c
@@ -0,0 +1,17 @@
+#include "internal.h"
+#include <asm/ioctl.h>
+
+int
+sys·ioctl(int fd, int request, ...)
+{
+ long ret;
+ void *arg;
+ va_list ap;
+
+ va_start(ap, request);
+ arg = va_arg(ap, void*);
+ va_end(ap);
+
+ ret = syscall(·IoCtl, fd, request, arg);
+ return error(ret);
+}
diff --git a/sys/linux/src/madvise.c b/sys/linux/src/madvise.c
new file mode 100644
index 0000000..49e512e
--- /dev/null
+++ b/sys/linux/src/madvise.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·madvise(void *addr, uintptr len, int advice)
+{
+ long ret = syscall(·MAdvise, addr, len, advice);
+ return error(ret);
+}
diff --git a/sys/linux/src/mkdir.c b/sys/linux/src/mkdir.c
new file mode 100644
index 0000000..0672912
--- /dev/null
+++ b/sys/linux/src/mkdir.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·mkdir(char *path, uint mode)
+{
+ long ret = syscall(·MkdirAt, sys·FdCwd, path, mode);
+ return error(ret);
+}
diff --git a/sys/linux/src/mkdirat.c b/sys/linux/src/mkdirat.c
new file mode 100644
index 0000000..f6239d6
--- /dev/null
+++ b/sys/linux/src/mkdirat.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+mkdirat(int dirfd, char *path, uint mode)
+{
+ long ret = syscall(·MkdirAt, dirfd, path, mode);
+ return error(ret);
+}
diff --git a/sys/linux/src/mkfifo.c b/sys/linux/src/mkfifo.c
new file mode 100644
index 0000000..da12f31
--- /dev/null
+++ b/sys/linux/src/mkfifo.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·mkfifo(char *path, uint mode)
+{
+ long ret = sys·mknode(path, mode|sys·ModeFifo, 0);
+ return error(ret);
+}
diff --git a/sys/linux/src/mknode.c b/sys/linux/src/mknode.c
new file mode 100644
index 0000000..1824664
--- /dev/null
+++ b/sys/linux/src/mknode.c
@@ -0,0 +1,7 @@
+#include "internal.h"
+
+int
+sys·mknode(char *path, uint mode, uint64 device)
+{
+ return sys·mknodeat(sys·FdCwd, path, mode, device);
+}
diff --git a/sys/linux/src/mknodeat.c b/sys/linux/src/mknodeat.c
new file mode 100644
index 0000000..d592731
--- /dev/null
+++ b/sys/linux/src/mknodeat.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·mknodeat(int dirfd, char *path, uint mode, uint64 device)
+{
+ long ret = syscall(·MkNodAt, dirfd, path, mode, device);
+ return error(ret);
+}
diff --git a/sys/linux/src/mlock.c b/sys/linux/src/mlock.c
new file mode 100644
index 0000000..0de348f
--- /dev/null
+++ b/sys/linux/src/mlock.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·mlock(void *addr, uintptr len)
+{
+ long ret = syscall(·MLock, addr, len);
+ return error(ret);
+}
diff --git a/sys/linux/src/mmap.c b/sys/linux/src/mmap.c
new file mode 100644
index 0000000..21d927b
--- /dev/null
+++ b/sys/linux/src/mmap.c
@@ -0,0 +1,17 @@
+#include "internal.h"
+
+int
+sys·mmap(void *start, uintptr len, int protect, int flags, int fd, intptr off, void **buf)
+{
+ long ret;
+ if(len >= PTRDIFF_MAX)
+ return sys·ErrorNoMemory;
+
+ ret = syscall(·MMap, start, len, protect, flags, fd, off);
+ if(ret < 0){
+ *buf = nil;
+ return -ret;
+ }
+ *buf = (void*)ret;
+ return 0;
+}
diff --git a/sys/linux/src/mprotect.c b/sys/linux/src/mprotect.c
new file mode 100644
index 0000000..6d20dc1
--- /dev/null
+++ b/sys/linux/src/mprotect.c
@@ -0,0 +1,14 @@
+#include "internal.h"
+
+int
+sys·mprotect(void *addr, uintptr len, int prot)
+{
+ long ret;
+ uintptr beg, end;
+
+ beg = (uintptr)addr & -PAGESIZE;
+ end = (uintptr)(addr + len + PAGESIZE-1) & -PAGESIZE;
+
+ ret = syscall(·MProtect, beg, end-beg, prot);
+ return error(ret);
+}
diff --git a/sys/linux/src/mremap.c b/sys/linux/src/mremap.c
new file mode 100644
index 0000000..dda05ce
--- /dev/null
+++ b/sys/linux/src/mremap.c
@@ -0,0 +1,20 @@
+#include "internal.h"
+
+int
+sys·mremap(void *addr, uintptr from, uintptr to, int flags, void **ret)
+{
+ long r;
+ void *new;
+
+ if(to >= PTRDIFF_MAX)
+ return sys·ErrorNoMemory;
+
+ new = (flags & sys·RemapFixed) ? *ret : nil;
+ r = syscall(·MRemap, addr, from, to, flags, new);
+ if(r > 0){
+ *ret = (void*)r;
+ return 0;
+ }
+
+ return error(r);
+}
diff --git a/sys/linux/src/munlock.c b/sys/linux/src/munlock.c
new file mode 100644
index 0000000..1986306
--- /dev/null
+++ b/sys/linux/src/munlock.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·munlock(void *addr, uintptr len)
+{
+ long ret = syscall(·MUnlock, addr, len);
+ return error(ret);
+}
diff --git a/sys/linux/src/munmap.c b/sys/linux/src/munmap.c
new file mode 100644
index 0000000..2eee00c
--- /dev/null
+++ b/sys/linux/src/munmap.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·munmap(void *addr, uintptr len)
+{
+ long ret = syscall(·MUnmap, addr, len);
+ return error(ret);
+}
diff --git a/sys/linux/src/open.c b/sys/linux/src/open.c
new file mode 100644
index 0000000..fcc014b
--- /dev/null
+++ b/sys/linux/src/open.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·open(char *path, int flag, int mode, int *ret)
+{
+ intptr err = *ret = syscall(·Open, flag, mode);
+ return error(err);
+}
diff --git a/sys/linux/src/read.c b/sys/linux/src/read.c
new file mode 100644
index 0000000..db9cabf
--- /dev/null
+++ b/sys/linux/src/read.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·read(int fd, uintptr len, void *buf, intptr *n)
+{
+ intptr ret = *n = syscall(·Read, fd, buf, len);
+ return error(ret);
+}
diff --git a/sys/linux/src/sbrk.c b/sys/linux/src/sbrk.c
new file mode 100644
index 0000000..31af79b
--- /dev/null
+++ b/sys/linux/src/sbrk.c
@@ -0,0 +1,6 @@
+#include "internal.h"
+
+int
+sys·sbrk(intptr inc, void *ret)
+{
+}
diff --git a/sys/linux/src/seek.c b/sys/linux/src/seek.c
new file mode 100644
index 0000000..f1f8628
--- /dev/null
+++ b/sys/linux/src/seek.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·seek(int fd, intptr offset, int from, intptr *pos)
+{
+ long ret = *pos = syscall(·LSeek, fd, offset, from);
+ return error(ret);
+}
diff --git a/sys/linux/src/setpgid.c b/sys/linux/src/setpgid.c
new file mode 100644
index 0000000..b77d696
--- /dev/null
+++ b/sys/linux/src/setpgid.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·setpgid(int pid, int pgid)
+{
+ long ret = syscall(·SetPGid, pid, pgid);
+ return error(ret);
+}
diff --git a/sys/linux/src/wait.c b/sys/linux/src/wait.c
new file mode 100644
index 0000000..6d97db2
--- /dev/null
+++ b/sys/linux/src/wait.c
@@ -0,0 +1,7 @@
+#include "internal.h"
+
+int
+sys·wait(int *status)
+{
+ return sys·waitfor(-1, status, 0, nil);
+}
diff --git a/sys/linux/src/waitfor.c b/sys/linux/src/waitfor.c
new file mode 100644
index 0000000..0228427
--- /dev/null
+++ b/sys/linux/src/waitfor.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·waitfor(int pid, int *status, int option, sys·UsageInfo *resource)
+{
+ long ret = syscall(·Wait4, pid, status, option, resource);
+ return error(ret);
+}
diff --git a/sys/linux/src/write.c b/sys/linux/src/write.c
new file mode 100644
index 0000000..7863673
--- /dev/null
+++ b/sys/linux/src/write.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·write(int fd, uintptr len, void *buf, intptr *ret)
+{
+ long err = *ret = syscall(·Write, fd, buf, len);
+ return err;
+}