LSX/sys/sys4.c
#
/*
* Copyright 1975 Bell Telephone Laboratories Inc
*/
/*
* Everything in this file is a routine implementing a system call.
*/
#include "param.h"
#include "user.h"
#include "reg.h"
#include "inode.h"
#include "systm.h"
#include "proc.h"
gtime()
{
u.u_ar0[R0] = time[0];
u.u_ar0[R1] = time[1];
}
stime()
{
time[0] = u.u_ar0[R0];
time[1] = u.u_ar0[R1];
wakeup(tout);
}
getuid()
{
u.u_ar0[R0] = 0;
}
getpid()
{
u.u_ar0[R0] = cpid;
}
sync()
{
update();
}
/*
* Unlink system call.
*/
unlink()
{
register *ip, *pp;
pp = namei(2);
if(pp == NULL)
return;
ip = iget(pp->i_dev, u.u_dent.u_ino);
if(ip == NULL)
goto out1;
u.u_offset[1] =- DIRSIZ+2;
u.u_base = &u.u_dent;
u.u_count = DIRSIZ+2;
u.u_dent.u_ino = 0;
writei(pp);
ip->i_nlink--;
ip->i_flag =| IUPD;
out:
iput(ip);
out1:
iput(pp);
}
chdir()
{
register *ip;
extern uchar;
ip = namei(0);
if(ip == NULL)
return;
if((ip->i_mode&IFMT) != IFDIR) {
u.u_error = ENOTDIR;
bad:
iput(ip);
return;
}
if(access(ip, IEXEC))
goto bad;
iput(u.u_cdir);
u.u_cdir = ip;
}
chmod()
{
register *ip;
if ((ip = owner()) == NULL)
return;
ip->i_mode =& ~07777;
ip->i_mode =| u.u_arg[1]&07777;
ip->i_flag =| IUPD;
iput(ip);
}
ssig()
{
register a;
a = u.u_arg[0];
if(a<=0 || a>=NSIG) {
u.u_error = EINVAL;
return;
}
u.u_ar0[R0] = u.u_signal[a];
u.u_signal[a] = u.u_arg[1];
u.u_signal[9] = 0; /* kill not allowed */
if(u.u_procp->p_sig == a)
u.u_procp->p_sig = 0;
}
/*
* alarm clock signal
*/
alarm()
{
register c, *p;
p = u.u_procp;
c = p->p_clktim;
p->p_clktim = u.u_ar0[R0];
u.u_ar0[R0] = c;
}
/*
* indefinite wait.
* no one should wakeup(&u)
*/
pause()
{
for(;;)
sleep(&u, PSLEP);
}
/*
* become the background process
*/
#ifdef BGOPTION
bground()
{
register int *p1,*p2;
if(bgproc) {
u.u_error = EAGAIN;
return;
}
p1 = &proc[NPROC];
p2 = u.u_procp;
while(p1 < &proc[NPROC+1]) *p1++ = *p2++;
spl7();
bgproc = &proc[NPROC];
cpid--;
u.u_procp = bgproc;
spl0();
}
kill()
{
if(bgproc == 0) {
u.u_error = ESRCH;
return;
}
psignal(bgproc,9);
}
#endif