|
|
1.1 ! root 1: /* sys3.c 4.9 81/03/08 */ ! 2: ! 3: #include "sys/param.h" ! 4: #include "sys/systm.h" ! 5: #include "sys/buf.h" ! 6: #include "sys/user.h" ! 7: #include "sys/inode.h" ! 8: #include "sys/file.h" ! 9: #include "sys/conf.h" ! 10: #include "sys/stat.h" ! 11: ! 12: /* ! 13: * the fstat system call. ! 14: */ ! 15: fstat() ! 16: { ! 17: register struct file *fp; ! 18: register struct a { ! 19: int fdes; ! 20: struct stat *sb; ! 21: } *uap; ! 22: register struct inode *ip; ! 23: ! 24: uap = (struct a *)u.u_ap; ! 25: fp = getf(uap->fdes); ! 26: if(fp == NULL) { ! 27: u.u_error = EBADF; ! 28: return; ! 29: } ! 30: ip = fp->f_inode; ! 31: plock(ip); ! 32: iupdat(ip, &time, &time, 0); ! 33: (*fstypsw[ip->i_fstyp]->t_stat)(ip, uap->sb); ! 34: prele(ip); ! 35: } ! 36: ! 37: /* ! 38: * the stat system call. This version follows links. ! 39: */ ! 40: stat() ! 41: { ! 42: register struct inode *ip; ! 43: register struct a { ! 44: char *fname; ! 45: struct stat *sb; ! 46: } *uap; ! 47: ! 48: uap = (struct a *)u.u_ap; ! 49: ip = namei(uap->fname, SEGUDATA, &nilargnamei, 1); ! 50: if(ip == NULL) ! 51: return; ! 52: iupdat(ip, &time, &time, 0); ! 53: (*fstypsw[ip->i_fstyp]->t_stat)(ip, uap->sb); ! 54: iput(ip); ! 55: } ! 56: ! 57: /* ! 58: * the lstat system call. This version does not follow links. ! 59: */ ! 60: lstat() ! 61: { ! 62: register struct inode *ip; ! 63: register struct a { ! 64: char *fname; ! 65: struct stat *sb; ! 66: } *uap; ! 67: ! 68: uap = (struct a *)u.u_ap; ! 69: ip = namei(uap->fname, SEGUDATA, &nilargnamei, 0); ! 70: if(ip == NULL) ! 71: return; ! 72: iupdat(ip, &time, &time, 0); ! 73: (*fstypsw[ip->i_fstyp]->t_stat)(ip, uap->sb); ! 74: iput(ip); ! 75: } ! 76: ! 77: /* ! 78: * readlink -- return target name of a symbolic link ! 79: */ ! 80: readlink() ! 81: { ! 82: register struct inode *ip; ! 83: register struct a { ! 84: char *name; ! 85: char *buf; ! 86: int count; ! 87: } *uap; ! 88: ! 89: uap = (struct a *)u.u_ap; ! 90: ip = namei(uap->name, SEGUDATA, &nilargnamei, 0); ! 91: if (ip == NULL) ! 92: return; ! 93: if ((ip->i_mode&IFMT) != IFLNK) { ! 94: u.u_error = ENXIO; ! 95: goto out; ! 96: } ! 97: u.u_offset = ltoL(0); ! 98: u.u_base = uap->buf; ! 99: u.u_count = uap->count; ! 100: u.u_segflg = SEGUDATA; ! 101: readi(ip); ! 102: out: ! 103: iput(ip); ! 104: u.u_r.r_val1 = uap->count - u.u_count; ! 105: } ! 106: ! 107: /* ! 108: * symlink -- make a symbolic link ! 109: */ ! 110: symlink() ! 111: { ! 112: register struct a { ! 113: char *target; ! 114: char *linkname; ! 115: } *uap; ! 116: register struct inode *ip; ! 117: register nc; ! 118: struct argnamei nmarg; ! 119: ! 120: uap = (struct a *)u.u_ap; ! 121: if ((nc = fustrlen(uap->target)) < 0) { ! 122: u.u_error = EFAULT; ! 123: return; ! 124: } ! 125: nc--; /* fustrlen includes NUL at end */ ! 126: nmarg = nilargnamei; ! 127: nmarg.flag = NI_NXCREAT; ! 128: nmarg.un.mode = IFLNK|0777; ! 129: ip = namei(uap->linkname, SEGUDATA, &nmarg, 0); ! 130: if (ip == NULL) ! 131: return; ! 132: u.u_base = uap->target; ! 133: u.u_count = nc; ! 134: u.u_offset = ltoL(0); ! 135: u.u_segflg = SEGUDATA; ! 136: writei(ip); ! 137: iput(ip); ! 138: } ! 139: ! 140: /* ! 141: * the dup system call. ! 142: */ ! 143: dup() ! 144: { ! 145: register struct file *fp; ! 146: register struct a { ! 147: int fdes; ! 148: int fdes2; ! 149: } *uap; ! 150: register i, m; ! 151: ! 152: uap = (struct a *)u.u_ap; ! 153: m = uap->fdes & ~077; ! 154: uap->fdes &= 077; ! 155: fp = getf(uap->fdes); ! 156: if(fp == NULL) { ! 157: u.u_error = EBADF; ! 158: return; ! 159: } ! 160: if ((m&0100) == 0) { ! 161: if ((i = ufalloc()) < 0) ! 162: return; ! 163: } else { ! 164: i = uap->fdes2; ! 165: if (i<0 || i>=NOFILE) { ! 166: u.u_error = EBADF; ! 167: return; ! 168: } ! 169: u.u_r.r_val1 = i; ! 170: } ! 171: if (i!=uap->fdes) { ! 172: if (u.u_ofile[i]!=NULL) ! 173: closef(u.u_ofile[i]); ! 174: u.u_ofile[i] = fp; ! 175: u.u_pofile[i] = 0; ! 176: fp->f_count++; ! 177: } ! 178: } ! 179: ! 180: /* dirread(fd, buf, buflen) */ ! 181: dirread() ! 182: { struct a { ! 183: int fdes; ! 184: char *buf; ! 185: int len; ! 186: } *uap; ! 187: register struct file *fp; ! 188: register struct inode *ip; ! 189: ! 190: uap = (struct a *)u.u_ap; ! 191: fp = getf(uap->fdes); ! 192: if(fp == NULL) { ! 193: u.u_error = EBADF; ! 194: return; ! 195: } ! 196: if((fp->f_flag&FREAD) == 0) { ! 197: u.u_error = EBADF; ! 198: return; ! 199: } ! 200: u.u_offset = fp->f_offset; ! 201: u.u_base = uap->buf; ! 202: ip = fp->f_inode; ! 203: plock(ip); ! 204: ip->i_flag |= IACC; ! 205: (*fstypsw[ip->i_fstyp]->t_dirread)(ip, uap->len); ! 206: fp->f_offset = u.u_offset; ! 207: prele(ip); ! 208: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.