Annotation of linux/fs/open.c, revision 1.1

1.1     ! root        1: #include <string.h>
        !             2: #include <errno.h>
        !             3: #include <fcntl.h>
        !             4: #include <sys/types.h>
        !             5: #include <utime.h>
        !             6: #include <sys/stat.h>
        !             7: 
        !             8: #include <linux/sched.h>
        !             9: #include <linux/tty.h>
        !            10: #include <linux/kernel.h>
        !            11: #include <asm/segment.h>
        !            12: 
        !            13: int sys_utime(char * filename, struct utimbuf * times)
        !            14: {
        !            15:        struct m_inode * inode;
        !            16:        long actime,modtime;
        !            17: 
        !            18:        if (!(inode=namei(filename)))
        !            19:                return -ENOENT;
        !            20:        if (times) {
        !            21:                actime = get_fs_long((unsigned long *) &times->actime);
        !            22:                modtime = get_fs_long((unsigned long *) &times->modtime);
        !            23:        } else
        !            24:                actime = modtime = CURRENT_TIME;
        !            25:        inode->i_atime = actime;
        !            26:        inode->i_mtime = modtime;
        !            27:        inode->i_dirt = 1;
        !            28:        iput(inode);
        !            29:        return 0;
        !            30: }
        !            31: 
        !            32: int sys_access(const char * filename,int mode)
        !            33: {
        !            34:        struct m_inode * inode;
        !            35:        int res;
        !            36: 
        !            37:        mode &= 0007;
        !            38:        if (!(inode=namei(filename)))
        !            39:                return -EACCES;
        !            40:        res = inode->i_mode & 0777;
        !            41:        iput(inode);
        !            42:        if (!(current->euid && current->uid))
        !            43:                if (res & 0111)
        !            44:                        res = 0777;
        !            45:                else
        !            46:                        res = 0666;
        !            47:        if (current->euid == inode->i_uid)
        !            48:                res >>= 6;
        !            49:        else if (current->egid == inode->i_gid)
        !            50:                res >>= 6;
        !            51:        if ((res & 0007 & mode) == mode)
        !            52:                return 0;
        !            53:        return -EACCES;
        !            54: }
        !            55: 
        !            56: int sys_chdir(const char * filename)
        !            57: {
        !            58:        struct m_inode * inode;
        !            59: 
        !            60:        if (!(inode = namei(filename)))
        !            61:                return -ENOENT;
        !            62:        if (!S_ISDIR(inode->i_mode)) {
        !            63:                iput(inode);
        !            64:                return -ENOTDIR;
        !            65:        }
        !            66:        iput(current->pwd);
        !            67:        current->pwd = inode;
        !            68:        return (0);
        !            69: }
        !            70: 
        !            71: int sys_chroot(const char * filename)
        !            72: {
        !            73:        struct m_inode * inode;
        !            74: 
        !            75:        if (!(inode=namei(filename)))
        !            76:                return -ENOENT;
        !            77:        if (!S_ISDIR(inode->i_mode)) {
        !            78:                iput(inode);
        !            79:                return -ENOTDIR;
        !            80:        }
        !            81:        iput(current->root);
        !            82:        current->root = inode;
        !            83:        return (0);
        !            84: }
        !            85: 
        !            86: int sys_chmod(const char * filename,int mode)
        !            87: {
        !            88:        struct m_inode * inode;
        !            89: 
        !            90:        if (!(inode=namei(filename)))
        !            91:                return -ENOENT;
        !            92:        if (current->uid && current->euid)
        !            93:                if (current->uid!=inode->i_uid && current->euid!=inode->i_uid) {
        !            94:                        iput(inode);
        !            95:                        return -EACCES;
        !            96:                } else 
        !            97:                        mode = (mode & 0777) | (inode->i_mode & 07000);
        !            98:        inode->i_mode = (mode & 07777) | (inode->i_mode & ~07777);
        !            99:        inode->i_dirt = 1;
        !           100:        iput(inode);
        !           101:        return 0;
        !           102: }
        !           103: 
        !           104: int sys_chown(const char * filename,int uid,int gid)
        !           105: {
        !           106:        struct m_inode * inode;
        !           107: 
        !           108:        if (!(inode=namei(filename)))
        !           109:                return -ENOENT;
        !           110:        if (current->uid && current->euid) {
        !           111:                iput(inode);
        !           112:                return -EACCES;
        !           113:        }
        !           114:        inode->i_uid=uid;
        !           115:        inode->i_gid=gid;
        !           116:        inode->i_dirt=1;
        !           117:        iput(inode);
        !           118:        return 0;
        !           119: }
        !           120: 
        !           121: int sys_open(const char * filename,int flag,int mode)
        !           122: {
        !           123:        struct m_inode * inode;
        !           124:        struct file * f;
        !           125:        int i,fd;
        !           126: 
        !           127:        mode &= 0777 & ~current->umask;
        !           128:        for(fd=0 ; fd<NR_OPEN ; fd++)
        !           129:                if (!current->filp[fd])
        !           130:                        break;
        !           131:        if (fd>=NR_OPEN)
        !           132:                return -EINVAL;
        !           133:        current->close_on_exec &= ~(1<<fd);
        !           134:        f=0+file_table;
        !           135:        for (i=0 ; i<NR_FILE ; i++,f++)
        !           136:                if (!f->f_count) break;
        !           137:        if (i>=NR_FILE)
        !           138:                return -EINVAL;
        !           139:        (current->filp[fd]=f)->f_count++;
        !           140:        if ((i=open_namei(filename,flag,mode,&inode))<0) {
        !           141:                current->filp[fd]=NULL;
        !           142:                f->f_count=0;
        !           143:                return i;
        !           144:        }
        !           145: /* ttys are somewhat special (ttyxx major==4, tty major==5) */
        !           146:        if (S_ISCHR(inode->i_mode))
        !           147:                if (MAJOR(inode->i_zone[0])==4) {
        !           148:                        if (current->leader && current->tty<0) {
        !           149:                                current->tty = MINOR(inode->i_zone[0]);
        !           150:                                tty_table[current->tty].pgrp = current->pgrp;
        !           151:                        }
        !           152:                } else if (MAJOR(inode->i_zone[0])==5)
        !           153:                        if (current->tty<0) {
        !           154:                                iput(inode);
        !           155:                                current->filp[fd]=NULL;
        !           156:                                f->f_count=0;
        !           157:                                return -EPERM;
        !           158:                        }
        !           159:        f->f_mode = inode->i_mode;
        !           160:        f->f_flags = flag;
        !           161:        f->f_count = 1;
        !           162:        f->f_inode = inode;
        !           163:        f->f_pos = 0;
        !           164:        return (fd);
        !           165: }
        !           166: 
        !           167: int sys_creat(const char * pathname, int mode)
        !           168: {
        !           169:        return sys_open(pathname, O_CREAT | O_TRUNC, mode);
        !           170: }
        !           171: 
        !           172: int sys_close(unsigned int fd)
        !           173: {      
        !           174:        struct file * filp;
        !           175: 
        !           176:        if (fd >= NR_OPEN)
        !           177:                return -EINVAL;
        !           178:        current->close_on_exec &= ~(1<<fd);
        !           179:        if (!(filp = current->filp[fd]))
        !           180:                return -EINVAL;
        !           181:        current->filp[fd] = NULL;
        !           182:        if (filp->f_count == 0)
        !           183:                panic("Close: file count is 0");
        !           184:        if (--filp->f_count)
        !           185:                return (0);
        !           186:        iput(filp->f_inode);
        !           187:        return (0);
        !           188: }

unix.superglobalmegacorp.com

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