# /* Additional system calls added to vanilla V6 Unix. */ #include "../param.h" #include "../systm.h" #include "../user.h" #include "../reg.h" #include "../file.h" #include "../inode.h" /* * lseek system call */ lseek() { int n[2]; register *fp, t; fp = getf(u.u_ar0[R0]); if(fp == NULL) return; if(fp->f_flag&FPIPE) { u.u_error = ESPIPE; return; } t = u.u_arg[2]; n[0] = u.u_arg[0]; n[1] = u.u_arg[1]; switch(t) { case 0: /* absolute */ break; case 1: /* relative */ n[0] =+ fp->f_offset[0]; dpadd(n, fp->f_offset[1]); break; case 2: /* to end of the file */ n[0] =+ fp->f_inode->i_size0&0377; dpadd(n, fp->f_inode->i_size1); break; default: u.u_error = EFAULT; } u.u_ar0[R0] = fp->f_offset[0]; /* returned results in r0, r1 */ u.u_ar0[R1] = fp->f_offset[1]; fp->f_offset[1] = n[1]; fp->f_offset[0] = n[0]; }