This source file includes following definitions.
- sys_ftime
- sys_break
- sys_stty
- sys_gtty
- sys_prof
- sys_reboot
- ctrl_alt_del
- sys_setregid
- sys_setgid
- sys_acct
- sys_phys
- sys_lock
- sys_mpx
- sys_ulimit
- sys_time
- sys_setreuid
- sys_setuid
- sys_stime
- sys_times
- sys_brk
- sys_setpgid
- sys_getpgrp
- sys_setsid
- sys_getgroups
- sys_setgroups
- in_group_p
- sys_uname
- sys_sethostname
- sys_getrlimit
- sys_setrlimit
- sys_getrusage
- sys_gettimeofday
- sys_settimeofday
- adjust_clock
- sys_umask
1
2
3
4
5
6
7 #include <errno.h>
8
9 #include <linux/sched.h>
10 #include <linux/tty.h>
11 #include <linux/kernel.h>
12 #include <linux/config.h>
13 #include <asm/segment.h>
14 #include <sys/times.h>
15 #include <sys/utsname.h>
16 #include <sys/param.h>
17 #include <sys/resource.h>
18 #include <string.h>
19
20
21
22
23 static int C_A_D = 1;
24
25
26
27
28
29 struct timezone sys_tz = { 0, 0};
30
31 extern int session_of_pgrp(int pgrp);
32
33 int sys_ftime()
34 {
35 return -ENOSYS;
36 }
37
38 int sys_break()
39 {
40 return -ENOSYS;
41 }
42
43 int sys_stty()
44 {
45 return -ENOSYS;
46 }
47
48 int sys_gtty()
49 {
50 return -ENOSYS;
51 }
52
53 int sys_prof()
54 {
55 return -ENOSYS;
56 }
57
58 extern void hard_reset_now(void);
59
60
61
62
63
64
65
66
67
68 int sys_reboot(int magic, int magic_too, int flag)
69 {
70 if (!suser())
71 return -EPERM;
72 if (magic != 0xfee1dead || magic_too != 672274793)
73 return -EINVAL;
74 if (flag == 0x01234567)
75 hard_reset_now();
76 else if (flag == 0x89ABCDEF)
77 C_A_D = 1;
78 else if (!flag)
79 C_A_D = 0;
80 else
81 return -EINVAL;
82 return (0);
83 }
84
85
86
87
88
89
90 void ctrl_alt_del(void)
91 {
92 if (C_A_D)
93 hard_reset_now();
94 }
95
96
97
98
99
100
101
102
103
104
105
106
107
108 int sys_setregid(int rgid, int egid)
109 {
110 if (rgid>0) {
111 if ((current->gid == rgid) ||
112 suser())
113 current->gid = rgid;
114 else
115 return(-EPERM);
116 }
117 if (egid>0) {
118 if ((current->gid == egid) ||
119 (current->egid == egid) ||
120 suser()) {
121 current->egid = egid;
122 current->sgid = egid;
123 } else
124 return(-EPERM);
125 }
126 return 0;
127 }
128
129
130
131
132 int sys_setgid(int gid)
133 {
134 if (suser())
135 current->gid = current->egid = current->sgid = gid;
136 else if ((gid == current->gid) || (gid == current->sgid))
137 current->egid = gid;
138 else
139 return -EPERM;
140 return 0;
141 }
142
143 int sys_acct()
144 {
145 return -ENOSYS;
146 }
147
148 int sys_phys()
149 {
150 return -ENOSYS;
151 }
152
153 int sys_lock()
154 {
155 return -ENOSYS;
156 }
157
158 int sys_mpx()
159 {
160 return -ENOSYS;
161 }
162
163 int sys_ulimit()
164 {
165 return -ENOSYS;
166 }
167
168 int sys_time(long * tloc)
169 {
170 int i;
171
172 i = CURRENT_TIME;
173 if (tloc) {
174 verify_area(tloc,4);
175 put_fs_long(i,(unsigned long *)tloc);
176 }
177 return i;
178 }
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193 int sys_setreuid(int ruid, int euid)
194 {
195 int old_ruid = current->uid;
196
197 if (ruid>0) {
198 if ((current->euid==ruid) ||
199 (old_ruid == ruid) ||
200 suser())
201 current->uid = ruid;
202 else
203 return(-EPERM);
204 }
205 if (euid>0) {
206 if ((old_ruid == euid) ||
207 (current->euid == euid) ||
208 suser()) {
209 current->euid = euid;
210 current->suid = euid;
211 } else {
212 current->uid = old_ruid;
213 return(-EPERM);
214 }
215 }
216 return 0;
217 }
218
219
220
221
222
223
224
225
226
227
228
229
230 int sys_setuid(int uid)
231 {
232 if (suser())
233 current->uid = current->euid = current->suid = uid;
234 else if ((uid == current->uid) || (uid == current->suid))
235 current->euid = uid;
236 else
237 return -EPERM;
238 return(0);
239 }
240
241 int sys_stime(long * tptr)
242 {
243 if (!suser())
244 return -EPERM;
245 startup_time = get_fs_long((unsigned long *)tptr) - jiffies/HZ;
246 jiffies_offset = 0;
247 return 0;
248 }
249
250 int sys_times(struct tms * tbuf)
251 {
252 if (tbuf) {
253 verify_area(tbuf,sizeof *tbuf);
254 put_fs_long(current->utime,(unsigned long *)&tbuf->tms_utime);
255 put_fs_long(current->stime,(unsigned long *)&tbuf->tms_stime);
256 put_fs_long(current->cutime,(unsigned long *)&tbuf->tms_cutime);
257 put_fs_long(current->cstime,(unsigned long *)&tbuf->tms_cstime);
258 }
259 return jiffies;
260 }
261
262 int sys_brk(unsigned long end_data_seg)
263 {
264 if (end_data_seg >= current->end_code &&
265 end_data_seg < current->start_stack - 16384)
266 current->brk = end_data_seg;
267 return current->brk;
268 }
269
270
271
272
273
274
275
276
277
278
279 int sys_setpgid(int pid, int pgid)
280 {
281 int i;
282
283 if (!pid)
284 pid = current->pid;
285 if (!pgid)
286 pgid = current->pid;
287 if (pgid < 0)
288 return -EINVAL;
289 for (i=0 ; i<NR_TASKS ; i++)
290 if (task[i] && (task[i]->pid == pid) &&
291 ((task[i]->p_pptr == current) ||
292 (task[i] == current))) {
293 if (task[i]->leader)
294 return -EPERM;
295 if ((task[i]->session != current->session) ||
296 ((pgid != pid) &&
297 (session_of_pgrp(pgid) != current->session)))
298 return -EPERM;
299 task[i]->pgrp = pgid;
300 return 0;
301 }
302 return -ESRCH;
303 }
304
305 int sys_getpgrp(void)
306 {
307 return current->pgrp;
308 }
309
310 int sys_setsid(void)
311 {
312 if (current->leader && !suser())
313 return -EPERM;
314 current->leader = 1;
315 current->session = current->pgrp = current->pid;
316 current->tty = -1;
317 return current->pgrp;
318 }
319
320
321
322
323 int sys_getgroups(int gidsetsize, gid_t *grouplist)
324 {
325 int i;
326
327 if (gidsetsize)
328 verify_area(grouplist, sizeof(gid_t) * gidsetsize);
329
330 for (i = 0; (i < NGROUPS) && (current->groups[i] != NOGROUP);
331 i++, grouplist++) {
332 if (gidsetsize) {
333 if (i >= gidsetsize)
334 return -EINVAL;
335 put_fs_word(current->groups[i], (short *) grouplist);
336 }
337 }
338 return(i);
339 }
340
341 int sys_setgroups(int gidsetsize, gid_t *grouplist)
342 {
343 int i;
344
345 if (!suser())
346 return -EPERM;
347 if (gidsetsize > NGROUPS)
348 return -EINVAL;
349 for (i = 0; i < gidsetsize; i++, grouplist++) {
350 current->groups[i] = get_fs_word((unsigned short *) grouplist);
351 }
352 if (i < NGROUPS)
353 current->groups[i] = NOGROUP;
354 return 0;
355 }
356
357 int in_group_p(gid_t grp)
358 {
359 int i;
360
361 if (grp == current->egid)
362 return 1;
363
364 for (i = 0; i < NGROUPS; i++) {
365 if (current->groups[i] == NOGROUP)
366 break;
367 if (current->groups[i] == grp)
368 return 1;
369 }
370 return 0;
371 }
372
373 static struct utsname thisname = {
374 UTS_SYSNAME, UTS_NODENAME, UTS_RELEASE, UTS_VERSION, UTS_MACHINE
375 };
376
377 int sys_uname(struct utsname * name)
378 {
379 int i;
380
381 if (!name) return -ERROR;
382 verify_area(name,sizeof *name);
383 for(i=0;i<sizeof *name;i++)
384 put_fs_byte(((char *) &thisname)[i],i+(char *) name);
385 return 0;
386 }
387
388
389
390
391 int sys_sethostname(char *name, int len)
392 {
393 int i;
394
395 if (!suser())
396 return -EPERM;
397 if (len > MAXHOSTNAMELEN)
398 return -EINVAL;
399 for (i=0; i < len; i++) {
400 if ((thisname.nodename[i] = get_fs_byte(name+i)) == 0)
401 break;
402 }
403 if (thisname.nodename[i]) {
404 thisname.nodename[i>MAXHOSTNAMELEN ? MAXHOSTNAMELEN : i] = 0;
405 }
406 return 0;
407 }
408
409 int sys_getrlimit(int resource, struct rlimit *rlim)
410 {
411 if (resource >= RLIM_NLIMITS)
412 return -EINVAL;
413 verify_area(rlim,sizeof *rlim);
414 put_fs_long(current->rlim[resource].rlim_cur,
415 (unsigned long *) rlim);
416 put_fs_long(current->rlim[resource].rlim_max,
417 ((unsigned long *) rlim)+1);
418 return 0;
419 }
420
421 int sys_setrlimit(int resource, struct rlimit *rlim)
422 {
423 struct rlimit new, *old;
424
425 if (resource >= RLIM_NLIMITS)
426 return -EINVAL;
427 old = current->rlim + resource;
428 new.rlim_cur = get_fs_long((unsigned long *) rlim);
429 new.rlim_max = get_fs_long(((unsigned long *) rlim)+1);
430 if (((new.rlim_cur > old->rlim_max) ||
431 (new.rlim_max > old->rlim_max)) &&
432 !suser())
433 return -EPERM;
434 *old = new;
435 return 0;
436 }
437
438
439
440
441
442
443
444
445
446 int sys_getrusage(int who, struct rusage *ru)
447 {
448 struct rusage r;
449 unsigned long *lp, *lpend, *dest;
450
451 if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN)
452 return -EINVAL;
453 verify_area(ru, sizeof *ru);
454 memset((char *) &r, 0, sizeof(r));
455 if (who == RUSAGE_SELF) {
456 r.ru_utime.tv_sec = CT_TO_SECS(current->utime);
457 r.ru_utime.tv_usec = CT_TO_USECS(current->utime);
458 r.ru_stime.tv_sec = CT_TO_SECS(current->stime);
459 r.ru_stime.tv_usec = CT_TO_USECS(current->stime);
460 r.ru_minflt = current->min_flt;
461 r.ru_majflt = current->maj_flt;
462 } else {
463 r.ru_utime.tv_sec = CT_TO_SECS(current->cutime);
464 r.ru_utime.tv_usec = CT_TO_USECS(current->cutime);
465 r.ru_stime.tv_sec = CT_TO_SECS(current->cstime);
466 r.ru_stime.tv_usec = CT_TO_USECS(current->cstime);
467 r.ru_minflt = current->cmin_flt;
468 r.ru_majflt = current->cmaj_flt;
469 }
470 lp = (unsigned long *) &r;
471 lpend = (unsigned long *) (&r+1);
472 dest = (unsigned long *) ru;
473 for (; lp < lpend; lp++, dest++)
474 put_fs_long(*lp, dest);
475 return(0);
476 }
477
478 int sys_gettimeofday(struct timeval *tv, struct timezone *tz)
479 {
480 if (tv) {
481 verify_area(tv, sizeof *tv);
482 put_fs_long(startup_time + CT_TO_SECS(jiffies+jiffies_offset),
483 (unsigned long *) tv);
484 put_fs_long(CT_TO_USECS(jiffies+jiffies_offset),
485 ((unsigned long *) tv)+1);
486 }
487 if (tz) {
488 verify_area(tz, sizeof *tz);
489 put_fs_long(sys_tz.tz_minuteswest, (unsigned long *) tz);
490 put_fs_long(sys_tz.tz_dsttime, ((unsigned long *) tz)+1);
491 }
492 return 0;
493 }
494
495
496
497
498
499
500
501
502
503
504 int sys_settimeofday(struct timeval *tv, struct timezone *tz)
505 {
506 static int firsttime = 1;
507 void adjust_clock();
508
509 if (!suser())
510 return -EPERM;
511 if (tz) {
512 sys_tz.tz_minuteswest = get_fs_long((unsigned long *) tz);
513 sys_tz.tz_dsttime = get_fs_long(((unsigned long *) tz)+1);
514 if (firsttime) {
515 firsttime = 0;
516 if (!tv)
517 adjust_clock();
518 }
519 }
520 if (tv) {
521 int sec, usec;
522
523 sec = get_fs_long((unsigned long *)tv);
524 usec = get_fs_long(((unsigned long *)tv)+1);
525
526 startup_time = sec - jiffies/HZ;
527 jiffies_offset = usec * HZ / 1000000 - jiffies%HZ;
528 }
529 return 0;
530 }
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548 void adjust_clock()
549 {
550 startup_time += sys_tz.tz_minuteswest*60;
551 }
552
553 int sys_umask(int mask)
554 {
555 int old = current->umask;
556
557 current->umask = mask & 0777;
558 return (old);
559 }
560