Annotation of researchv10no/sys/os/sys3.c, revision 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.