1: #
   2: #include "../param.h"
   3: #include "../systm.h"
   4: #include "../user.h"
   5: #include "../reg.h"
   6: #include "../file.h"
   7: #include "../inode.h"
   8: 
   9: /*
  10:  * read system call
  11:  */
  12: read()
  13: {
  14:     rdwr(FREAD);
  15: }
  16: 
  17: /*
  18:  * write system call
  19:  */
  20: write()
  21: {
  22:     rdwr(FWRITE);
  23: }
  24: 
  25: /*
  26:  * common code for read and write calls:
  27:  * check permissions, set base, count, and offset,
  28:  * and switch out to readi, writei, or pipe code.
  29:  */
  30: rdwr(mode)
  31: {
  32:     register *fp, m;
  33: 
  34:     m = mode;
  35:     fp = getf(u.u_ar0[R0]);
  36:     if(fp == NULL)
  37:         return;
  38:     if((fp->f_flag&m) == 0) {
  39:         u.u_error = EBADF;
  40:         return;
  41:     }
  42:     u.u_base = u.u_arg[0];
  43:     u.u_count = u.u_arg[1];
  44:     u.u_segflg = 0;
  45:     if(fp->f_flag&FPIPE) {
  46:         if(m==FREAD)
  47:             readp(fp); else
  48:             writep(fp);
  49:     } else {
  50:         u.u_offset[1] = fp->f_offset[1];
  51:         u.u_offset[0] = fp->f_offset[0];
  52:         if(m==FREAD)
  53:             readi(fp->f_inode); else
  54:             writei(fp->f_inode);
  55:         dpadd(fp->f_offset, u.u_arg[1]-u.u_count);
  56:     }
  57:     u.u_ar0[R0] = u.u_arg[1]-u.u_count;
  58: }
  59: 
  60: /*
  61:  * open system call
  62:  */
  63: open()
  64: {
  65:     register *ip;
  66:     extern uchar;
  67: 
  68:     ip = namei(&uchar, 0);
  69:     if(ip == NULL)
  70:         return;
  71:     u.u_arg[1]++;
  72:     open1(ip, u.u_arg[1], 0);
  73: }
  74: 
  75: /*
  76:  * creat system call
  77:  */
  78: creat()
  79: {
  80:     register *ip;
  81:     extern uchar;
  82: 
  83:     ip = namei(&uchar, 1);
  84:     if(ip == NULL) {
  85:         if(u.u_error)
  86:             return;
  87:         ip = maknode(u.u_arg[1]&07777&(~ISVTX));
  88:         if (ip==NULL)
  89:             return;
  90:         open1(ip, FWRITE, 2);
  91:     } else
  92:         open1(ip, FWRITE, 1);
  93: }
  94: 
  95: /*
  96:  * common code for open and creat.
  97:  * Check permissions, allocate an open file structure,
  98:  * and call the device open routine if any.
  99:  */
 100: open1(ip, mode, trf)
 101: int *ip;
 102: {
 103:     register struct file *fp;
 104:     register *rip, m;
 105:     int i;
 106: 
 107:     rip = ip;
 108:     m = mode;
 109:     if(trf != 2) {
 110:         if(m&FREAD)
 111:             access(rip, IREAD);
 112:         if(m&FWRITE) {
 113:             access(rip, IWRITE);
 114:             if((rip->i_mode&IFMT) == IFDIR)
 115:                 u.u_error = EISDIR;
 116:         }
 117:     }
 118:     if(u.u_error)
 119:         goto out;
 120:     if(trf)
 121:         itrunc(rip);
 122:     prele(rip);
 123:     if ((fp = falloc()) == NULL)
 124:         goto out;
 125:     fp->f_flag = m&(FREAD|FWRITE);
 126:     fp->f_inode = rip;
 127:     i = u.u_ar0[R0];
 128:     openi(rip, m&FWRITE);
 129:     if(u.u_error == 0)
 130:         return;
 131:     u.u_ofile[i] = NULL;
 132:     fp->f_count--;
 133: 
 134: out:
 135:     iput(rip);
 136: }
 137: 
 138: /*
 139:  * close system call
 140:  */
 141: close()
 142: {
 143:     register *fp;
 144: 
 145:     fp = getf(u.u_ar0[R0]);
 146:     if(fp == NULL)
 147:         return;
 148:     u.u_ofile[u.u_ar0[R0]] = NULL;
 149:     closef(fp);
 150: }
 151: 
 152: /*
 153:  * seek system call
 154:  */
 155: seek()
 156: {
 157:     int n[2];
 158:     register *fp, t;
 159: 
 160:     fp = getf(u.u_ar0[R0]);
 161:     if(fp == NULL)
 162:         return;
 163:     if(fp->f_flag&FPIPE) {
 164:         u.u_error = ESPIPE;
 165:         return;
 166:     }
 167:     t = u.u_arg[1];
 168:     if(t > 2) {
 169:         n[1] = u.u_arg[0]<<9;
 170:         n[0] = u.u_arg[0]>>7;
 171:         if(t == 3)
 172:             n[0] =& 0777;
 173:     } else {
 174:         n[1] = u.u_arg[0];
 175:         n[0] = 0;
 176:         if(t!=0 && n[1]<0)
 177:             n[0] = -1;
 178:     }
 179:     switch(t) {
 180: 
 181:     case 1:
 182:     case 4:
 183:         n[0] =+ fp->f_offset[0];
 184:         dpadd(n, fp->f_offset[1]);
 185:         break;
 186: 
 187:     default:
 188:         n[0] =+ fp->f_inode->i_size0&0377;
 189:         dpadd(n, fp->f_inode->i_size1);
 190: 
 191:     case 0:
 192:     case 3:
 193:         ;
 194:     }
 195:     fp->f_offset[1] = n[1];
 196:     fp->f_offset[0] = n[0];
 197: }
 198: 
 199: /*
 200:  * link system call
 201:  */
 202: link()
 203: {
 204:     register *ip, *xp;
 205:     extern uchar;
 206: 
 207:     ip = namei(&uchar, 0);
 208:     if(ip == NULL)
 209:         return;
 210:     if(ip->i_nlink >= 127) {
 211:         u.u_error = EMLINK;
 212:         goto out;
 213:     }
 214:     if((ip->i_mode&IFMT)==IFDIR && !suser())
 215:         goto out;
 216:     /*
 217: 	 * unlock to avoid possibly hanging the namei
 218: 	 */
 219:     ip->i_flag =& ~ILOCK;
 220:     u.u_dirp = u.u_arg[1];
 221:     xp = namei(&uchar, 1);
 222:     if(xp != NULL) {
 223:         u.u_error = EEXIST;
 224:         iput(xp);
 225:     }
 226:     if(u.u_error)
 227:         goto out;
 228:     if(u.u_pdir->i_dev != ip->i_dev) {
 229:         iput(u.u_pdir);
 230:         u.u_error = EXDEV;
 231:         goto out;
 232:     }
 233:     wdir(ip);
 234:     ip->i_nlink++;
 235:     ip->i_flag =| IUPD;
 236: 
 237: out:
 238:     iput(ip);
 239: }
 240: 
 241: /*
 242:  * mknod system call
 243:  */
 244: mknod()
 245: {
 246:     register *ip;
 247:     extern uchar;
 248: 
 249:     if(suser()) {
 250:         ip = namei(&uchar, 1);
 251:         if(ip != NULL) {
 252:             u.u_error = EEXIST;
 253:             goto out;
 254:         }
 255:     }
 256:     if(u.u_error)
 257:         return;
 258:     ip = maknode(u.u_arg[1]);
 259:     if (ip==NULL)
 260:         return;
 261:     ip->i_addr[0] = u.u_arg[2];
 262: 
 263: out:
 264:     iput(ip);
 265: }
 266: 
 267: /*
 268:  * sleep system call
 269:  * not to be confused with the sleep internal routine.
 270:  */
 271: sslep()
 272: {
 273:     char *d[2];
 274: 
 275:     spl7();
 276:     d[0] = time[0];
 277:     d[1] = time[1];
 278:     dpadd(d, u.u_ar0[R0]);
 279: 
 280:     while(dpcmp(d[0], d[1], time[0], time[1]) > 0) {
 281:         if(dpcmp(tout[0], tout[1], time[0], time[1]) <= 0 ||
 282:            dpcmp(tout[0], tout[1], d[0], d[1]) > 0) {
 283:             tout[0] = d[0];
 284:             tout[1] = d[1];
 285:         }
 286:         sleep(tout, PSLEP);
 287:     }
 288:     spl0();
 289: }

Defined functions

close defined in line 141; never used
creat defined in line 78; never used
link defined in line 202; never used
mknod defined in line 244; never used
open defined in line 63; never used
open1 defined in line 100; used 3 times
rdwr defined in line 30; used 2 times
read defined in line 12; never used
seek defined in line 155; never used
sslep defined in line 271; never used
write defined in line 20; never used
Last modified: 1975-07-18
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1400
Valid CSS Valid XHTML 1.0 Strict