Annotation of qemu/roms/openbios/libc/diskio.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *   Creation Date: <2003/12/07 19:36:00 samuel>
        !             3:  *   Time-stamp: <2004/01/07 19:28:43 samuel>
        !             4:  *
        !             5:  *     <diskio.c>
        !             6:  *
        !             7:  *     I/O wrappers
        !             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 "libc/diskio.h"
        !            20: 
        !            21: //#define CONFIG_DEBUG_DISKIO
        !            22: #ifdef CONFIG_DEBUG_DISKIO
        !            23: #define DPRINTF(fmt, args...)                   \
        !            24:     do { printk(fmt , ##args); } while (0)
        !            25: #else
        !            26: #define DPRINTF(fmt, args...)
        !            27: #endif
        !            28: 
        !            29: typedef struct {
        !            30:        ihandle_t ih;
        !            31:        int     do_close;
        !            32:        xt_t    read_xt;
        !            33:        xt_t    seek_xt;
        !            34: 
        !            35:        xt_t    reopen_xt;
        !            36:        xt_t    tell_xt;
        !            37:        xt_t    get_path_xt;
        !            38:        xt_t    get_fstype_xt;
        !            39:        xt_t    open_nwrom_xt;
        !            40:        xt_t    volume_name_xt;
        !            41: } priv_fd_t;
        !            42: 
        !            43: #define MAX_FD 32
        !            44: static priv_fd_t *file_descriptors[MAX_FD];
        !            45: 
        !            46: static int
        !            47: lookup_xt( ihandle_t ih, const char *method, xt_t *xt )
        !            48: {
        !            49:        if( *xt )
        !            50:                return 0;
        !            51:        *xt = find_ih_method( method, ih );
        !            52:        return (*xt) ? 0:1;
        !            53: }
        !            54: 
        !            55: int
        !            56: open_ih( ihandle_t ih )
        !            57: {
        !            58:        xt_t read_xt=0, seek_xt=0;
        !            59:        priv_fd_t *fdp;
        !            60:        int fd;
        !            61: 
        !            62:        if( !ih || lookup_xt(ih, "read", &read_xt) )
        !            63:                return -1;
        !            64:        if( lookup_xt(ih, "seek", &seek_xt) )
        !            65:                return -1;
        !            66: 
        !            67:        for (fd=0; fd<MAX_FD; fd++)
        !            68:                if(file_descriptors[fd]==NULL)
        !            69:                        break;
        !            70:        if(fd==MAX_FD)
        !            71:                return -1;
        !            72: 
        !            73:        fdp = malloc( sizeof(*fdp) );
        !            74:        /* Better clear the fd, as it
        !            75:         * contains valuable information
        !            76:         */
        !            77:        memset(fdp, 0, sizeof(*fdp));
        !            78:        fdp->ih = ih;
        !            79:        fdp->read_xt = read_xt;
        !            80:        fdp->seek_xt = seek_xt;
        !            81:        fdp->do_close = 0;
        !            82: 
        !            83:        file_descriptors[fd]=fdp;
        !            84:         DPRINTF("%s(0x%lx) = %d\n", __func__, (unsigned long)ih, fd);
        !            85:        return fd;
        !            86: }
        !            87: 
        !            88: int
        !            89: open_io( const char *spec )
        !            90: {
        !            91:        int fd;
        !            92:        ihandle_t ih = open_dev( spec );
        !            93:        priv_fd_t *fdp;
        !            94: 
        !            95:         DPRINTF("%s(%s)\n", __func__, spec);
        !            96:        if( !ih )
        !            97:                return -1;
        !            98: 
        !            99:        if( (fd=open_ih(ih)) == -1 ) {
        !           100:                close_dev( ih );
        !           101:                return -1;
        !           102:        }
        !           103: 
        !           104:        fdp = file_descriptors[fd];
        !           105:        fdp->do_close = 1;
        !           106: 
        !           107:        return fd;
        !           108: }
        !           109: 
        !           110: int
        !           111: reopen( int fd, const char *filename )
        !           112: {
        !           113:        priv_fd_t *fdp = file_descriptors[fd];
        !           114:        int ret;
        !           115: 
        !           116:        if( lookup_xt(fdp->ih, "reopen", &fdp->reopen_xt) )
        !           117:                return -1;
        !           118: 
        !           119:        push_str( filename );
        !           120:        call_package( fdp->reopen_xt, fdp->ih );
        !           121:         ret = (POP() == (ucell)-1)? 0 : -1;
        !           122: 
        !           123:         DPRINTF("%s(%d, %s) = %d\n", __func__, fd, filename, ret);
        !           124:        return ret;
        !           125: }
        !           126: 
        !           127: int
        !           128: reopen_nwrom( int fd )
        !           129: {
        !           130:        priv_fd_t *fdp = file_descriptors[fd];
        !           131: 
        !           132:         DPRINTF("%s(%d)\n", __func__, fd);
        !           133:        if( lookup_xt(fdp->ih, "open-nwrom", &fdp->open_nwrom_xt) )
        !           134:                return -1;
        !           135:        call_package( fdp->open_nwrom_xt, fdp->ih );
        !           136:         return (POP() == (ucell)-1)? 0 : -1;
        !           137: }
        !           138: 
        !           139: ihandle_t
        !           140: get_ih_from_fd( int fd )
        !           141: {
        !           142:        priv_fd_t *fdp = file_descriptors[fd];
        !           143:        return fdp->ih;
        !           144: }
        !           145: 
        !           146: const char *
        !           147: get_file_path( int fd )
        !           148: {
        !           149:        priv_fd_t *fdp = file_descriptors[fd];
        !           150:        if( lookup_xt(fdp->ih, "get-path", &fdp->get_path_xt) )
        !           151:                return NULL;
        !           152:        call_package( fdp->get_path_xt, fdp->ih );
        !           153:        return (char*)cell2pointer(POP());
        !           154: }
        !           155: 
        !           156: const char *
        !           157: get_volume_name( int fd )
        !           158: {
        !           159:        priv_fd_t *fdp = file_descriptors[fd];
        !           160:        if( lookup_xt(fdp->ih, "volume-name", &fdp->volume_name_xt) )
        !           161:                return NULL;
        !           162:        call_package( fdp->volume_name_xt, fdp->ih );
        !           163:        return (char*)cell2pointer(POP());
        !           164: }
        !           165: 
        !           166: const char *
        !           167: get_fstype( int fd )
        !           168: {
        !           169:        priv_fd_t *fdp = file_descriptors[fd];
        !           170:        if( lookup_xt(fdp->ih, "get-fstype", &fdp->get_fstype_xt) )
        !           171:                return NULL;
        !           172:        call_package( fdp->get_fstype_xt, fdp->ih );
        !           173:        return (char*)cell2pointer(POP());
        !           174: }
        !           175: 
        !           176: int
        !           177: read_io( int fd, void *buf, size_t cnt )
        !           178: {
        !           179:        priv_fd_t *fdp;
        !           180:        ucell ret;
        !           181: 
        !           182:         DPRINTF("%s(%d, %p, %u)\n", __func__, fd, buf, cnt);
        !           183:        if (fd != -1) {
        !           184:                fdp = file_descriptors[fd];
        !           185: 
        !           186:                PUSH( pointer2cell(buf) );
        !           187:                PUSH( cnt );
        !           188:                call_package( fdp->read_xt, fdp->ih );
        !           189:                ret = POP();
        !           190: 
        !           191:                if( !ret && cnt )
        !           192:                        ret = -1;
        !           193:        } else {
        !           194:                ret = -1;
        !           195:        }
        !           196: 
        !           197:        return ret;
        !           198: }
        !           199: 
        !           200: int
        !           201: seek_io( int fd, long long offs )
        !           202: {
        !           203:        priv_fd_t *fdp;
        !           204: 
        !           205:         DPRINTF("%s(%d, %lld)\n", __func__, fd, offs);
        !           206:        if (fd != -1) {
        !           207:                fdp = file_descriptors[fd];
        !           208:                
        !           209:                DPUSH( offs );
        !           210:                call_package( fdp->seek_xt, fdp->ih );
        !           211:                return ((((cell)POP()) >= 0)? 0 : -1);
        !           212:        } else {
        !           213:                return -1;
        !           214:        }
        !           215: }
        !           216: 
        !           217: long long
        !           218: tell( int fd )
        !           219: {
        !           220:        priv_fd_t *fdp = file_descriptors[fd];
        !           221:        long long offs;
        !           222: 
        !           223:        if( lookup_xt(fdp->ih, "tell", &fdp->tell_xt) )
        !           224:                return -1;
        !           225:        call_package( fdp->tell_xt, fdp->ih );
        !           226:        offs = DPOP();
        !           227:         DPRINTF("%s(%d) = %lld\n", __func__, fd, offs);
        !           228:        return offs;
        !           229: }
        !           230: 
        !           231: int
        !           232: close_io( int fd )
        !           233: {
        !           234:        priv_fd_t *fdp;
        !           235: 
        !           236:         DPRINTF("%s(%d)\n", __func__, fd);
        !           237:        if (fd != -1) {
        !           238:                fdp = file_descriptors[fd];
        !           239: 
        !           240:                if( fdp->do_close )
        !           241:                        close_dev( fdp->ih );
        !           242:                free( fdp );
        !           243: 
        !           244:                file_descriptors[fd]=NULL;
        !           245:        }
        !           246: 
        !           247:        return 0;
        !           248: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.