summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Williams <gww@silcom.com>2002-03-01 08:06:33 +0000
committerGeorge Williams <gww@silcom.com>2002-03-01 08:06:33 +0000
commit58fd65191ad0ccec6f1b02443ab5ccc3eefdee19 (patch)
tree62396fb961481a082d1347ff9c7febbdbad422c4
parentab91f319ed6c18c05d640d3c4498b37144ac1ca4 (diff)
fondu will now read mac resource forks on mac OS/X
-rw-r--r--fondu.c44
-rw-r--r--showfond.c45
2 files changed, 88 insertions, 1 deletions
diff --git a/fondu.c b/fondu.c
index 17dfad1..19fa0af 100644
--- a/fondu.c
+++ b/fondu.c
@@ -699,6 +699,45 @@ return( false );
return( true );
}
+#ifdef __Mac
+#include "MacFiles.h"
+
+static int HasResourceFork(char *filename) {
+ /* If we're on a mac, we can try to see if we've got a real resource fork */
+ FSRef ref;
+ FSSpec spec;
+ short res;
+ int cnt, ret;
+ FILE *temp;
+ char *buf;
+
+ if ( FSPathMakeRef( (unsigned char *) filename,&ref,NULL)!=noErr )
+return( 0 );
+ if ( FSGetCatalogInfo(&ref,0,NULL,NULL,&spec,NULL)!=noErr )
+return( 0 );
+ if ( FSpOpenRF(&spec,fsRdPerm,&res)!=noErr )
+return( 0 );
+ temp = tmpfile();
+ buf = malloc(8192);
+ while ( 1 ) {
+ cnt = 8192;
+ ret = FSRead(res,&cnt,buf);
+ if ( cnt!=0 )
+ fwrite(buf,1,cnt,temp);
+ if ( ret==eofErr )
+ break;
+ if ( ret!=noErr )
+ break;
+ }
+ free(buf);
+ FSClose(res);
+ rewind(temp);
+ ret = IsResourceFork(temp,0);
+ fclose(temp);
+return( ret );
+}
+#endif
+
static int IsResourceInBinary(FILE *f) {
unsigned char header[128];
unsigned long offset;
@@ -800,7 +839,6 @@ return( false );
ret = IsResourceFork(binary,ftell(binary)+dlen+2);
- rewind(binary);
fclose(binary);
return( ret );
}
@@ -832,6 +870,10 @@ return( true );
ret = IsResourceFork(f,0);
fclose(f);
+#ifdef __Mac
+ if ( !ret )
+ ret = HasResourceFork(filename);
+#endif
return( ret );
}
diff --git a/showfond.c b/showfond.c
index 494b116..7be809a 100644
--- a/showfond.c
+++ b/showfond.c
@@ -507,6 +507,47 @@ return( false );
return( true );
}
+#ifdef __Mac
+#include "MacFiles.h"
+
+static int HasResourceFork(char *filename) {
+ /* If we're on a mac, we can try to see if we've got a real resource fork */
+ Str255 p_file;
+ FSSpec spec;
+ short res;
+ int cnt, ret;
+ FILE *temp;
+ char *buf;
+
+ if ( strlen( filename )>255 )
+return( 0 );
+ p_file[0] = strlen(filename);
+ strncpy((char *) p_file+1,filename,strlen(filename));
+ if ( FSMakeFSSpec(0,0,p_file,&spec)!=noErr )
+return( 0 );
+ if ( FSpOpenRF(&spec,fsRdPerm,&res)!=noErr )
+return( 0 );
+ temp = tmpfile();
+ buf = malloc(8192);
+ while ( 1 ) {
+ cnt = 8192;
+ ret = FSRead(res,&cnt,buf);
+ if ( cnt!=0 )
+ fwrite(buf,1,cnt,temp);
+ if ( ret==eofErr )
+ break;
+ if ( ret!=noErr )
+ break;
+ }
+ free(buf);
+ FSClose(res);
+ rewind(temp);
+ ret = IsResourceFork(temp,0);
+ fclose(temp);
+return( ret );
+}
+#endif
+
static int IsResourceInBinary(FILE *f) {
unsigned char header[128];
unsigned long offset;
@@ -638,6 +679,10 @@ return( true );
ret = IsResourceFork(f,0);
fclose(f);
+#ifdef __Mac
+ if ( !ret )
+ ret = HasResourceFork(filename);
+#endif
return( ret );
}