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

📄 pseudodisk.c

📁 OpenBIOS是一个开源的BIOS实现
💻 C
字号:
/*  *   Creation Date: <2003/11/26 16:55:47 samuel> *   Time-stamp: <2004/01/07 19:41:54 samuel> *    *	<pseudodisk.c> *	 *	pseudodisk (contains files exported from linux) *    *   Copyright (C) 2003, 2004 Samuel Rydh (samuel@ibrium.se) *    *   This program is free software; you can redistribute it and/or *   modify it under the terms of the GNU General Public License *   version 2 *    */#include "openbios/config.h"#include "openbios/bindings.h"#include "osi_calls.h"#include "libc/string.h"#include "ofmem.h"#include "mol/prom.h"#include "mol/mol.h"#include "osi_calls.h"#include "pseudofs_sh.h"typedef struct {	int	seekpos;	int	fd;	char	*myargs;	char	*name;	int	size;} pdisk_data_t;DECLARE_NODE( pdisk, INSTALL_OPEN, sizeof(pdisk_data_t), "/mol/pseudo-disk/disk" );static voidpdisk_open( pdisk_data_t *pb ){	char *ep, *name = NULL;	int part;	pb->myargs = my_args_copy();	/* printk("pdisk-open: %s\n", pb->myargs ); */	part = strtol( pb->myargs, &ep, 10 );	if( *ep ) {		if( (name=strchr(pb->myargs, ',')) ) {			*name = 0;			name++;		} else {			name = pb->myargs;		}	}	if( part )		goto err;	if( !name || !strlen(name) )		pb->fd = -1;	else {		if( (pb->fd=PseudoFSOpen(name)) < 0 )			goto err;		pb->size = PseudoFSGetSize( pb->fd );	}	pb->name = name;	RET( -1 ); err:	free( pb->myargs );	RET(0);}/* ( addr len -- actual ) */static voidpdisk_read( pdisk_data_t *pb ){	int len = POP();	char *dest = (char*)POP();	int cnt;		if( pb->fd < 0 ) {		memset( dest, 0, len );		PUSH(len);		return;	}	/* dest is not "mol-DMA" safe (might have a nontrivial mapping) */	for( cnt=0; cnt<len; ) {		char buf[2048];		int n = MIN( len-cnt, sizeof(buf) );		n = PseudoFSRead( pb->fd, pb->seekpos, buf, n );		if( n <= 0 )			break;		memcpy( dest+cnt, buf, n );		cnt += n;		pb->seekpos += n;	}	PUSH( cnt );}/* ( addr len -- actual ) */static voidpdisk_write( pdisk_data_t *pb ){	POP(); POP(); PUSH(-1);	printk("pdisk write\n");}/* ( pos.lo pos.hi -- status ) */static voidpdisk_seek( pdisk_data_t *pb ){	int pos_lo;	POP();	pos_lo = POP();	if( pb->fd >= 0 ) {		if( pos_lo == -1 )			pos_lo = pb->size;	}		pb->seekpos = pos_lo;		PUSH(0);	/* ??? */}/* ( -- pos.d ) */static voidpdisk_tell( pdisk_data_t *pb ){	DPUSH( pb->seekpos );}/* ( -- cstr ) */static voidpdisk_get_path( pdisk_data_t *pb ){	PUSH( (int)pb->name );}/* ( -- cstr ) */static voidpdisk_get_fstype( pdisk_data_t *pb ){	PUSH( (int)"PSEUDO" );}/* ( -- cstr ) */static voidpdisk_volume_name( pdisk_data_t *pb ){	PUSH( (int)"Virtual Volume" );}static voidpdisk_block_size( pdisk_data_t *pb ){	PUSH(1);}NODE_METHODS( pdisk ) = {	{ "open",		pdisk_open		},	{ "read",		pdisk_read		},	{ "write",		pdisk_write		},	{ "seek",		pdisk_seek		},	{ "tell",		pdisk_tell		},	{ "block-size",		pdisk_block_size	},	{ "get-path",		pdisk_get_path          },	{ "get-fstype",		pdisk_get_fstype        },	{ "volume-name",	pdisk_volume_name	},};voidpseudodisk_init( void ){	REGISTER_NODE( pdisk );}

⌨️ 快捷键说明

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