aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2021-11-18 17:49:04 -0800
committerNicholas Noll <nbnoll@eml.cc>2021-11-18 17:49:04 -0800
commit835dea0eb6333a9ef452881ea073bfe59d14096a (patch)
tree525c3b4fe8b281813d7234fcc8871c63c627cc19
parent5bcc08d92ae9345d6863f555a3dd9ec960e0860f (diff)
feat: continued filling out system layer
-rw-r--r--include/sys.h13
-rw-r--r--sys/linux/port/os/constants.h2
-rw-r--r--sys/linux/port/os/types.h41
-rw-r--r--sys/src/getgid.c8
-rw-r--r--sys/src/getpgid.c8
-rw-r--r--sys/src/getpid.c8
-rw-r--r--sys/src/getuid.c8
-rw-r--r--sys/src/ioctl.c17
-rw-r--r--sys/src/setpgid.c8
-rw-r--r--sys/src/wait.c7
-rw-r--r--sys/src/waitfor.c8
11 files changed, 127 insertions, 1 deletions
diff --git a/include/sys.h b/include/sys.h
index a838fe8..0c703a8 100644
--- a/include/sys.h
+++ b/include/sys.h
@@ -56,10 +56,23 @@ int sys·direntry(int fd, int len, void *buffer, uintptr *size);
int sys·mknode(char *path, uint mode, uint64 dev);
int sys·mknodeat(int dirfd, char *path, uint mode, uint64 device);
+/* ioctl :( */
+int sys·ioctl(int, int, ...);
+
/* process operations */
+int sys·getpid(void);
+int sys·getuid(void);
+int sys·getgid(void);
+
+int sys·getpgid(int pid);
+int sys·setpgid(int pid, int pgid);
+
int sys·fork(void);
int sys·exec(char *program, char *argv[], char *env[]);
+int sys·wait(int *status);
+int sys·waitfor(int pid, int *status, int option, sys·UsageInfo *msg);
+
/* memory operations */
int sys·brk(void *addr);
//int sys·sbrk(intptr delta, void **ret);
diff --git a/sys/linux/port/os/constants.h b/sys/linux/port/os/constants.h
index 8abf1fa..8fb913f 100644
--- a/sys/linux/port/os/constants.h
+++ b/sys/linux/port/os/constants.h
@@ -23,6 +23,8 @@
#define sys·ModeLink 0120000
#define sys·ModeSocket 0140000
+/* ioctl values */
+
/* mmap */
#define sys·ProtNone 0
#define sys·ProtRead 1
diff --git a/sys/linux/port/os/types.h b/sys/linux/port/os/types.h
index 6e5c0c6..e772b35 100644
--- a/sys/linux/port/os/types.h
+++ b/sys/linux/port/os/types.h
@@ -1,4 +1,5 @@
#pragma once
+#define packed __attribute__((packed))
/*
* time
@@ -6,6 +7,7 @@
/* timeval */
typedef struct sys·TimeStamp sys·TimeStamp;
+typedef struct sys·TimeValue sys·TimeValue;
struct sys·TimeStamp
{
@@ -14,6 +16,41 @@ struct sys·TimeStamp
int32 femto;
};
+struct sys·TimeValue
+{
+ int64 sec;
+ int64 micro;
+};
+
+/* resource */
+typedef struct sys·UsageInfo sys·UsageInfo;
+
+/* rusage */
+struct sys·UsageInfo
+{
+ sys·TimeValue cpu;
+ sys·TimeValue sys;
+ /* linux extensions */
+ long maxrss; /* maximum resident set size */
+ long ixrss; /* integral shared memory size */
+ long idrss; /* integral unshared data size */
+ long isrss; /* integral unshared stack size */
+ struct packed {
+ long minor; /* page reclaims (soft page faults) */
+ long major; /* page faults (hard page faults) */
+ }fault;
+ long nswap; /* swaps */
+ long iblk; /* block input operations */
+ long oblk; /* block output operations */
+ long msgsent; /* IPC messages sent */
+ long msgrcvd; /* IPC messages received */
+ long nsignal; /* signals received */
+ long nvctxsw; /* voluntary context switches */
+ long nictxsw; /* involuntary context switches */
+ /* room for more... */
+ long __reserved[16];
+};
+
/*
* files
*/
@@ -40,7 +77,7 @@ struct sys·Info
sys·TimeStamp access, create, status, modify;
- struct{
+ struct packed{
uint32 major;
uint32 minor;
}spdev;
@@ -70,3 +107,5 @@ struct sys·DirEntry
uchar type; /* filetype */
char name[]; /* filename */
};
+
+#undef packed
diff --git a/sys/src/getgid.c b/sys/src/getgid.c
new file mode 100644
index 0000000..e9c6583
--- /dev/null
+++ b/sys/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/src/getpgid.c b/sys/src/getpgid.c
new file mode 100644
index 0000000..7077c8b
--- /dev/null
+++ b/sys/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/src/getpid.c b/sys/src/getpid.c
new file mode 100644
index 0000000..527bdb2
--- /dev/null
+++ b/sys/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/src/getuid.c b/sys/src/getuid.c
new file mode 100644
index 0000000..aebf32b
--- /dev/null
+++ b/sys/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/src/ioctl.c b/sys/src/ioctl.c
new file mode 100644
index 0000000..30c7318
--- /dev/null
+++ b/sys/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/src/setpgid.c b/sys/src/setpgid.c
new file mode 100644
index 0000000..b77d696
--- /dev/null
+++ b/sys/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/src/wait.c b/sys/src/wait.c
new file mode 100644
index 0000000..6d97db2
--- /dev/null
+++ b/sys/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/src/waitfor.c b/sys/src/waitfor.c
new file mode 100644
index 0000000..0228427
--- /dev/null
+++ b/sys/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);
+}