jsr r0,setimod / indicates i-node has been modified mov (sp)+,r2 / mode is put in r2 (u.off put on stack with / 2nd arg) rts r0 syschmod: / name; mode jsr r0,isown / get the i-node and check user status bit $40000,i.flgs / directory? beq 2f / no bic $60,r2 / su & ex / yes, clear set user id and / executable modes 2: movb r2,i.flgs / move remaining mode to i.flgs br 1f syschown: / name; owner jsr r0,isown / get the i-node and check user status tstb u.uid / super user beq 2f / yes, 2f bit $40,i.flgs / no, set userid on execution? bne 3f / yes error, could create Trojan Horses 2: movb r2,i.uid / no, put the new owners id in the i-node 1: jmp sysret4 3: jmp error arg: mov u.sp,r1 mov *18.(r1),*(r0)+ / put argument of system call into / argument of arg2 add $2,18.(r1) / point pc on stack to next system argument rts r0 arg2: jsr r0,arg; u.namep / u.namep contains value of first arg in / sys call jsr r0,arg; u.off / u.off contains value of second arg in / sys call mov r0,r1 / r0 points to calling routine mov (sp),r0 / put operation code back in r0 mov u.off,(sp) / put pointer to second argument on stack jmp (r1) / return to calling routine systime: / get time of year mov s.time,4(sp) mov s.time+2,2(sp) / put the present time on the stack br sysret4 sysstime: / set time tstb u.uid / is user the super user bne error4 / no, error mov 4(sp),s.time mov 2(sp),s.time+2 / set the system time br sysret4