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

📄 isofs.c

📁 newos is new operation system
💻 C
📖 第 1 页 / 共 2 页
字号:
}//--------------------------------------------------------------------------------static int isofs_fsync(fs_cookie _fs, fs_vnode _v){	struct isofs_vnode *v = (struct isofs_vnode *)_v;	TOUCH(v);	TRACE(("isofs_fsync: entry on vnode 0x%x\n", v->id));	return 0;}//--------------------------------------------------------------------------------static int isofs_opendir(fs_cookie _fs, fs_vnode _v, dir_cookie *_cookie){	struct isofs *fs = (struct isofs *)_fs;	struct isofs_vnode *v = (struct isofs_vnode *)_v;	struct isofs_cookie *cookie;	int err = 0;	TRACE(("isofs_opendir: vnode 0x%x\n", v));	if(v->stream.type != STREAM_TYPE_DIR)		return ERR_VFS_NOT_DIR;	cookie = kmalloc(sizeof(struct isofs_cookie));	if(cookie == NULL)		return ERR_NO_MEMORY;	mutex_lock(&fs->lock);	iso_scan_dir(fs, v);	cookie->u.dir.ptr = v->stream.dir_head;	*_cookie = cookie;	mutex_unlock(&fs->lock);	return err;}//--------------------------------------------------------------------------------static int isofs_closedir(fs_cookie _fs, fs_vnode _v, dir_cookie _cookie){	struct isofs *fs = _fs;	struct isofs_vnode *v = _v;	struct isofs_cookie *cookie = _cookie;	TOUCH(fs);TOUCH(v);TOUCH(cookie);	TRACE(("isofs_closedir: entry vnode 0x%x, cookie 0x%x\n", v, cookie));	if(v->stream.type != STREAM_TYPE_DIR)		return ERR_VFS_NOT_DIR;	if(cookie) {		kfree(cookie);	}	return 0;}//--------------------------------------------------------------------------------static int isofs_rewinddir(fs_cookie _fs, fs_vnode _v, dir_cookie _cookie){	struct isofs_vnode *v = _v;	struct isofs_cookie *cookie = _cookie;	int err = 0;	TOUCH(v);	TRACE(("isofs_rewinddir: vnode 0x%x, cookie 0x%x\n", v, cookie));	if(v->stream.type != STREAM_TYPE_DIR)		return ERR_VFS_NOT_DIR;	cookie->u.dir.ptr = cookie->s->dir_head;	return err;}//--------------------------------------------------------------------------------static int isofs_readdir(fs_cookie _fs, fs_vnode _v, dir_cookie _cookie, void *buf, size_t len){	struct isofs *fs = _fs;	struct isofs_vnode *v = _v;	struct isofs_cookie *cookie = _cookie;	int err = 0;	TOUCH(v);	TRACE(("isofs_readdir: vnode 0x%x, cookie 0x%x, len 0x%x\n", v, cookie, len));	if(v->stream.type != STREAM_TYPE_DIR)		return ERR_VFS_NOT_DIR;	if(cookie->u.dir.ptr == NULL)		return 0;	mutex_lock(&fs->lock);	if(strlen(cookie->u.dir.ptr->name) + 1 > len) {		err = ERR_VFS_INSUFFICIENT_BUF;		goto err;	}	err = user_strcpy(buf, cookie->u.dir.ptr->name);	if(err < 0)		goto err;	err = strlen(cookie->u.dir.ptr->name) + 1;	cookie->u.dir.ptr = cookie->u.dir.ptr->dir_next;err:	mutex_unlock(&fs->lock);	return err;}//--------------------------------------------------------------------------------static int isofs_open(fs_cookie _fs, fs_vnode _v, file_cookie *_cookie, int oflags){	struct isofs_vnode *v = _v;	struct isofs_cookie *cookie;	int err = 0;	TRACE(("isofs_open: vnode 0x%x, oflags 0x%x\n", v, oflags));	if(v->stream.type == STREAM_TYPE_DIR)		return ERR_VFS_IS_DIR;	// Allocate our cookie for storage of position	cookie = kmalloc(sizeof(struct isofs_cookie));	if(cookie == NULL) {		err = ERR_NO_MEMORY;		goto err;	}	// Setup our cookie to start of stream data	cookie->s = &v->stream;	cookie->u.file.pos = 0;	// Give cookie to caller	*_cookie = cookie;err:	return err;}//--------------------------------------------------------------------------------static int isofs_close(fs_cookie _fs, fs_vnode _v, file_cookie _cookie){	struct isofs_vnode *v = _v;	struct isofs_cookie *cookie = _cookie;	TOUCH(v); TOUCH(cookie);	TRACE(("isofs_close: entry vnode 0x%x, cookie 0x%x\n", v, cookie));	if(v->stream.type == STREAM_TYPE_DIR)		return ERR_VFS_IS_DIR;	return 0;}//--------------------------------------------------------------------------------static int isofs_freecookie(fs_cookie _fs, fs_vnode _v, file_cookie _cookie){	struct isofs_vnode *v = _v;	struct isofs_cookie *cookie = _cookie;	TOUCH(v); TOUCH(cookie);	TRACE(("isofs_freecookie: entry vnode 0x%x, cookie 0x%x\n", v, cookie));	if(v->stream.type == STREAM_TYPE_DIR)		return ERR_VFS_IS_DIR;	if (cookie)		kfree(cookie);	return 0;}//--------------------------------------------------------------------------------#define READ_CHUNK 16384static ssize_t isofs_read(fs_cookie _fs, fs_vnode _v, file_cookie _cookie,							void *buf, off_t pos, ssize_t len){	struct isofs *fs = _fs;	struct isofs_vnode *v = _v;	struct isofs_cookie *cookie = _cookie;	ssize_t err = 0;	ssize_t totread = 0;	char   *tempbuf = 0;	TOUCH(v);	TRACE(("isofs_read: vnode 0x%x, cookie 0x%x, pos 0x%x 0x%x, len 0x%x\n", v, cookie, pos, len));	if(v->stream.type == STREAM_TYPE_DIR)		return ERR_VFS_IS_DIR;	// If size is negative, forget it	if(len <= 0)		return 0;	mutex_lock(&fs->lock);	// If position is negative, we'll read from current pos	if (pos < 0) {		// we'll read where the cookie is at		pos = cookie->u.file.pos;	}	// If position is past filelength, forget it	if (pos >= cookie->s->data_len) {		err = 0;		goto error;	}	// If read goes partially beyond EOF	if (pos + len > cookie->s->data_len) {		// trim the read		len = cookie->s->data_len - pos;	}	tempbuf= kmalloc(READ_CHUNK);	if(!tempbuf) {		goto error;	}	while (len) {		ssize_t to_read= (READ_CHUNK< len) ? READ_CHUNK : len;		err = sys_read(fs->fd, tempbuf, cookie->s->data_pos + pos, to_read);		if(err <= 0) {			goto error;		}		user_memcpy(buf, tempbuf, err);		pos += err;		len -= err;		buf = ((char*)buf)+err;		totread += err;		// Move to next bit of the file	}	kfree(tempbuf);	tempbuf = 0;	err = totread;	cookie->u.file.pos = pos;error:	mutex_unlock(&fs->lock);	if(tempbuf)		kfree(tempbuf);	return err;}//--------------------------------------------------------------------------------static ssize_t isofs_write(fs_cookie fs, fs_vnode _v, file_cookie cookie, const void *buf, off_t pos, ssize_t len){	struct isofs_vnode *v = _v;	TRACE(("isofs_write: vnode 0x%x, cookie 0x%x, pos 0x%x 0x%x, len 0x%x\n", v, cookie, pos, len));	if(v->stream.type == STREAM_TYPE_DIR)		return ERR_VFS_IS_DIR;	return ERR_VFS_READONLY_FS;}//--------------------------------------------------------------------------------static int isofs_seek(fs_cookie _fs, fs_vnode _v, file_cookie _cookie, off_t pos, seek_type st){	struct isofs *fs = _fs;	struct isofs_vnode *v = _v;	struct isofs_cookie *cookie = _cookie;	int err = 0;	TOUCH(v);	TRACE(("isofs_seek: vnode 0x%x, cookie 0x%x, pos 0x%x 0x%x, seek_type %d\n", v, cookie, pos, st));	if(v->stream.type == STREAM_TYPE_DIR)		return ERR_VFS_IS_DIR;	mutex_lock(&fs->lock);	switch(st) {		case _SEEK_SET:			if(pos < 0)				pos = 0;			if(pos > cookie->s->data_len)				pos = cookie->s->data_len;			cookie->u.file.pos = pos;			break;		case _SEEK_CUR:			if(pos + cookie->u.file.pos > cookie->s->data_len)				cookie->u.file.pos = cookie->s->data_len;			else if(pos + cookie->u.file.pos < 0)				cookie->u.file.pos = 0;			else				cookie->u.file.pos += pos;			break;		case _SEEK_END:			if(pos > 0)				cookie->u.file.pos = cookie->s->data_len;			else if(pos + cookie->s->data_len < 0)				cookie->u.file.pos = 0;			else				cookie->u.file.pos = pos + cookie->s->data_len;			break;		default:			err = ERR_INVALID_ARGS;	}	mutex_unlock(&fs->lock);	return err;}//--------------------------------------------------------------------------------static int isofs_ioctl(fs_cookie _fs, fs_vnode _v, file_cookie _cookie, int op, void *buf, size_t len){	TRACE(("isofs_ioctl: vnode 0x%x, cookie 0x%x, op %d, buf 0x%x, len 0x%x\n", _v, _cookie, op, buf, len));	return ERR_INVALID_ARGS;}//--------------------------------------------------------------------------------static int isofs_canpage(fs_cookie _fs, fs_vnode _v){	struct isofs_vnode *v = _v;	TOUCH(v);	TRACE(("isofs_canpage: vnode 0x%x\n", v));	return 0;}//--------------------------------------------------------------------------------static ssize_t isofs_readpage(fs_cookie _fs, fs_vnode _v, iovecs *vecs, off_t pos){	struct isofs_vnode *v = _v;	TOUCH(v);	TRACE(("isofs_readpage: vnode 0x%x, vecs 0x%x, pos 0x%x 0x%x\n", v, vecs, pos));	return ERR_NOT_ALLOWED;}//--------------------------------------------------------------------------------static int isofs_create(fs_cookie _fs, fs_vnode _dir, const char *name, void *create_args, vnode_id *new_vnid){	return ERR_VFS_READONLY_FS;}//--------------------------------------------------------------------------------static int isofs_unlink(fs_cookie _fs, fs_vnode _dir, const char *name){	return ERR_VFS_READONLY_FS;}//--------------------------------------------------------------------------------static int isofs_rename(fs_cookie _fs, fs_vnode _olddir, const char *oldname, fs_vnode _newdir, const char *newname){	return ERR_VFS_READONLY_FS;}//--------------------------------------------------------------------------------static int isofs_mkdir(fs_cookie _fs, fs_vnode _base_dir, const char *name){	return ERR_VFS_READONLY_FS;}//--------------------------------------------------------------------------------static int isofs_rmdir(fs_cookie _fs, fs_vnode _base_dir, const char *name){	return ERR_VFS_READONLY_FS;}//--------------------------------------------------------------------------------static ssize_t isofs_writepage(fs_cookie _fs, fs_vnode _v, iovecs *vecs, off_t pos){	struct isofs_vnode *v = _v;	TOUCH(v);	TRACE(("isofs_writepage: vnode 0x%x, vecs 0x%x, pos 0x%x 0x%x\n", v, vecs, pos));	return ERR_NOT_ALLOWED;}//--------------------------------------------------------------------------------static int isofs_rstat(fs_cookie _fs, fs_vnode _v, struct file_stat *stat){	struct isofs *fs = _fs;	struct isofs_vnode *v = _v;	int err = 0;	TRACE(("isofs_rstat: vnode 0x%x (0x%x 0x%x), stat 0x%x\n", v, v->id, stat));	mutex_lock(&fs->lock);	stat->vnid = v->id;	stat->type = v->stream.type;	switch(v->stream.type) {		case STREAM_TYPE_DIR:			stat->size = 0;			break;		case STREAM_TYPE_FILE:			stat->size = v->stream.data_len;			break;		default:			err = ERR_INVALID_ARGS;			break;	}	mutex_unlock(&fs->lock);	return err;}//--------------------------------------------------------------------------------static int isofs_wstat(fs_cookie _fs, fs_vnode _v, struct file_stat *stat, int stat_mask){	return ERR_VFS_READONLY_FS;}//================================================================================// REGISTRATION HANDLING//================================================================================static struct fs_calls isofs_calls = {	&isofs_mount,		// mount	&isofs_unmount,		// unmount	&isofs_sync,		// sync	isofs_lookup,		// lookup	&isofs_getvnode,	// getvnode	&isofs_putvnode,	// putvnode	&isofs_removevnode,	// removevnode	&isofs_opendir,		// opendir	&isofs_closedir,	// closedir	&isofs_rewinddir,	// rewinddir	&isofs_readdir,		// readdir	&isofs_open,		// open	&isofs_close,		// close	&isofs_freecookie,	// freecookie	&isofs_fsync,		// fsync	&isofs_read,		// read	&isofs_write,		// write	&isofs_seek,		// seek	&isofs_ioctl,		// ioctl	&isofs_canpage,		// canpage	&isofs_readpage,	// readpage	&isofs_writepage,	// writepage	&isofs_create,		// create	&isofs_unlink,		// unlink	&isofs_rename,		// rename	&isofs_mkdir,		// mkdir	&isofs_rmdir,		// rmdir	&isofs_rstat,		// rstat	&isofs_wstat		// wstat};int fs_bootstrap(void);//--------------------------------------------------------------------------------int fs_bootstrap(void){	dprintf("bootstrap_isofs: entry\n");	return vfs_register_filesystem("isofs", &isofs_calls);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -