root/kernel/sys.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. sys_ftime
  2. sys_break
  3. sys_ptrace
  4. sys_stty
  5. sys_gtty
  6. sys_rename
  7. sys_prof
  8. sys_setregid
  9. sys_setgid
  10. sys_acct
  11. sys_phys
  12. sys_lock
  13. sys_mpx
  14. sys_ulimit
  15. sys_time
  16. sys_setreuid
  17. sys_setuid
  18. sys_stime
  19. sys_times
  20. sys_brk
  21. sys_setpgid
  22. sys_getpgrp
  23. sys_setsid
  24. sys_uname
  25. sys_umask

   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 
  16 int sys_ftime()
     /* [previous][next][first][last][top][bottom][index][help] */
  17 {
  18         return -ENOSYS;
  19 }
  20 
  21 int sys_break()
     /* [previous][next][first][last][top][bottom][index][help] */
  22 {
  23         return -ENOSYS;
  24 }
  25 
  26 int sys_ptrace()
     /* [previous][next][first][last][top][bottom][index][help] */
  27 {
  28         return -ENOSYS;
  29 }
  30 
  31 int sys_stty()
     /* [previous][next][first][last][top][bottom][index][help] */
  32 {
  33         return -ENOSYS;
  34 }
  35 
  36 int sys_gtty()
     /* [previous][next][first][last][top][bottom][index][help] */
  37 {
  38         return -ENOSYS;
  39 }
  40 
  41 int sys_rename()
     /* [previous][next][first][last][top][bottom][index][help] */
  42 {
  43         return -ENOSYS;
  44 }
  45 
  46 int sys_prof()
     /* [previous][next][first][last][top][bottom][index][help] */
  47 {
  48         return -ENOSYS;
  49 }
  50 
  51 int sys_setregid(int rgid, int egid)
     /* [previous][next][first][last][top][bottom][index][help] */
  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 
  72 int sys_setgid(int gid)
     /* [previous][next][first][last][top][bottom][index][help] */
  73 {
  74         return(sys_setregid(gid, gid));
  75 }
  76 
  77 int sys_acct()
     /* [previous][next][first][last][top][bottom][index][help] */
  78 {
  79         return -ENOSYS;
  80 }
  81 
  82 int sys_phys()
     /* [previous][next][first][last][top][bottom][index][help] */
  83 {
  84         return -ENOSYS;
  85 }
  86 
  87 int sys_lock()
     /* [previous][next][first][last][top][bottom][index][help] */
  88 {
  89         return -ENOSYS;
  90 }
  91 
  92 int sys_mpx()
     /* [previous][next][first][last][top][bottom][index][help] */
  93 {
  94         return -ENOSYS;
  95 }
  96 
  97 int sys_ulimit()
     /* [previous][next][first][last][top][bottom][index][help] */
  98 {
  99         return -ENOSYS;
 100 }
 101 
 102 int sys_time(long * tloc)
     /* [previous][next][first][last][top][bottom][index][help] */
 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  */
 118 int sys_setreuid(int ruid, int euid)
     /* [previous][next][first][last][top][bottom][index][help] */
 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 
 143 int sys_setuid(int uid)
     /* [previous][next][first][last][top][bottom][index][help] */
 144 {
 145         return(sys_setreuid(uid, uid));
 146 }
 147 
 148 int sys_stime(long * tptr)
     /* [previous][next][first][last][top][bottom][index][help] */
 149 {
 150         if (!suser())
 151                 return -EPERM;
 152         startup_time = get_fs_long((unsigned long *)tptr) - jiffies/HZ;
 153         return 0;
 154 }
 155 
 156 int sys_times(struct tms * tbuf)
     /* [previous][next][first][last][top][bottom][index][help] */
 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 
 168 int sys_brk(unsigned long end_data_seg)
     /* [previous][next][first][last][top][bottom][index][help] */
 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  */
 181 int sys_setpgid(int pid, int pgid)
     /* [previous][next][first][last][top][bottom][index][help] */
 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 
 201 int sys_getpgrp(void)
     /* [previous][next][first][last][top][bottom][index][help] */
 202 {
 203         return current->pgrp;
 204 }
 205 
 206 int sys_setsid(void)
     /* [previous][next][first][last][top][bottom][index][help] */
 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 
 216 int sys_uname(struct utsname * name)
     /* [previous][next][first][last][top][bottom][index][help] */
 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 
 230 int sys_umask(int mask)
     /* [previous][next][first][last][top][bottom][index][help] */
 231 {
 232         int old = current->umask;
 233 
 234         current->umask = mask & 0777;
 235         return (old);
 236 }

/* [previous][next][first][last][top][bottom][index][help] */