方便查看 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 
原文地址:https://www.cnblogs.com/caesarxu/p/3261220.html