Annotation of qemu/roms/openbios/fs/iso9660/iso9660_fs.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * /packages/iso9660-files filesystem handler
        !             3:  *
        !             4:  * (c) 2009 Laurent Vivier <[email protected]>
        !             5:  * (c) 2010 Mark Cave-Ayland <[email protected]>
        !             6:  */
        !             7: 
        !             8: #include "config.h"
        !             9: #include "libopenbios/bindings.h"
        !            10: #include "libiso9660.h"
        !            11: #include "fs/fs.h"
        !            12: #include "libc/vsprintf.h"
        !            13: #include "libc/diskio.h"
        !            14: 
        !            15: extern void     iso9660_init( void );
        !            16: 
        !            17: typedef struct {
        !            18:        enum { FILE, DIR } type;
        !            19:        union {
        !            20:                iso9660_FILE *file;
        !            21:                iso9660_DIR * dir;
        !            22:        };
        !            23: } iso9660_COMMON;
        !            24: 
        !            25: typedef struct {
        !            26:        iso9660_VOLUME *volume;
        !            27:        iso9660_COMMON *common;
        !            28: } iso9660_info_t;
        !            29: 
        !            30: DECLARE_NODE( iso9660, 0, sizeof(iso9660_info_t), "+/packages/iso9660-files" );
        !            31: 
        !            32: /* ( -- success? ) */
        !            33: static void
        !            34: iso9660_files_open( iso9660_info_t *mi )
        !            35: {
        !            36:        int fd;
        !            37:        char *path = my_args_copy();
        !            38: 
        !            39:        if ( ! path )
        !            40:                RET( 0 );
        !            41:  
        !            42:        fd = open_ih( my_parent() );
        !            43:        if ( fd == -1 ) {
        !            44:                free( path );
        !            45:                RET( 0 );
        !            46:        }
        !            47:  
        !            48:        mi->volume = iso9660_mount( fd );
        !            49:        if ( mi->volume == NULL ) {
        !            50:                free( path );
        !            51:                close_io( fd );
        !            52:                RET( 0 );
        !            53:        }
        !            54: 
        !            55:        mi->common->dir = iso9660_opendir( mi->volume, path );
        !            56:        if ( mi->common->dir == NULL ) {
        !            57:                mi->common->file = iso9660_open( mi->volume, path );
        !            58:                if (mi->common->file == NULL) {
        !            59:                        iso9660_umount( mi->volume );
        !            60:                        close_io( fd );
        !            61:                        free( path );
        !            62:                        RET( 0 );
        !            63:                }
        !            64:                mi->common->type = FILE;
        !            65:                free( path );
        !            66:                RET( -1 );
        !            67:        }
        !            68:        mi->common->type = DIR;
        !            69:        free( path );
        !            70: 
        !            71:        RET( -1 );
        !            72: }
        !            73: 
        !            74: /* ( -- ) */
        !            75: static void
        !            76: iso9660_files_close( iso9660_info_t *mi )
        !            77: {
        !            78:        int fd = mi->volume->fd;
        !            79:  
        !            80:        if (mi->common->type == FILE )
        !            81:                iso9660_close( mi->common->file );
        !            82:        else if ( mi->common->type == DIR )
        !            83:                iso9660_closedir( mi->common->dir );
        !            84:        iso9660_umount( mi->volume );
        !            85:        close_io( fd );
        !            86: }
        !            87: 
        !            88: /* ( buf len -- actlen ) */
        !            89: static void
        !            90: iso9660_files_read( iso9660_info_t *mi )
        !            91: {
        !            92:        int count = POP();
        !            93:        char *buf = (char *)cell2pointer(POP());
        !            94:        int ret;
        !            95:  
        !            96:        if ( mi->common->type != FILE )
        !            97:                PUSH( 0 );
        !            98:  
        !            99:        ret = iso9660_read( mi->common->file, buf, count );
        !           100:  
        !           101:        PUSH( ret );
        !           102: }
        !           103: 
        !           104: /* ( pos.d -- status ) */
        !           105: static void
        !           106: iso9660_files_seek( iso9660_info_t *mi )
        !           107: {
        !           108:        long long pos = DPOP();
        !           109:        cell ret;
        !           110:        int offs = (int)pos;
        !           111:        int whence = SEEK_SET;
        !           112: 
        !           113:        if (mi->common->type != FILE)
        !           114:                PUSH( -1 );
        !           115: 
        !           116:        if( offs == -1 ) {
        !           117:                offs = 0;
        !           118:                whence = SEEK_END;
        !           119:        }
        !           120:  
        !           121:        ret = iso9660_lseek(mi->common->file, offs, whence);
        !           122:  
        !           123:        PUSH( (ret < 0)? -1 : 0 );
        !           124: }
        !           125: 
        !           126: /* ( -- filepos.d ) */
        !           127: static void
        !           128: iso9660_files_offset( iso9660_info_t *mi )
        !           129: {
        !           130:        if ( mi->common->type != FILE )
        !           131:                DPUSH( -1 );
        !           132:  
        !           133:        DPUSH( mi->common->file->offset );
        !           134: }
        !           135: 
        !           136: /* ( addr -- size ) */
        !           137: static void
        !           138: iso9660_files_load( iso9660_info_t *mi)
        !           139: {
        !           140:        char *buf = (char*)cell2pointer(POP());
        !           141:        int ret, size;
        !           142:  
        !           143:        if ( mi->common->type != FILE )
        !           144:                PUSH( 0 );
        !           145:  
        !           146:        size = 0;
        !           147:        while(1) {
        !           148:                ret = iso9660_read( mi->common->file, buf, 512 );
        !           149:                if (ret <= 0)
        !           150:                        break;
        !           151:                buf += ret;
        !           152:                size += ret;
        !           153:                if (ret != 512)
        !           154:                        break;
        !           155:        }
        !           156:        PUSH( size );
        !           157: }
        !           158: 
        !           159: /* static method, ( pathstr len ihandle -- ) */
        !           160: static void
        !           161: iso9660_files_dir( iso9660_info_t *dummy )
        !           162: {
        !           163:        iso9660_VOLUME *volume;
        !           164:        iso9660_COMMON *common;
        !           165:        struct iso_directory_record *idr;
        !           166:        char name_buf[256];
        !           167:        int fd;
        !           168:  
        !           169:        ihandle_t ih = POP();
        !           170:        char *path = pop_fstr_copy();
        !           171: 
        !           172:        fd = open_ih( ih );
        !           173:        if ( fd == -1 ) {
        !           174:                free( path );
        !           175:                return;
        !           176:        }
        !           177:  
        !           178:        volume = iso9660_mount( fd );
        !           179:        if ( volume == NULL ) {
        !           180:                free ( path );
        !           181:                close_io( fd );
        !           182:                return;
        !           183:        }
        !           184: 
        !           185:        common = malloc(sizeof(iso9660_COMMON));
        !           186:        common->dir = iso9660_opendir( volume, path );
        !           187: 
        !           188:        forth_printf("\n");
        !           189:        while ( (idr = iso9660_readdir(common->dir)) ) {
        !           190:  
        !           191:                forth_printf("% 10d ", isonum_733(idr->size));
        !           192:                forth_printf("%d-%02d-%02d %02d:%02d:%02d ",
        !           193:                             idr->date[0] + 1900, /* year */
        !           194:                             idr->date[1], /* month */
        !           195:                              idr->date[2], /* day */
        !           196:                             idr->date[3], idr->date[4], idr->date[5]);
        !           197:                iso9660_name(common->dir->volume, idr, name_buf);
        !           198:                if (idr->flags[0] & 2)
        !           199:                        forth_printf("%s\\\n", name_buf);
        !           200:                else
        !           201:                        forth_printf("%s\n", name_buf);
        !           202:        }
        !           203: 
        !           204:        iso9660_closedir( common->dir );
        !           205:        iso9660_umount( volume );
        !           206: 
        !           207:        close_io( fd );
        !           208: 
        !           209:        free( common );
        !           210:        free( path );
        !           211: }
        !           212: 
        !           213: /* static method, ( pos.d ih -- flag? ) */
        !           214: static void
        !           215: iso9660_files_probe( iso9660_info_t *dummy )
        !           216: {
        !           217:        ihandle_t ih = POP_ih();
        !           218:        long long offs = DPOP();
        !           219:        int fd, ret = 0;
        !           220: 
        !           221:        fd = open_ih(ih);
        !           222:         if (fd >= 0) {
        !           223:                 if (iso9660_probe(fd, offs)) {
        !           224:                         ret = -1;
        !           225:                 }
        !           226:                 close_io(fd);
        !           227:         } else {
        !           228:                 ret = -1;
        !           229:         }
        !           230: 
        !           231:        RET (ret);
        !           232: }
        !           233: 
        !           234: static void
        !           235: iso9660_files_block_size( iso9660_info_t *dummy )
        !           236: {
        !           237:        PUSH(2048);
        !           238: }
        !           239:  
        !           240: static void
        !           241: iso9660_initializer( iso9660_info_t *dummy )
        !           242: {
        !           243:        fword("register-fs-package");
        !           244: }
        !           245:  
        !           246: NODE_METHODS( iso9660 ) = {
        !           247:        { "probe",      iso9660_files_probe             },
        !           248:        { "open",       iso9660_files_open              },
        !           249:        { "close",      iso9660_files_close             },
        !           250:        { "read",       iso9660_files_read              },
        !           251:        { "seek",       iso9660_files_seek              },
        !           252:        { "offset",     iso9660_files_offset            },
        !           253:        { "load",       iso9660_files_load              },
        !           254:        { "dir",        iso9660_files_dir               },
        !           255:        { "block-size", iso9660_files_block_size        },
        !           256:        { NULL,         iso9660_initializer     },
        !           257: };
        !           258: 
        !           259: void
        !           260: iso9660_init( void )
        !           261: {
        !           262:        REGISTER_NODE( iso9660 );
        !           263: }

unix.superglobalmegacorp.com

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