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

1.1     ! root        1: #include <sys/stat.h>
        !             2: #include <errno.h>
        !             3: #include <sys/types.h>
        !             4: 
        !             5: #include <linux/kernel.h>
        !             6: #include <linux/sched.h>
        !             7: #include <asm/segment.h>
        !             8: 
        !             9: extern int rw_char(int rw,int dev, char * buf, int count);
        !            10: extern int read_pipe(struct m_inode * inode, char * buf, int count);
        !            11: extern int write_pipe(struct m_inode * inode, char * buf, int count);
        !            12: extern int block_read(int dev, off_t * pos, char * buf, int count);
        !            13: extern int block_write(int dev, off_t * pos, char * buf, int count);
        !            14: extern int file_read(struct m_inode * inode, struct file * filp,
        !            15:                char * buf, int count);
        !            16: extern int file_write(struct m_inode * inode, struct file * filp,
        !            17:                char * buf, int count);
        !            18: 
        !            19: int sys_lseek(unsigned int fd,off_t offset, int origin)
        !            20: {
        !            21:        struct file * file;
        !            22:        int tmp;
        !            23: 
        !            24:        if (fd >= NR_OPEN || !(file=current->filp[fd]) || !(file->f_inode)
        !            25:           || !IS_BLOCKDEV(MAJOR(file->f_inode->i_dev)))
        !            26:                return -EBADF;
        !            27:        if (file->f_inode->i_pipe)
        !            28:                return -ESPIPE;
        !            29:        switch (origin) {
        !            30:                case 0:
        !            31:                        if (offset<0) return -EINVAL;
        !            32:                        file->f_pos=offset;
        !            33:                        break;
        !            34:                case 1:
        !            35:                        if (file->f_pos+offset<0) return -EINVAL;
        !            36:                        file->f_pos += offset;
        !            37:                        break;
        !            38:                case 2:
        !            39:                        if ((tmp=file->f_inode->i_size+offset) < 0)
        !            40:                                return -EINVAL;
        !            41:                        file->f_pos = tmp;
        !            42:                        break;
        !            43:                default:
        !            44:                        return -EINVAL;
        !            45:        }
        !            46:        return file->f_pos;
        !            47: }
        !            48: 
        !            49: int sys_read(unsigned int fd,char * buf,int count)
        !            50: {
        !            51:        struct file * file;
        !            52:        struct m_inode * inode;
        !            53: 
        !            54:        if (fd>=NR_OPEN || count<0 || !(file=current->filp[fd]))
        !            55:                return -EINVAL;
        !            56:        if (!count)
        !            57:                return 0;
        !            58:        verify_area(buf,count);
        !            59:        inode = file->f_inode;
        !            60:        if (inode->i_pipe)
        !            61:                return (file->f_mode&1)?read_pipe(inode,buf,count):-1;
        !            62:        if (S_ISCHR(inode->i_mode))
        !            63:                return rw_char(READ,inode->i_zone[0],buf,count);
        !            64:        if (S_ISBLK(inode->i_mode))
        !            65:                return block_read(inode->i_zone[0],&file->f_pos,buf,count);
        !            66:        if (S_ISDIR(inode->i_mode) || S_ISREG(inode->i_mode)) {
        !            67:                if (count+file->f_pos > inode->i_size)
        !            68:                        count = inode->i_size - file->f_pos;
        !            69:                if (count<=0)
        !            70:                        return 0;
        !            71:                return file_read(inode,file,buf,count);
        !            72:        }
        !            73:        printk("(Read)inode->i_mode=%06o\n\r",inode->i_mode);
        !            74:        return -EINVAL;
        !            75: }
        !            76: 
        !            77: int sys_write(unsigned int fd,char * buf,int count)
        !            78: {
        !            79:        struct file * file;
        !            80:        struct m_inode * inode;
        !            81:        
        !            82:        if (fd>=NR_OPEN || count <0 || !(file=current->filp[fd]))
        !            83:                return -EINVAL;
        !            84:        if (!count)
        !            85:                return 0;
        !            86:        inode=file->f_inode;
        !            87:        if (inode->i_pipe)
        !            88:                return (file->f_mode&2)?write_pipe(inode,buf,count):-1;
        !            89:        if (S_ISCHR(inode->i_mode))
        !            90:                return rw_char(WRITE,inode->i_zone[0],buf,count);
        !            91:        if (S_ISBLK(inode->i_mode))
        !            92:                return block_write(inode->i_zone[0],&file->f_pos,buf,count);
        !            93:        if (S_ISREG(inode->i_mode))
        !            94:                return file_write(inode,file,buf,count);
        !            95:        printk("(Write)inode->i_mode=%06o\n\r",inode->i_mode);
        !            96:        return -EINVAL;
        !            97: }

unix.superglobalmegacorp.com

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