[OpenBIOS] [commit] r810 - in trunk/openbios-devel: fs/hfsplus packages
repository service
svn at openbios.org
Sat Jul 3 21:02:44 CEST 2010
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 at 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 at ibrium.se)
+ * Copyright (C) 2010 Mark Cave-Ayland (mark.cave-ayland at 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 );
More information about the OpenBIOS
mailing list