|
|
1.1 ! root 1: /* ! 2: * Creation Date: <2003/11/26 16:55:47 samuel> ! 3: * Time-stamp: <2004/01/07 19:41:54 samuel> ! 4: * ! 5: * <pseudodisk.c> ! 6: * ! 7: * pseudodisk (contains files exported from linux) ! 8: * ! 9: * Copyright (C) 2003, 2004 Samuel Rydh ([email protected]) ! 10: * ! 11: * This program is free software; you can redistribute it and/or ! 12: * modify it under the terms of the GNU General Public License ! 13: * version 2 ! 14: * ! 15: */ ! 16: ! 17: #include "config.h" ! 18: #include "libopenbios/bindings.h" ! 19: #include "osi_calls.h" ! 20: #include "libc/string.h" ! 21: #include "libopenbios/ofmem.h" ! 22: #include "mol/prom.h" ! 23: #include "mol/mol.h" ! 24: #include "osi_calls.h" ! 25: #include "pseudofs_sh.h" ! 26: ! 27: typedef struct { ! 28: int seekpos; ! 29: int fd; ! 30: char *myargs; ! 31: char *name; ! 32: int size; ! 33: } pdisk_data_t; ! 34: ! 35: ! 36: DECLARE_NODE( pdisk, INSTALL_OPEN, sizeof(pdisk_data_t), "/mol/pseudo-disk/disk" ); ! 37: ! 38: static void ! 39: pdisk_open( pdisk_data_t *pb ) ! 40: { ! 41: char *ep, *name = NULL; ! 42: int part; ! 43: ! 44: pb->myargs = my_args_copy(); ! 45: /* printk("pdisk-open: %s\n", pb->myargs ); */ ! 46: ! 47: part = strtol( pb->myargs, &ep, 10 ); ! 48: if( *ep ) { ! 49: if( (name=strchr(pb->myargs, ',')) ) { ! 50: *name = 0; ! 51: name++; ! 52: } else { ! 53: name = pb->myargs; ! 54: } ! 55: } ! 56: if( part ) ! 57: goto err; ! 58: ! 59: if( !name || !strlen(name) ) ! 60: pb->fd = -1; ! 61: else { ! 62: if( (pb->fd=PseudoFSOpen(name)) < 0 ) ! 63: goto err; ! 64: pb->size = PseudoFSGetSize( pb->fd ); ! 65: } ! 66: pb->name = name; ! 67: RET( -1 ); ! 68: err: ! 69: free( pb->myargs ); ! 70: RET(0); ! 71: } ! 72: ! 73: /* ( addr len -- actual ) */ ! 74: static void ! 75: pdisk_read( pdisk_data_t *pb ) ! 76: { ! 77: int len = POP(); ! 78: char *dest = (char*)POP(); ! 79: int cnt; ! 80: ! 81: if( pb->fd < 0 ) { ! 82: memset( dest, 0, len ); ! 83: PUSH(len); ! 84: return; ! 85: } ! 86: /* dest is not "mol-DMA" safe (might have a nontrivial mapping) */ ! 87: for( cnt=0; cnt<len; ) { ! 88: char buf[2048]; ! 89: int n = MIN( len-cnt, sizeof(buf) ); ! 90: ! 91: n = PseudoFSRead( pb->fd, pb->seekpos, buf, n ); ! 92: if( n <= 0 ) ! 93: break; ! 94: ! 95: memcpy( dest+cnt, buf, n ); ! 96: cnt += n; ! 97: pb->seekpos += n; ! 98: } ! 99: PUSH( cnt ); ! 100: } ! 101: ! 102: /* ( addr len -- actual ) */ ! 103: static void ! 104: pdisk_write( pdisk_data_t *pb ) ! 105: { ! 106: POP(); POP(); PUSH(-1); ! 107: printk("pdisk write\n"); ! 108: } ! 109: ! 110: /* ( pos.lo pos.hi -- status ) */ ! 111: static void ! 112: pdisk_seek( pdisk_data_t *pb ) ! 113: { ! 114: int pos_lo; ! 115: POP(); ! 116: pos_lo = POP(); ! 117: ! 118: if( pb->fd >= 0 ) { ! 119: if( pos_lo == -1 ) ! 120: pos_lo = pb->size; ! 121: } ! 122: ! 123: pb->seekpos = pos_lo; ! 124: ! 125: PUSH(0); /* ??? */ ! 126: } ! 127: ! 128: /* ( -- pos.d ) */ ! 129: static void ! 130: pdisk_tell( pdisk_data_t *pb ) ! 131: { ! 132: DPUSH( pb->seekpos ); ! 133: } ! 134: ! 135: /* ( -- cstr ) */ ! 136: static void ! 137: pdisk_get_path( pdisk_data_t *pb ) ! 138: { ! 139: PUSH( (int)pb->name ); ! 140: } ! 141: ! 142: /* ( -- cstr ) */ ! 143: static void ! 144: pdisk_get_fstype( pdisk_data_t *pb ) ! 145: { ! 146: PUSH( (int)"PSEUDO" ); ! 147: } ! 148: ! 149: /* ( -- cstr ) */ ! 150: static void ! 151: pdisk_volume_name( pdisk_data_t *pb ) ! 152: { ! 153: PUSH( (int)"Virtual Volume" ); ! 154: } ! 155: ! 156: static void ! 157: pdisk_block_size( pdisk_data_t *pb ) ! 158: { ! 159: PUSH(1); ! 160: } ! 161: ! 162: NODE_METHODS( pdisk ) = { ! 163: { "open", pdisk_open }, ! 164: { "read", pdisk_read }, ! 165: { "write", pdisk_write }, ! 166: { "seek", pdisk_seek }, ! 167: { "tell", pdisk_tell }, ! 168: { "block-size", pdisk_block_size }, ! 169: { "get-path", pdisk_get_path }, ! 170: { "get-fstype", pdisk_get_fstype }, ! 171: { "volume-name", pdisk_volume_name }, ! 172: }; ! 173: ! 174: void ! 175: pseudodisk_init( void ) ! 176: { ! 177: REGISTER_NODE( pdisk ); ! 178: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.