home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V6 / usr / sys / ken / sys4.c < prev    next >
Encoding:
C/C++ Source or Header  |  1975-07-18  |  3.6 KB  |  260 lines

  1. #
  2. /*
  3.  */
  4.  
  5. /*
  6.  * Everything in this file is a routine implementing a system call.
  7.  */
  8.  
  9. #include "../param.h"
  10. #include "../user.h"
  11. #include "../reg.h"
  12. #include "../inode.h"
  13. #include "../systm.h"
  14. #include "../proc.h"
  15.  
  16. getswit()
  17. {
  18.  
  19.     u.u_ar0[R0] = SW->integ;
  20. }
  21.  
  22. gtime()
  23. {
  24.  
  25.     u.u_ar0[R0] = time[0];
  26.     u.u_ar0[R1] = time[1];
  27. }
  28.  
  29. stime()
  30. {
  31.  
  32.     if(suser()) {
  33.         time[0] = u.u_ar0[R0];
  34.         time[1] = u.u_ar0[R1];
  35.         wakeup(tout);
  36.     }
  37. }
  38.  
  39. setuid()
  40. {
  41.     register uid;
  42.  
  43.     uid = u.u_ar0[R0].lobyte;
  44.     if(u.u_ruid == uid.lobyte || suser()) {
  45.         u.u_uid = uid;
  46.         u.u_procp->p_uid = uid;
  47.         u.u_ruid = uid;
  48.     }
  49. }
  50.  
  51. getuid()
  52. {
  53.  
  54.     u.u_ar0[R0].lobyte = u.u_ruid;
  55.     u.u_ar0[R0].hibyte = u.u_uid;
  56. }
  57.  
  58. setgid()
  59. {
  60.     register gid;
  61.  
  62.     gid = u.u_ar0[R0].lobyte;
  63.     if(u.u_rgid == gid.lobyte || suser()) {
  64.         u.u_gid = gid;
  65.         u.u_rgid = gid;
  66.     }
  67. }
  68.  
  69. getgid()
  70. {
  71.  
  72.     u.u_ar0[R0].lobyte = u.u_rgid;
  73.     u.u_ar0[R0].hibyte = u.u_gid;
  74. }
  75.  
  76. getpid()
  77. {
  78.     u.u_ar0[R0] = u.u_procp->p_pid;
  79. }
  80.  
  81. sync()
  82. {
  83.  
  84.     update();
  85. }
  86.  
  87. nice()
  88. {
  89.     register n;
  90.  
  91.     n = u.u_ar0[R0];
  92.     if(n > 20)
  93.         n = 20;
  94.     if(n < 0 && !suser())
  95.         n = 0;
  96.     u.u_procp->p_nice = n;
  97. }
  98.  
  99. /*
  100.  * Unlink system call.
  101.  * panic: unlink -- "cannot happen"
  102.  */
  103. unlink()
  104. {
  105.     register *ip, *pp;
  106.     extern uchar;
  107.  
  108.     pp = namei(&uchar, 2);
  109.     if(pp == NULL)
  110.         return;
  111.     prele(pp);
  112.     ip = iget(pp->i_dev, u.u_dent.u_ino);
  113.     if(ip == NULL)
  114.         panic("unlink -- iget");
  115.     if((ip->i_mode&IFMT)==IFDIR && !suser())
  116.         goto out;
  117.     u.u_offset[1] =- DIRSIZ+2;
  118.     u.u_base = &u.u_dent;
  119.     u.u_count = DIRSIZ+2;
  120.     u.u_dent.u_ino = 0;
  121.     writei(pp);
  122.     ip->i_nlink--;
  123.     ip->i_flag =| IUPD;
  124.  
  125. out:
  126.     iput(pp);
  127.     iput(ip);
  128. }
  129.  
  130. chdir()
  131. {
  132.     register *ip;
  133.     extern uchar;
  134.  
  135.     ip = namei(&uchar, 0);
  136.     if(ip == NULL)
  137.         return;
  138.     if((ip->i_mode&IFMT) != IFDIR) {
  139.         u.u_error = ENOTDIR;
  140.     bad:
  141.         iput(ip);
  142.         return;
  143.     }
  144.     if(access(ip, IEXEC))
  145.         goto bad;
  146.     iput(u.u_cdir);
  147.     u.u_cdir = ip;
  148.     prele(ip);
  149. }
  150.  
  151. chmod()
  152. {
  153.     register *ip;
  154.  
  155.     if ((ip = owner()) == NULL)
  156.         return;
  157.     ip->i_mode =& ~07777;
  158.     if (u.u_uid)
  159.         u.u_arg[1] =& ~ISVTX;
  160.     ip->i_mode =| u.u_arg[1]&07777;
  161.     ip->i_flag =| IUPD;
  162.     iput(ip);
  163. }
  164.  
  165. chown()
  166. {
  167.     register *ip;
  168.  
  169.     if (!suser() || (ip = owner()) == NULL)
  170.         return;
  171.     ip->i_uid = u.u_arg[1].lobyte;
  172.     ip->i_gid = u.u_arg[1].hibyte;
  173.     ip->i_flag =| IUPD;
  174.     iput(ip);
  175. }
  176.  
  177. /*
  178.  * Change modified date of file:
  179.  * time to r0-r1; sys smdate; file
  180.  * This call has been withdrawn because it messes up
  181.  * incremental dumps (pseudo-old files aren't dumped).
  182.  * It works though and you can uncomment it if you like.
  183.  
  184. smdate()
  185. {
  186.     register struct inode *ip;
  187.     register int *tp;
  188.     int tbuf[2];
  189.  
  190.     if ((ip = owner()) == NULL)
  191.         return;
  192.     ip->i_flag =| IUPD;
  193.     tp = &tbuf[2];
  194.     *--tp = u.u_ar0[R1];
  195.     *--tp = u.u_ar0[R0];
  196.     iupdat(ip, tp);
  197.     ip->i_flag =& ~IUPD;
  198.     iput(ip);
  199. }
  200. */
  201.  
  202. ssig()
  203. {
  204.     register a;
  205.  
  206.     a = u.u_arg[0];
  207.     if(a<=0 || a>=NSIG || a ==SIGKIL) {
  208.         u.u_error = EINVAL;
  209.         return;
  210.     }
  211.     u.u_ar0[R0] = u.u_signal[a];
  212.     u.u_signal[a] = u.u_arg[1];
  213.     if(u.u_procp->p_sig == a)
  214.         u.u_procp->p_sig = 0;
  215. }
  216.  
  217. kill()
  218. {
  219.     register struct proc *p, *q;
  220.     register a;
  221.     int f;
  222.  
  223.     f = 0;
  224.     a = u.u_ar0[R0];
  225.     q = u.u_procp;
  226.     for(p = &proc[0]; p < &proc[NPROC]; p++) {
  227.         if(p == q)
  228.             continue;
  229.         if(a != 0 && p->p_pid != a)
  230.             continue;
  231.         if(a == 0 && (p->p_ttyp != q->p_ttyp || p <= &proc[1]))
  232.             continue;
  233.         if(u.u_uid != 0 && u.u_uid != p->p_uid)
  234.             continue;
  235.         f++;
  236.         psignal(p, u.u_arg[0]);
  237.     }
  238.     if(f == 0)
  239.         u.u_error = ESRCH;
  240. }
  241.  
  242. times()
  243. {
  244.     register *p;
  245.  
  246.     for(p = &u.u_utime; p  < &u.u_utime+6;) {
  247.         suword(u.u_arg[0], *p++);
  248.         u.u_arg[0] =+ 2;
  249.     }
  250. }
  251.  
  252. profil()
  253. {
  254.  
  255.     u.u_prof[0] = u.u_arg[0] & ~1;    /* base of sample buf */
  256.     u.u_prof[1] = u.u_arg[1];    /* size of same */
  257.     u.u_prof[2] = u.u_arg[2];    /* pc offset */
  258.     u.u_prof[3] = (u.u_arg[3]>>1) & 077777; /* pc scale */
  259. }
  260.