[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