aboutsummaryrefslogtreecommitdiff
path: root/linux/kernel/sys.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux/kernel/sys.c')
-rw-r--r--linux/kernel/sys.c216
1 files changed, 216 insertions, 0 deletions
diff --git a/linux/kernel/sys.c b/linux/kernel/sys.c
new file mode 100644
index 0000000..f18ee7e
--- /dev/null
+++ b/linux/kernel/sys.c
@@ -0,0 +1,216 @@
+#include <errno.h>
+
+#include <linux/sched.h>
+#include <linux/tty.h>
+#include <linux/kernel.h>
+#include <asm/segment.h>
+#include <sys/times.h>
+#include <sys/utsname.h>
+
+int sys_ftime()
+{
+ return -ENOSYS;
+}
+
+int sys_mknod()
+{
+ return -ENOSYS;
+}
+
+int sys_break()
+{
+ return -ENOSYS;
+}
+
+int sys_mount()
+{
+ return -ENOSYS;
+}
+
+int sys_umount()
+{
+ return -ENOSYS;
+}
+
+int sys_ustat(int dev,struct ustat * ubuf)
+{
+ return -1;
+}
+
+int sys_ptrace()
+{
+ return -ENOSYS;
+}
+
+int sys_stty()
+{
+ return -ENOSYS;
+}
+
+int sys_gtty()
+{
+ return -ENOSYS;
+}
+
+int sys_rename()
+{
+ return -ENOSYS;
+}
+
+int sys_prof()
+{
+ return -ENOSYS;
+}
+
+int sys_setgid(int gid)
+{
+ if (current->euid && current->uid)
+ if (current->gid==gid || current->sgid==gid)
+ current->egid=gid;
+ else
+ return -EPERM;
+ else
+ current->gid=current->egid=gid;
+ return 0;
+}
+
+int sys_acct()
+{
+ return -ENOSYS;
+}
+
+int sys_phys()
+{
+ return -ENOSYS;
+}
+
+int sys_lock()
+{
+ return -ENOSYS;
+}
+
+int sys_mpx()
+{
+ return -ENOSYS;
+}
+
+int sys_ulimit()
+{
+ return -ENOSYS;
+}
+
+int sys_time(long * tloc)
+{
+ int i;
+
+ i = CURRENT_TIME;
+ if (tloc) {
+ verify_area(tloc,4);
+ put_fs_long(i,(unsigned long *)tloc);
+ }
+ return i;
+}
+
+int sys_setuid(int uid)
+{
+ if (current->euid && current->uid)
+ if (uid==current->uid || current->suid==current->uid)
+ current->euid=uid;
+ else
+ return -EPERM;
+ else
+ current->euid=current->uid=uid;
+ return 0;
+}
+
+int sys_stime(long * tptr)
+{
+ if (current->euid && current->uid)
+ return -1;
+ startup_time = get_fs_long((unsigned long *)tptr) - jiffies/HZ;
+ return 0;
+}
+
+int sys_times(struct tms * tbuf)
+{
+ if (!tbuf)
+ return jiffies;
+ verify_area(tbuf,sizeof *tbuf);
+ put_fs_long(current->utime,(unsigned long *)&tbuf->tms_utime);
+ put_fs_long(current->stime,(unsigned long *)&tbuf->tms_stime);
+ put_fs_long(current->cutime,(unsigned long *)&tbuf->tms_cutime);
+ put_fs_long(current->cstime,(unsigned long *)&tbuf->tms_cstime);
+ return jiffies;
+}
+
+int sys_brk(unsigned long end_data_seg)
+{
+ if (end_data_seg >= current->end_code &&
+ end_data_seg < current->start_stack - 16384)
+ current->brk = end_data_seg;
+ return current->brk;
+}
+
+/*
+ * This needs some heave checking ...
+ * I just haven't get the stomach for it. I also don't fully
+ * understand sessions/pgrp etc. Let somebody who does explain it.
+ */
+int sys_setpgid(int pid, int pgid)
+{
+ int i;
+
+ if (!pid)
+ pid = current->pid;
+ if (!pgid)
+ pgid = pid;
+ for (i=0 ; i<NR_TASKS ; i++)
+ if (task[i] && task[i]->pid==pid) {
+ if (task[i]->leader)
+ return -EPERM;
+ if (task[i]->session != current->session)
+ return -EPERM;
+ task[i]->pgrp = pgid;
+ return 0;
+ }
+ return -ESRCH;
+}
+
+int sys_getpgrp(void)
+{
+ return current->pgrp;
+}
+
+int sys_setsid(void)
+{
+ if (current->uid && current->euid)
+ return -EPERM;
+ if (current->leader)
+ return -EPERM;
+ current->leader = 1;
+ current->session = current->pgrp = current->pid;
+ current->tty = -1;
+ return current->pgrp;
+}
+
+int sys_uname(struct utsname * name)
+{
+ static struct utsname thisname = {
+ "linux .0","nodename","release ","version ","machine "
+ };
+ int i;
+
+ if (!name) return -1;
+ verify_area(name,sizeof *name);
+ for(i=0;i<sizeof *name;i++)
+ put_fs_byte(((char *) &thisname)[i],i+(char *) name);
+ return (0);
+}
+
+int sys_umask(int mask)
+{
+ int old = current->umask;
+
+ current->umask = mask & 0777;
+ return (old);
+}