📄 read_wri.cpp
字号:
#include "../jffs/jffstypes.h"
#include "../jffs/errno.h"
#include "../jffs/fs.h"
int mf_eof(unsigned int fd)
{
struct file * file;
if (fd >= NR_OPEN || !(file=fget(fd)) || !(file->f_inode))
return -EBADF;
if( file->f_pos >= file->f_inode->i_size)
return 1;
else
return 0;
}
long mf_lseek(unsigned int fd, off_t offset, unsigned int origin)
{
struct file * file;
long tmp = -1;
if (fd >= NR_OPEN || !(file=fget(fd)) || !(file->f_inode))
return -EBADF;
if (origin > 2)
return -EINVAL;
if (file->f_op && file->f_op->lseek)
return file->f_op->lseek(file->f_inode,file,offset,origin);
/* this is the default handler if no lseek handler is present */
switch (origin) {
case 0:
tmp = offset;
break;
case 1:
tmp = file->f_pos + offset;
break;
case 2:
if (!file->f_inode)
return -EINVAL;
tmp = file->f_inode->i_size + offset;
break;
}
if (tmp < 0)
return -EINVAL;
if (tmp != file->f_pos) {
file->f_pos = tmp;
file->f_reada = 0;
/*???file->f_version = ++event;*/
}
return file->f_pos;
}
int mf_read(unsigned int fd,char * buf,int count)
{
int error;
struct file * file;
struct inode * inode;
error = -EBADF;
file = fget(fd);
if (!file)
goto bad_file;
inode = file->f_inode;
if (!inode)
goto out;
/*error = -EBADF;
???if (!(file->f_mode & 1))
goto out;*/
error = -EINVAL;
if (!file->f_op || !file->f_op->read)
goto out;
error = 0;
if (count <= 0)
goto out;
error = file->f_op->read(inode,file,buf,count);
out:
fput(file, inode);
bad_file:
return error;
}
int mf_write(unsigned int fd,char * buf,unsigned int count)
{
int error;
struct file * file;
struct inode * inode;
error = -EBADF;
file = fget(fd);
if (!file)
goto bad_file;
inode = file->f_inode;
if (!inode)
goto out;
/*???if (!(file->f_mode & 2))
goto out;*/
error = -EINVAL;
if (!file->f_op || !file->f_op->write)
goto out;
error = 0;
/*
* If this was a development kernel we'd just drop the test
* its not so we do this for stricter compatibility both to
* applications and drivers.
*/
/*???if (!count && !IS_ZERO_WR(inode))
goto out;*/
/*down(&inode->i_sem);TODO*/
error = file->f_op->write(inode,file,buf,count);
/*up(&inode->i_sem);*/
out:
fput(file, inode);
bad_file:
return error;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -