Author: mcayland Date: Sat Jul 3 21:02:43 2010 New Revision: 810 URL: http://tracker.coreboot.org/trac/openbios/changeset/810
Log: Move the HFS+ filesystem handler into its own new package /packages/hfsplus-files.
Signed-off-by: Mark Cave-Ayland mark.cave-ayland@siriusit.co.uk
Modified: trunk/openbios-devel/fs/hfsplus/hfsp_fs.c trunk/openbios-devel/packages/init.c trunk/openbios-devel/packages/misc-files.c trunk/openbios-devel/packages/packages.h
Modified: trunk/openbios-devel/fs/hfsplus/hfsp_fs.c ============================================================================== --- trunk/openbios-devel/fs/hfsplus/hfsp_fs.c Sat Jul 3 16:39:49 2010 (r809) +++ trunk/openbios-devel/fs/hfsplus/hfsp_fs.c Sat Jul 3 21:02:43 2010 (r810) @@ -2,11 +2,12 @@ * Creation Date: <2001/05/05 23:33:49 samuel> * Time-stamp: <2004/01/12 10:25:39 samuel> * - * <hfsp_fs.c> + * /package/hfsplus-files * * HFS+ file system interface (and ROM lookup support) * * Copyright (C) 2001, 2002, 2003, 2004 Samuel Rydh (samuel@ibrium.se) + * Copyright (C) 2010 Mark Cave-Ayland (mark.cave-ayland@siriusit.co.uk) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -15,13 +16,14 @@ */
#include "config.h" +#include "libopenbios/bindings.h" #include "fs/fs.h" #include "libhfsp.h" #include "volume.h" #include "record.h" #include "unicode.h" #include "blockiter.h" - +#include "libc/diskio.h"
#define MAC_OS_ROM_CREATOR 0x63687270 /* 'chrp' */ #define MAC_OS_ROM_TYPE 0x74627869 /* 'tbxi' */ @@ -32,14 +34,23 @@ #define SYSTEM_TYPE 0x7A737973 /* 'zsys' */ #define SYSTEM_CREATOR 0x4D414353 /* 'MACS' */
+#define VOLNAME_SIZE 64 + +extern void hfsp_init( void );
typedef struct { record rec; char *path; - off_t pos; } hfsp_file_t;
+typedef struct { + volume *vol; + hfsp_file_t *hfspfile; +} hfsp_info_t; + +DECLARE_NODE( hfsp, 0, sizeof(hfsp_info_t), "+/packages/hfsplus-files" ); +
/************************************************************************/ /* Search implementation */ @@ -88,9 +99,8 @@ }
static int -root_search_files( fs_ops_t *fs, int recursive, match_proc_t proc, const void *match_data, hfsp_file_t *pt ) +root_search_files( volume *vol, int recursive, match_proc_t proc, const void *match_data, hfsp_file_t *pt ) { - volume *vol = (volume*)fs->fs_data; record r;
record_init_root( &r, &vol->catalog ); @@ -183,34 +193,34 @@
/************************************************************************/ -/* File System Operations */ +/* Standard package methods */ /************************************************************************/
+/* ( -- success? ) */ static void -close_fs( fs_ops_t *fs ) +hfsp_files_open( hfsp_info_t *mi ) { - volume *vol = (volume*)fs->fs_data; - volume_close( vol ); - free( vol ); -} + int fd; + char *path = my_args_copy();
-static file_desc_t * -_create_fops( hfsp_file_t *t ) -{ - hfsp_file_t *r = malloc( sizeof(hfsp_file_t) ); + if ( ! path ) + RET( 0 );
- *r = *t; - r->pos = 0; - return (file_desc_t*)r; -} + fd = open_ih( my_parent() ); + if ( fd == -1 ) { + free( path ); + RET( 0 ); + }
-static file_desc_t * -open_path( fs_ops_t *fs, const char *path ) -{ - hfsp_file_t t; - volume *vol = (volume*)fs->fs_data; - record r; + mi->vol = malloc( sizeof(volume) ); + if (volume_open(mi->vol, fd)) { + free( path ); + close_io( fd ); + RET( -1 ); + }
+ mi->hfspfile = malloc( sizeof(hfsp_file_t) ); + /* Leading \ means system folder. The finder info block has * the following meaning. * @@ -219,80 +229,104 @@ * [5] MacOS X boot directory ID */ if( !strncmp(path, "\\", 2) ) { - int *p = (int*)&vol->vol.finder_info[0]; + int *p = (int*)&(mi->vol)->vol.finder_info[0]; int cnid = p[0]; /* printk(" p[0] = %x, p[3] = %x, p[5] = %x\n", p[0], p[3], p[5] ); */ if( p[0] == p[5] && p[3] ) cnid = p[3]; - if( record_init_cnid(&r, &vol->catalog, cnid) ) - return NULL; + if( record_init_cnid(&(mi->hfspfile->rec), &(mi->vol)->catalog, cnid) ) + RET ( 0 ); path += 2; } else { - record_init_root( &r, &vol->catalog ); + record_init_root( &(mi->hfspfile->rec), &(mi->vol)->catalog ); }
- if( !search_files(&r, 0, match_path, path, &t) ) - return _create_fops( &t ); - return NULL; + if( !search_files(&(mi->hfspfile->rec), 0, match_path, path, mi->hfspfile ) ) + RET ( -1 ); + + RET ( 0 ); }
-static file_desc_t * -search_rom( fs_ops_t *fs ) +/* ( -- ) */ +static void +hfsp_files_close( hfsp_info_t *mi ) { - hfsp_file_t t; + volume_close(mi->vol);
- if( !root_search_files(fs, 1, match_rom, NULL, &t) ) - return _create_fops( &t ); - return NULL; + if( mi->hfspfile->path ) + free( mi->hfspfile->path ); + free( mi->hfspfile ); }
-static file_desc_t * -search_file( fs_ops_t *fs, const char *name ) +/* ( buf len -- actlen ) */ +static void +hfsp_files_read( hfsp_info_t *mi ) { - hfsp_file_t t; + int count = POP(); + char *buf = (char *)POP();
- if( !root_search_files(fs, 1, match_file, name, &t) ) - return _create_fops( &t ); - return NULL; -} + hfsp_file_t *t = mi->hfspfile; + volume *vol = t->rec.tree->vol; + UInt32 blksize = vol->blksize; + hfsp_cat_file *file = &t->rec.record.u.file; + blockiter iter; + char buf2[blksize]; + int act_count, curpos=0; + + blockiter_init( &iter, vol, &file->data_fork, HFSP_EXTENT_DATA, file->id ); + while( curpos + blksize < t->pos ) { + if( blockiter_next( &iter ) ) { + RET ( -1 ); + return; + } + curpos += blksize; + } + act_count = 0;
+ while( act_count < count ){ + UInt32 block = blockiter_curr(&iter); + int max = blksize, add = 0, size;
-/************************************************************************/ -/* File Operations */ -/************************************************************************/ + if( volume_readinbuf( vol, buf2, block ) ) + break;
-static char * -get_path( file_desc_t *fd, char *buf, int len ) -{ - hfsp_file_t *t = (hfsp_file_t*)fd; - if( !t->path ) - return NULL; + if( curpos < t->pos ){ + add += t->pos - curpos; + max -= t->pos - curpos; + } + size = (count-act_count > max)? max : count-act_count; + memcpy( (char *)buf + act_count, &buf2[add], size ); + + curpos += blksize; + act_count += size; + + if( blockiter_next( &iter ) ) + break; + }
- strncpy( buf, t->path, len ); - buf[len-1] = 0; - return buf; + t->pos += act_count; + + RET ( act_count ); }
+/* ( pos.d -- status ) */ static void -file_close( file_desc_t *fd ) +hfsp_files_seek( hfsp_info_t *mi ) { - hfsp_file_t *t = (hfsp_file_t*)fd; - if( t->path ) - free( t->path ); - free( t ); -} + llong pos = DPOP(); + int offs = (int)pos; + int whence = SEEK_SET;
-static int -file_lseek( file_desc_t *fd, off_t offs, int whence ) -{ - hfsp_file_t *t = (hfsp_file_t*)fd; + hfsp_file_t *t = mi->hfspfile; hfsp_cat_file *file = &t->rec.record.u.file; int total = file->data_fork.total_size;
+ if( offs == -1 ) { + offs = 0; + whence = SEEK_END; + } + switch( whence ){ - case SEEK_CUR: - t->pos += offs; - break; case SEEK_END: t->pos = total + offs; break; @@ -308,101 +342,139 @@ if( t->pos > total ) t->pos = total;
- return t->pos; + RET ( 0 ); }
-static int -file_read( file_desc_t *fd, void *buf, size_t count ) +/* ( addr -- size ) */ +static void +hfsp_files_load( hfsp_info_t *mi ) { - hfsp_file_t *t = (hfsp_file_t*)fd; + char *buf = (char *)POP(); + + hfsp_file_t *t = mi->hfspfile; volume *vol = t->rec.tree->vol; UInt32 blksize = vol->blksize; hfsp_cat_file *file = &t->rec.record.u.file; + int total = file->data_fork.total_size; blockiter iter; char buf2[blksize]; - int act_count, curpos=0; + int act_count;
blockiter_init( &iter, vol, &file->data_fork, HFSP_EXTENT_DATA, file->id ); - while( curpos + blksize < t->pos ) { - if( blockiter_next( &iter ) ) - return -1; - curpos += blksize; - } + act_count = 0;
- while( act_count < count ){ + while( act_count < total ){ UInt32 block = blockiter_curr(&iter); - int max = blksize, add = 0, size; + int max = blksize, size;
if( volume_readinbuf( vol, buf2, block ) ) break;
- if( curpos < t->pos ){ - add += t->pos - curpos; - max -= t->pos - curpos; - } - size = (count-act_count > max)? max : count-act_count; - memcpy( (char *)buf + act_count, &buf2[add], size ); + size = (total-act_count > max)? max : total-act_count; + memcpy( (char *)buf + act_count, &buf2, size );
- curpos += blksize; act_count += size;
if( blockiter_next( &iter ) ) break; }
- t->pos += act_count; - return (act_count > 0)? act_count : -1; + RET ( act_count ); }
-static char * -vol_name( fs_ops_t *fs, char *buf, int size ) +/* ( -- str len ) */ +static void +hfsp_files_get_fstype( hfsp_info_t *mi ) { - return get_hfs_vol_name( fs->fd, buf, size ); + push_str("HFS+"); }
-static const char * -get_fstype( fs_ops_t *fs ) +/* ( -- cstr ) */ +static void +hfsp_files_get_path( hfsp_info_t *mi ) { - return ("HFS+"); -} + char *buf; + hfsp_file_t *t = mi->hfspfile;
+ if( !t->path ) + RET ( 0 );
-static const fs_ops_t fs_ops = { - .close_fs = close_fs, - .open_path = open_path, - .search_rom = search_rom, - .search_file = search_file, - .vol_name = vol_name, + buf = malloc(strlen(t->path) + 1); + strncpy( buf, t->path, strlen(t->path) ); + buf[strlen(t->path)] = 0;
- .get_path = get_path, - .close = file_close, - .read = file_read, - .lseek = file_lseek, + PUSH ((ucell)buf); +}
- .get_fstype = get_fstype -}; +/* ( -- success? ) */ +static void +hfsp_files_open_nwrom( hfsp_info_t *mi ) +{ + /* Switch to an existing ROM image file on the fs! */ + if( !root_search_files(mi->vol, 1, match_rom, NULL, mi->hfspfile) ) + RET ( -1 ); + + RET ( 0 ); +}
-int -fs_hfsp_open( int os_fd, fs_ops_t *fs ) +/* ( -- cstr|0 ) */ +static void +hfsp_files_volume_name( hfsp_info_t *mi ) { - volume *vol = malloc( sizeof(volume) ); + int fd; + char *volname = malloc(VOLNAME_SIZE);
- if( volume_open(vol, os_fd) ) { - free( vol ); - return -1; - } - *fs = fs_ops; - fs->fs_data = vol; + fd = open_ih(my_self()); + get_hfs_vol_name(fd, volname, VOLNAME_SIZE); + close_io(fd);
- return 0; + PUSH ((ucell)volname); }
-int -fs_hfsp_probe(int fd, llong offs) +/* static method, ( pos.d ih -- flag? ) */ +static void +hfsp_files_probe( hfsp_info_t *dummy ) { + ihandle_t ih = POP_ih(); + llong offs = DPOP(); + int fd, ret = 0; + + fd = open_ih(ih); if (volume_probe(fd, offs)) - return 0; + ret = -1; + + close_io(fd); + + RET (ret); +}
- return -1; + +static void +hfsp_initializer( hfsp_info_t *dummy ) +{ + fword("register-fs-package"); +} + +NODE_METHODS( hfsp ) = { + { "probe", hfsp_files_probe }, + { "open", hfsp_files_open }, + { "close", hfsp_files_close }, + { "read", hfsp_files_read }, + { "seek", hfsp_files_seek }, + { "load", hfsp_files_load }, + + /* special */ + { "open-nwrom", hfsp_files_open_nwrom }, + { "get-path", hfsp_files_get_path }, + { "get-fstype", hfsp_files_get_fstype }, + { "volume-name", hfsp_files_volume_name }, + + { NULL, hfsp_initializer }, +}; + +void +hfsp_init( void ) +{ + REGISTER_NODE( hfsp ); }
Modified: trunk/openbios-devel/packages/init.c ============================================================================== --- trunk/openbios-devel/packages/init.c Sat Jul 3 16:39:49 2010 (r809) +++ trunk/openbios-devel/packages/init.c Sat Jul 3 21:02:43 2010 (r810) @@ -30,6 +30,9 @@ #ifdef CONFIG_DISK_LABEL disklabel_init(); #endif +#ifdef CONFIG_HFSP + hfsp_init(); +#endif #ifdef CONFIG_ISO9660 iso9660_init(); #endif
Modified: trunk/openbios-devel/packages/misc-files.c ============================================================================== --- trunk/openbios-devel/packages/misc-files.c Sat Jul 3 16:39:49 2010 (r809) +++ trunk/openbios-devel/packages/misc-files.c Sat Jul 3 21:02:43 2010 (r810) @@ -57,14 +57,8 @@ err = (fd = open_ih(ih)) == -1;
if( !err ) { - err = fs_hfsp_open(fd, fs); - DPRINTF("--- HFSP returned %d\n", err); - - if( err ) { - err = fs_hfs_open(fd, fs); - DPRINTF("--- HFS returned %d\n", err); - } - + err = fs_hfs_open(fd, fs); + if( err ) { err = fs_ext2_open(fd, fs); DPRINTF("--- ext2 returned %d\n", err); @@ -347,13 +341,8 @@ err = (fd = open_ih(ih)) == -1; if( !err ) {
- err = fs_hfsp_probe(fd, offs); - DPRINTF("--- HFSP returned %d\n", err); - - if( err ) { - err = fs_hfs_probe(fd, offs); - DPRINTF("--- HFS returned %d\n", err); - } + err = fs_hfs_probe(fd, offs); + DPRINTF("--- HFS returned %d\n", err);
if( err ) { err = fs_ext2_probe(fd, offs);
Modified: trunk/openbios-devel/packages/packages.h ============================================================================== --- trunk/openbios-devel/packages/packages.h Sat Jul 3 16:39:49 2010 (r809) +++ trunk/openbios-devel/packages/packages.h Sat Jul 3 21:02:43 2010 (r810) @@ -21,6 +21,7 @@ extern void disklabel_init( void ); extern void files_init( void ); extern void iso9660_init( void ); +extern void hfsp_init( void ); extern void macparts_init( void ); extern void pcparts_init( void ); extern void sunparts_init( void );