荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: GyeaonWoo (柏林恋人), 信区: Linux
标  题: Linus's Linux--fs/read_write.c
发信站: 荔园晨风BBS站 (Mon Aug 25 20:11:06 2003), 站内信件

#include <sys/stat.h>
#include <errno.h>
#include <sys/types.h>

#include <linux/kernel.h>
#include <linux/sched.h>
#include <asm/segment.h>

extern int rw_char(int rw,int dev, char * buf, int count);
extern int read_pipe(struct m_inode * inode, char * buf, int count);
extern int write_pipe(struct m_inode * inode, char * buf, int count);
extern int block_read(int dev, off_t * pos, char * buf, int count);
extern int block_write(int dev, off_t * pos, char * buf, int count);
extern int file_read(struct m_inode * inode, struct file * filp,
                char * buf, int count);
extern int file_write(struct m_inode * inode, struct file * filp,
                char * buf, int count);

int sys_lseek(unsigned int fd,off_t offset, int origin)
{
        struct file * file;
        int tmp;

        if (fd >= NR_OPEN || !(file=current->filp[fd]) || !(file->f_inode)
           || !IS_BLOCKDEV(MAJOR(file->f_inode->i_dev)))
                return -EBADF;
        if (file->f_inode->i_pipe)
                return -ESPIPE;
        switch (origin) {
                case 0:
                        if (offset<0) return -EINVAL;
                        file->f_pos=offset;
                        break;
                case 1:
                        if (file->f_pos+offset<0) return -EINVAL;
                        file->f_pos += offset;
                        break;
                case 2:
                        if ((tmp=file->f_inode->i_size+offset) < 0)
                                return -EINVAL;
                        file->f_pos = tmp;
                        break;
                default:
                        return -EINVAL;
        }
        return file->f_pos;
}

int sys_read(unsigned int fd,char * buf,int count)
{
        struct file * file;
        struct m_inode * inode;

        if (fd>=NR_OPEN || count<0 || !(file=current->filp[fd]))
                return -EINVAL;
        if (!count)
                return 0;
        verify_area(buf,count);
        inode = file->f_inode;
        if (inode->i_pipe)
                return (file->f_mode&1)?read_pipe(inode,buf,count):-1;
        if (S_ISCHR(inode->i_mode))
                return rw_char(READ,inode->i_zone[0],buf,count);
        if (S_ISBLK(inode->i_mode))
                return block_read(inode->i_zone[0],&file->f_pos,buf,count);
        if (S_ISDIR(inode->i_mode) || S_ISREG(inode->i_mode)) {
                if (count+file->f_pos > inode->i_size)
                        count = inode->i_size - file->f_pos;
                if (count<=0)
                        return 0;
                return file_read(inode,file,buf,count);
        }
        printk("(Read)inode->i_mode=%06o\n\r",inode->i_mode);
        return -EINVAL;
}

int sys_write(unsigned int fd,char * buf,int count)
{
        struct file * file;
        struct m_inode * inode;

        if (fd>=NR_OPEN || count <0 || !(file=current->filp[fd]))
                return -EINVAL;
        if (!count)
                return 0;
        inode=file->f_inode;
        if (inode->i_pipe)
                return (file->f_mode&2)?write_pipe(inode,buf,count):-1;
        if (S_ISCHR(inode->i_mode))
                return rw_char(WRITE,inode->i_zone[0],buf,count);
        if (S_ISBLK(inode->i_mode))
                return block_write(inode->i_zone[0],&file->f_pos,buf,count);
        if (S_ISREG(inode->i_mode))
                return file_write(inode,file,buf,count);
        printk("(Write)inode->i_mode=%06o\n\r",inode->i_mode);
        return -EINVAL;
}

--
 一个疯子的四大症状:
 一、崇拜悲剧的力量,爱慕美狄亚
 二、痛苦的时候不是发呆就是讲费话
 三、看到有人在赞美肉麻就要发狂
 四、像夸大自己的优点那样夸大自己的缺点活着就像皮影戏,一撤了幕,就什么都没了。

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.35.5]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店