⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 read_wri.cpp

📁 JFFS的源代码
💻 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 + -