• 方便查看 linux/kernel/sys.c


      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()
     17 {
     18         return -ENOSYS;
     19 }
     20 
     21 int sys_break()
     22 {
     23         return -ENOSYS;
     24 }
     25 
     26 int sys_ptrace()
     27 {
     28         return -ENOSYS;
     29 }
     30 
     31 int sys_stty()
     32 {
     33         return -ENOSYS;
     34 }
     35 
     36 int sys_gtty()
     37 {
     38         return -ENOSYS;
     39 }
     40 
     41 int sys_rename()
     42 {
     43         return -ENOSYS;
     44 }
     45 
     46 int sys_prof()
     47 {
     48         return -ENOSYS;
     49 }
     50 
     51 int 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 
     72 int sys_setgid(int gid)
     73 {
     74         return(sys_setregid(gid, gid));
     75 }
     76 
     77 int sys_acct()
     78 {
     79         return -ENOSYS;
     80 }
     81 
     82 int sys_phys()
     83 {
     84         return -ENOSYS;
     85 }
     86 
     87 int sys_lock()
     88 {
     89         return -ENOSYS;
     90 }
     91 
     92 int sys_mpx()
     93 {
     94         return -ENOSYS;
     95 }
     96 
     97 int sys_ulimit()
     98 {
     99         return -ENOSYS;
    100 }
    101 
    102 int 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  */
    118 int 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 
    143 int sys_setuid(int uid)
    144 {
    145         return(sys_setreuid(uid, uid));
    146 }
    147 
    148 int 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 
    156 int 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 
    168 int 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  */
    181 int 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 
    201 int sys_getpgrp(void)
    202 {
    203         return current->pgrp;
    204 }
    205 
    206 int 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 
    216 int 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 
    230 int sys_umask(int mask)
    231 {
    232         int old = current->umask;
    233 
    234         current->umask = mask & 0777;
    235         return (old);
    236 }
    237 
  • 相关阅读:
    题目:心灵的抚慰
    间谍网络
    tarjan算法模版
    rect
    学校食堂
    题目:自然的雪糕
    Winform里众多上下文菜单的控制要怎么做?
    ubuntu更新列表
    瞧,Silverlight是如何被部署到客户机的
    盖茨十条成功箴言 值得一生铭记
  • 原文地址:https://www.cnblogs.com/caesarxu/p/3261220.html
Copyright © 2020-2023  润新知