Annotation of researchv10no/sys/os/sys3.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.