summaryrefslogtreecommitdiffstats
path: root/src/kernel/sys.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/sys.c')
-rw-r--r--src/kernel/sys.c236
1 files changed, 236 insertions, 0 deletions
diff --git a/src/kernel/sys.c b/src/kernel/sys.c
new file mode 100644
index 0000000..2c01e67
--- /dev/null
+++ b/src/kernel/sys.c
@@ -0,0 +1,236 @@
1/*
2 * linux/kernel/sys.c
3 *
4 * (C) 1991 Linus Torvalds
5 */
6
7#include <errno.h>
8
9#include <linux/sched.h>
10#include <linux/tty.h>
11#include <linux/kernel.h>
12#include <asm/segment.h>
13#include <sys/times.h>
14#include <sys/utsname.h>
15
16int sys_ftime()
17{
18 return -ENOSYS;
19}
20
21int sys_break()
22{
23 return -ENOSYS;
24}
25
26int sys_ptrace()
27{
28 return -ENOSYS;
29}
30
31int sys_stty()
32{
33 return -ENOSYS;
34}
35
36int sys_gtty()
37{
38 return -ENOSYS;
39}
40
41int sys_rename()
42{
43 return -ENOSYS;
44}
45
46int sys_prof()
47{
48 return -ENOSYS;
49}
50
51int sys_setregid(int rgid, int egid)
52{
53 if (rgid>0) {
54 if ((current->gid == rgid) ||
55 suser())
56 current->gid = rgid;
57 else
58 return(-EPERM);
59 }
60 if (egid>0) {
61 if ((current->gid == egid) ||
62 (current->egid == egid) ||
63 (current->sgid == egid) ||
64 suser())
65 current->egid = egid;
66 else
67 return(-EPERM);
68 }
69 return 0;
70}
71
72int sys_setgid(int gid)
73{
74 return(sys_setregid(gid, gid));
75}
76
77int sys_acct()
78{
79 return -ENOSYS;
80}
81
82int sys_phys()
83{
84 return -ENOSYS;
85}
86
87int sys_lock()
88{
89 return -ENOSYS;
90}
91
92int sys_mpx()
93{
94 return -ENOSYS;
95}
96
97int sys_ulimit()
98{
99 return -ENOSYS;
100}
101
102int sys_time(long * tloc)
103{
104 int i;
105
106 i = CURRENT_TIME;
107 if (tloc) {
108 verify_area(tloc,4);
109 put_fs_long(i,(unsigned long *)tloc);
110 }
111 return i;
112}
113
114/*
115 * Unprivileged users may change the real user id to the effective uid
116 * or vice versa.
117 */
118int sys_setreuid(int ruid, int euid)
119{
120 int old_ruid = current->uid;
121
122 if (ruid>0) {
123 if ((current->euid==ruid) ||
124 (old_ruid == ruid) ||
125 suser())
126 current->uid = ruid;
127 else
128 return(-EPERM);
129 }
130 if (euid>0) {
131 if ((old_ruid == euid) ||
132 (current->euid == euid) ||
133 suser())
134 current->euid = euid;
135 else {
136 current->uid = old_ruid;
137 return(-EPERM);
138 }
139 }
140 return 0;
141}
142
143int sys_setuid(int uid)
144{
145 return(sys_setreuid(uid, uid));
146}
147
148int sys_stime(long * tptr)
149{
150 if (!suser())
151 return -EPERM;
152 startup_time = get_fs_long((unsigned long *)tptr) - jiffies/HZ;
153 return 0;
154}
155
156int sys_times(struct tms * tbuf)
157{
158 if (tbuf) {
159 verify_area(tbuf,sizeof *tbuf);
160 put_fs_long(current->utime,(unsigned long *)&tbuf->tms_utime);
161 put_fs_long(current->stime,(unsigned long *)&tbuf->tms_stime);
162 put_fs_long(current->cutime,(unsigned long *)&tbuf->tms_cutime);
163 put_fs_long(current->cstime,(unsigned long *)&tbuf->tms_cstime);
164 }
165 return jiffies;
166}
167
168int sys_brk(unsigned long end_data_seg)
169{
170 if (end_data_seg >= current->end_code &&
171 end_data_seg < current->start_stack - 16384)
172 current->brk = end_data_seg;
173 return current->brk;
174}
175
176/*
177 * This needs some heave checking ...
178 * I just haven't get the stomach for it. I also don't fully
179 * understand sessions/pgrp etc. Let somebody who does explain it.
180 */
181int sys_setpgid(int pid, int pgid)
182{
183 int i;
184
185 if (!pid)
186 pid = current->pid;
187 if (!pgid)
188 pgid = current->pid;
189 for (i=0 ; i<NR_TASKS ; i++)
190 if (task[i] && task[i]->pid==pid) {
191 if (task[i]->leader)
192 return -EPERM;
193 if (task[i]->session != current->session)
194 return -EPERM;
195 task[i]->pgrp = pgid;
196 return 0;
197 }
198 return -ESRCH;
199}
200
201int sys_getpgrp(void)
202{
203 return current->pgrp;
204}
205
206int sys_setsid(void)
207{
208 if (current->leader && !suser())
209 return -EPERM;
210 current->leader = 1;
211 current->session = current->pgrp = current->pid;
212 current->tty = -1;
213 return current->pgrp;
214}
215
216int sys_uname(struct utsname * name)
217{
218 static struct utsname thisname = {
219 "linux .0","nodename","release ","version ","machine "
220 };
221 int i;
222
223 if (!name) return -ERROR;
224 verify_area(name,sizeof *name);
225 for(i=0;i<sizeof *name;i++)
226 put_fs_byte(((char *) &thisname)[i],i+(char *) name);
227 return 0;
228}
229
230int sys_umask(int mask)
231{
232 int old = current->umask;
233
234 current->umask = mask & 0777;
235 return (old);
236}