1
0
Files
irix-657m-src/eoe/cmd/fp/macVolume.c
2022-09-29 17:59:04 +03:00

1080 lines
40 KiB
C

/*
(C) Copyright Digital Instrumentation Technology, Inc., 1990 - 1993
All Rights Reserved
*/
/* DIT TransferPro -- MacVolume.c */
/* includes: */
#include <assert.h>
#include <bstring.h>
#include <sys/types.h>
#include <malloc.h>
#include <sys/param.h>
#include "macLibrary.h"
#include "macPort.h"
#include "Device.h"
#include "fpdevice.h"
#include "dm.h"
extern int debug_flag;
static char *Module = "MacInit";
static struct m_volume *VolumeTable[MAX_MAC_VOLUMES];
/*----------------------macNewVolume --------------------------------
Inits a new volume.
--------------------------------------------------------------------*/
int macNewVolume ( path, volume )
char *path;
struct m_volume **volume;
{
int retval = E_NONE;
int i=0;
int newVolume = -1;
while ( retval == E_NONE && i < MAX_MAC_VOLUMES )
{
if ( VolumeTable[i] && !strcmp (VolumeTable[i]->mountPoint, path) )
{
retval = set_error (E_MOUNT, Module, "macNewVolume",
"Volume already mounted.");
}
else if ( VolumeTable[i] == (struct m_volume *)0 && newVolume < 0 )
{
newVolume = i;
}
i++;
}
if ( retval == E_NONE )
{
if ( newVolume >= 0 )
{
VolumeTable[newVolume] = (struct m_volume *)malloc (sizeof (struct
m_volume));
if ( VolumeTable[newVolume] == (struct m_volume *)0 )
{
retval = set_error (E_MEMORY, Module, "macNewVolume",
"Insufficent memory.");
}
else
{
*volume = VolumeTable[newVolume];
}
}
else
{
retval = set_error (E_MOUNT, Module, "macNewVolume",
"Maximum number of volumes open.");
}
}
return (retval);
}
/*----------------------macFreeVolume ------------------------------
Frees a volume.
-------------------------------------------------------------------*/
int macFreeVolume ( path )
char *path;
{
int retval = E_NONE;
int i=0;
int volume = -1;
struct m_volume *macVolume = (struct m_volume *)0;
while ( volume < 0 && i < MAX_MAC_VOLUMES )
{
if ( VolumeTable[i] && !strcmp (VolumeTable[i]->mountPoint, path) )
{
volume = i;
}
i++;
}
if ( volume < 0 )
{
retval = set_error (E_MOUNT, Module, "macFreeVolume",
"Mac volume not mounted.");
}
else
{
macVolume = VolumeTable[volume];
if ( macVolume->catalog )
{
macFreeTree( &macVolume->catalog, CATALOG_TREE, macVolume->vib );
}
if ( macVolume->extents )
{
macFreeTree( &macVolume->extents, EXTENTS_TREE, macVolume->vib );
}
if ( macVolume->vib )
{
free( (char *)macVolume->vib );
}
if ( macVolume->vbm )
{
free( (char *)macVolume->vbm );
}
free ( (char *)macVolume );
VolumeTable[volume] = (struct m_volume *)0;
}
return (retval);
}
/*-----------------------macGetVolume ------------------------------
Finds the volume supporting the given path
-------------------------------------------------------------------*/
struct m_volume *macGetVolume ( path )
char *path;
{
struct m_volume *volume = (struct m_volume *)0;
int i=0;
size_t len = 0;
int match = -1;
while ( i < MAX_MAC_VOLUMES )
{
if ( VolumeTable[i] && !strncmp (VolumeTable[i]->mountPoint, path,
strlen(VolumeTable[i]->mountPoint)) &&
len < strlen(VolumeTable[i]->mountPoint) )
{
match = i;
len = strlen(VolumeTable[i]->mountPoint);
}
i++;
}
if ( match >= 0 )
{
volume = VolumeTable[match];
}
return (volume);
}
/*--- macInit ---------------------
* reads info from mac diskette necessary to access its data
* returns: error status
*/
int macInit( volume )
struct m_volume *volume;
{
int retval = E_NONE;
int vbmSize;
char *funcname = "macInit";
int count;
int a;
/* allocate the buffer for the vib */
volume->vib = (struct m_VIB *)0;
volume->vbm = (struct m_VBM *)0;
if ( (volume->vib = (struct m_VIB *)malloc((unsigned)NODE_SIZE)) == 0 )
{
retval = set_error( E_MEMORY, Module, funcname, "" );
}
else if( (retval = macReadVIB(volume)) != E_NONE )
{
;
}
else
{
volume->maxNodes = volume->vib->drNmAlblks/4;
vbmSize = (volume->vib->drAlBlSt - volume->vib->drVBMSt);
if ( (volume->vbm = (struct m_VBM *)malloc((unsigned)(vbmSize * NODE_SIZE))) == 0 )
{
retval = set_error( E_MEMORY, Module, funcname, "" );
}
else
{
retval = macReadBitmap (volume, vbmSize );
}
}
if ( retval == E_NONE )
{
/* These pointers never need to be extended when a new extent is
added to either of the trees because this calculation always assumes
the maximum tree size you could possibly get for the volume
allocate (*catalog) and (*extents) pointers */
if ( (volume->extents = (struct BtreeNode **)malloc((unsigned)
((volume->maxNodes)*sizeof(struct BtreeNode *)))) == 0 )
{
retval = set_error( E_MEMORY, Module, funcname, "" );
}
else
{
for ( a = 0; a < volume->maxNodes; a++ )
{
volume->extents[a] = 0;
}
}
if ( retval != E_NONE )
{
;
}
else if ( (volume->catalog = (struct BtreeNode **)malloc((unsigned)
(volume->maxNodes*sizeof(struct BtreeNode *)))) == 0 )
{
retval = set_error( E_MEMORY, Module, funcname, "" );
}
else
{
for ( a = 0; a < volume->maxNodes; a++ )
{
volume->catalog[a] = 0;
}
}
}
if (retval == E_NONE)
{
retval = macReadExtentsTree ( volume );
}
if (retval == E_NONE)
{
retval = macReadCatalog ( volume );
}
if ( retval != E_NONE )
{
if ( volume->vib )
{
free( (char *) volume->vib );
volume->vib = 0;
}
if ( volume->vbm )
{
free( (char *) volume->vbm );
volume->vbm = 0;
}
for( count = 0; count < volume->maxNodes; count++ )
{
if( volume->catalog && volume->catalog[count] )
{
free( (char *) volume->catalog[count] );
volume->catalog[count] = (struct BtreeNode *)0;
}
if( volume->extents && volume->extents[count] )
{
free( (char *) volume->extents[count] );
volume->extents[count] = (struct BtreeNode *)0;
}
}
if ( volume->catalog )
{
free( (char *) volume->catalog );
volume->catalog = 0;
}
if ( volume->extents )
{
free( (char *) volume->extents );
volume->extents = 0;
}
}
return(retval);
}
/*--- macUpdateDisk ----------------------------------
* updates catalog tree file and extents tree file on disk
*/
int macUpdateDisk( volume )
struct m_volume *volume;
{
int retval = E_NONE;
retval = macWriteCatalog( volume );
if( retval == E_NONE )
{
retval = macWriteExtentsTree( volume );
}
if( retval == E_NONE )
{
retval = macWriteVIB( volume );
}
if( retval == E_NONE )
{
retval = macWriteBitmap( volume );
}
return(retval);
}
/*--------------- macResetVolume -------------------------------------------
Reset entities in memory so that any changes will not persist.
------------------------------------------------------------------------*/
int macResetVolume( volume )
struct m_volume *volume;
{
int retval = E_NONE;
if ( volume)
{
macFreeTree( &volume->catalog, CATALOG_TREE, volume->vib );
macFreeTree( &volume->extents, EXTENTS_TREE, volume->vib );
if (volume->vib )
{
free( (char *) volume->vib );
volume->vib = (struct m_VIB *)0;
}
if (volume->vbm )
{
free( (char *) volume->vbm );
volume->vbm = (struct m_VBM *)0;
}
retval = macInit( volume );
}
return( retval );
}
/*-- DISK FORMATTING SUBROUTINES ---------------------------
*
*/
static unsigned char Extent_data[] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0x78, 0x00, 0x0e
};
static unsigned char Catalog_data[] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
0x02, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0x78, 0x00, 0x0e,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x00,
0x00, 0x00, 0x00, 0x01, 0x08, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x00, 0x01, 0x00,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0xa2, 0xf7, 0x3b, 0xd9, 0xa2, 0xf7, 0x3b, 0xdc,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x54, 0x65, 0x73, 0x74, 0x44,
0x69, 0x73, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x02,
0x07, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x02, 0x00, 0x00, 0x00, 0x46, 0x4e, 0x44, 0x52,
0x45, 0x52, 0x49, 0x4b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x41,
0x00, 0x00, 0x2e, 0x00, 0xa2, 0xf7, 0x3b, 0xdc, 0xa2, 0xf7, 0x3b, 0xdc, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c,
0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x00, 0x9a, 0x00, 0x64, 0x00, 0x0e
};
static unsigned char Desktop_data[] =
{
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x32,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x07, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x02, 0x00, 0x00, 0x00, 0x46, 0x4e, 0x44, 0x52,
0x45, 0x52, 0x49, 0x4b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
0x00, 0x00, 0x46, 0x4e, 0x44, 0x52, 0x45, 0x52, 0x49, 0x4b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xa2, 0xf7, 0x3b, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x41, 0xff, 0xff,
0x40, 0x00, 0x00, 0x01, 0x40, 0x00, 0x08, 0x81, 0x4f, 0xc0, 0x11, 0x01, 0x48, 0x60, 0x22, 0x21,
0x48, 0x50, 0x44, 0x41, 0x48, 0x78, 0x00, 0x81, 0x48, 0x3e, 0x01, 0x01, 0x48, 0x55, 0x00, 0x01,
0x48, 0x88, 0xfe, 0x01, 0x49, 0x00, 0x43, 0x01, 0x48, 0x80, 0x42, 0x81, 0x48, 0x40, 0x43, 0xc1,
0x48, 0x20, 0x40, 0x41, 0x48, 0x10, 0x40, 0x41, 0x4f, 0xf8, 0x40, 0x41, 0x40, 0x04, 0x40, 0x41,
0x40, 0x02, 0xc0, 0x41, 0x40, 0x01, 0x40, 0x41, 0x40, 0x00, 0x40, 0x41, 0x40, 0x00, 0x7f, 0xc1,
0x40, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x40, 0x00, 0x0f, 0xf9, 0x40, 0x00, 0x07, 0xf1,
0x40, 0x00, 0x03, 0xe1, 0x40, 0x00, 0x01, 0xc1, 0x40, 0x00, 0x00, 0x81, 0x40, 0x00, 0x00, 0x01,
0x40, 0x00, 0x00, 0x01, 0x7f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x0b, 0x0a, 0x46, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x31, 0x2e, 0x30, 0x00,
0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x32, 0x00,
0x02, 0xc8, 0x7a, 0x03, 0x50, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x32, 0x00, 0x00, 0x53, 0x54, 0x52,
0x20, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x51,
0xea, 0xc0, 0x33, 0x00, 0x30, 0x30, 0x30, 0x03, 0x30, 0xc0, 0x3f, 0xc0, 0x00, 0x00, 0xc0, 0x03,
0x30, 0xc0, 0x0f, 0xfc, 0x00, 0x03, 0x00, 0x03, 0x30, 0xc0, 0x33, 0x33, 0x00, 0x00, 0x00, 0x03,
0x30, 0xc0, 0xc0, 0xc0, 0xff, 0xfc, 0x00, 0x03, 0x30, 0xc3, 0x00, 0x00, 0x30, 0x0f, 0x00, 0x03,
0x30, 0xc0, 0xc0, 0x00, 0x30, 0x0c, 0xc0, 0x03, 0x30, 0xc0, 0x30, 0x00, 0x30, 0x0f, 0xf0, 0x03,
0x30, 0xc0, 0x0c, 0x00, 0x30, 0x00, 0x30, 0x03, 0x30, 0xc0, 0x03, 0x00, 0x30, 0x00, 0x30, 0x03,
0x30, 0xff, 0xff, 0xc0, 0x30, 0x00, 0x30, 0x03, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x03,
0x30, 0x00, 0x00, 0x0c, 0xf0, 0x00, 0x30, 0x03, 0x30, 0x00, 0x00, 0x03, 0x30, 0x00, 0x30, 0x03,
0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xf0, 0x03,
0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
0x30, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x03,
0x30, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x03,
0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03
};
/*-- mac_block0_init -------
*
* Write the block 0 data structure for a partitioned disk.
*/
int mac_block0_init(void *aDevice)
{
struct m_DriverMap block0;
char buf[512];
struct DsDevice *dp = aDevice;
const int devsize = dp->diskdevice.capacityReplyData.cr_lastlba + 1;
bzero(&buf, sizeof buf);
bzero(&block0, sizeof block0);
block0.sbSig = PT_DEVSIGVAL;
block0.sbBlockSize = 512;
block0.sbBlkCount = devsize;
macPackDriverMap(&block0, buf);
return macWriteBlockDevice(dp, buf, 0, 1);
}
/*-- mac_partition_init -------
*
* The partition map has two entries.
*
* entry 0 is the partition map itself.
* entry 1 is the HFS partition.
*
* The partition map is two blocks (1024 bytes) long.
*/
int mac_partition_init(void *aDevice)
{
struct m_PartitionMap map[2];
char buf[512 * 2];
struct DsDevice *dp = aDevice;
const int mapsize = 2; /* two blocks used for map */
const int devsize = dp->diskdevice.capacityReplyData.cr_lastlba + 1;
int i;
/* Common fields in all partition map entries */
bzero(buf, sizeof buf);
bzero(map, sizeof map);
for (i = 0; i < 2; i++)
{ map[i].pmSig = PT_PMAPSIGVAL;
map[i].pmMapBlkCnt = mapsize;
}
/* Partition map entry 0: partition map. */
map[0].pmPyPartStart = 1;
map[0].pmPartBlkCnt = mapsize;
strcpy(map[0].pmPartName, "SGI mkfp partition map");
strcpy(map[0].pmPartType, PT_PARTTYPEPMAP);
/* Partition map entry 1: HFS partition. */
map[1].pmPyPartStart = mapsize + 1;
map[1].pmPartBlkCnt = devsize - mapsize - 1;
strcpy(map[1].pmPartName, "HFS Volume");
strcpy(map[1].pmPartType, PT_PARTTYPEHFS);
/* Pack it up and write it out. */
macPackPartitionMap(&map[0], buf);
macPackPartitionMap(&map[1], buf + 512);
return macWriteBlockDevice(dp, buf, 1, 2);
}
/*-- mac_boot_init -------
*
*/
int mac_boot_init( aDevice )
void * aDevice;
{
int retval = E_NONE;
char bootData[ 1024 ];
int a;
bzero(bootData, sizeof bootData);
retval = macWriteBlockDevice ((struct Device *)aDevice, bootData, 0, 2);
return( retval );
}
/*-- mac_vib_init -------
*
*/
int mac_vib_init( volume, diskname, mediatype, Iflag )
struct m_volume *volume;
char *diskname;
int mediatype;
int Iflag;
{
int retval = E_NONE;
int desktopBytes;
int desktopBlocks;
int namelen = strlen( diskname );
char *funcname = "mac_vib_init";
int alBlkFactor;
int sizeDisk;
int a;
struct m_VIB *vibPtr = volume->vib;
sizeDisk = volume->vblksize - 1;
alBlkFactor = ((sizeDisk + 1) / 0x10000) + 1;
for ( a = 0; a < NODE_SIZE; a++ )
{
*((char *)vibPtr+a) = 0;
}
vibPtr->drSigWord = 0x4244;
vibPtr->drCrDate = vibPtr->drLsMod = macDate();
vibPtr->drAtrb = 256;
vibPtr->drNmFls = 1; /* desktop */
vibPtr->drVBMSt = 3;
vibPtr->drAllocPtr = 0;
vibPtr->drWrCnt = 0;
assert(Iflag == 0); /* volume size now determined via READCAPACITY */
/* allocation blocks = available blocks minus blocks used for boot, vib,
and vbm. Start it out as all alblocks on volume (-2 for boot blocks) */
if ( Iflag == 1 ) /* It is a Bernoulli 90MB Drive */
{
vibPtr->drNmAlblks = 58550+18;
/* set some stuff */
vibPtr->drAlBlkSiz = SCSI_BLOCK_SIZE * alBlkFactor;
vibPtr->drClpSiz = vibPtr->drAlBlkSiz * 2;
/* set vbm size
total alblks / number that can be addressed by one vbm block, +1 */
vibPtr->drAlBlSt = (int)(vibPtr->drNmAlblks/4096+1) + vibPtr->drVBMSt;
vibPtr->drNmAlblks = 58550;
vibPtr->drNxtCNID = 17;
/* start free blocks out equal to all blocks */
vibPtr->drFreeBks = vibPtr->drNmAlblks;
/* volname */
vibPtr->drVolNameLen =
(namelen > MAX_MAC_VOL_NAME)? MAX_MAC_VOL_NAME : namelen;
strncpy( (char *)vibPtr->drVolName, diskname, (int)vibPtr->drVolNameLen );
/* clump size */
vibPtr->drXTClpSiz = 703488;
}
else if ( Iflag == 3 ) /* It is a Bernoulli 150MB Drive */
{
if (sizeDisk < 80000) /* 35MB disk*/
vibPtr->drNmAlblks = 34729+18;
else if (sizeDisk < 140000) /* 65MB disk */
vibPtr->drNmAlblks = 64443+18;
else if (sizeDisk < 185000) /* 90MB disk */
retval = set_error( E_NOTSUPPORTED, Module, funcname,
"Format not supported by the driver" );
else if (sizeDisk < 220000) /* 105MB disk */
vibPtr->drNmAlblks = 51663+18;
else if (sizeDisk < 310000) /* 150MB disk */
vibPtr->drNmAlblks = 58942+18;
else
retval = set_error( E_NOTSUPPORTED, Module, funcname,
"Format not supported by the driver" );
if (retval == E_NONE)
{
/* set some stuff */
vibPtr->drAlBlkSiz = SCSI_BLOCK_SIZE * alBlkFactor;
vibPtr->drClpSiz = vibPtr->drAlBlkSiz * 2;
/* set vbm size
total alblks / number that can be addressed by one vbm block, +1 */
vibPtr->drAlBlSt = (int)(vibPtr->drNmAlblks/4096+1) + vibPtr->drVBMSt;
if (sizeDisk < 80000) /* 35MB disk*/
vibPtr->drNmAlblks = 34729;
else if (sizeDisk < 140000) /* 65MB disk */
vibPtr->drNmAlblks = 64443;
else if (sizeDisk < 220000) /* 105MB disk */
vibPtr->drNmAlblks = 51663;
else /* 150MB disk */
vibPtr->drNmAlblks = 58942;
vibPtr->drNxtCNID = 17;
/* start free blocks out equal to all blocks */
vibPtr->drFreeBks = vibPtr->drNmAlblks;
/* volname */
vibPtr->drVolNameLen =
(namelen > MAX_MAC_VOL_NAME)? MAX_MAC_VOL_NAME : namelen;
strncpy( (char *)vibPtr->drVolName, diskname, (int)vibPtr->drVolNameLen );
/* clump size */
if (sizeDisk < 80000) /* 35MB disk*/
vibPtr->drXTClpSiz = 277504;
else if (sizeDisk < 140000) /* 65MB disk */
vibPtr->drXTClpSiz = 516096;
else if (sizeDisk < 220000) /* 105MB disk */
vibPtr->drXTClpSiz = 827392;
else /* 150MB disk */
vibPtr->drXTClpSiz = 1047040;
}
}
else if ( Iflag == 2 ) /* It is a SyQuest Drive */
{
if ( sizeDisk < 87000 ) /* SyQuest44 */
{
vibPtr->drNmAlblks = 43309;
}
else
{
vibPtr->drNmAlblks = 57769;
}
/* set some stuff */
vibPtr->drAlBlkSiz = SCSI_BLOCK_SIZE * alBlkFactor;
vibPtr->drClpSiz = (SCSI_BLOCK_SIZE*4) * alBlkFactor;
/* set vbm size
total alblks / number that can be addressed by one vbm block, +1 */
vibPtr->drAlBlSt = (int)(vibPtr->drNmAlblks/4096+1) + vibPtr->drVBMSt;
vibPtr->drNmAlblks = vibPtr->drNmAlblks - 18;
vibPtr->drNxtCNID = 17;
/* start free blocks out equal to all blocks */
vibPtr->drFreeBks = vibPtr->drNmAlblks;
/* volname */
vibPtr->drVolNameLen =
(namelen > MAX_MAC_VOL_NAME)? MAX_MAC_VOL_NAME : namelen;
strncpy( (char *)vibPtr->drVolName, diskname, (int)vibPtr->drVolNameLen );
/* clump size */
if ( sizeDisk < 87000 ) /* SyQuest44 */
{
vibPtr->drXTClpSiz = 346112;
}
else
{
vibPtr->drXTClpSiz = 692736;
}
}
else if ( Iflag == 4 ) /* It is a Pinnacle Optical Drive */
{
vibPtr->drNmAlblks = 64078+18;
/* set some stuff */
vibPtr->drAlBlkSiz = SCSI_BLOCK_SIZE * alBlkFactor;
vibPtr->drClpSiz = vibPtr->drAlBlkSiz * 4;
/* set vbm size
total alblks / number that can be addressed by one vbm block, +1 */
vibPtr->drAlBlSt = (int)(vibPtr->drNmAlblks/4096+1) + vibPtr->drVBMSt;
vibPtr->drNmAlblks = 64096;
vibPtr->drNxtCNID = 17;
/* start free blocks out equal to all blocks */
vibPtr->drFreeBks = vibPtr->drNmAlblks;
/* volname */
vibPtr->drVolNameLen =
(namelen > MAX_MAC_VOL_NAME)? MAX_MAC_VOL_NAME : namelen;
strncpy( (char *)vibPtr->drVolName, diskname, (int)vibPtr->drVolNameLen );
/* clump size */
vibPtr->drXTClpSiz = 1046016;
}
else
{
/* set some stuff */
vibPtr->drAlBlkSiz = SCSI_BLOCK_SIZE * alBlkFactor;
vibPtr->drClpSiz = (SCSI_BLOCK_SIZE*4) * alBlkFactor;
vibPtr->drNmAlblks = ((sizeDisk+1-2) / alBlkFactor);
/* set vbm size
total alblks / number that can be addressed by one vbm block, +1 */
vibPtr->drAlBlSt = (int)(vibPtr->drNmAlblks/4096+1) + vibPtr->drVBMSt;
/* set final value for alBlks */
vibPtr->drNmAlblks -= (vibPtr->drAlBlSt/(unsigned short)alBlkFactor);
vibPtr->drNxtCNID = 17;
/* start free blocks out equal to all blocks */
vibPtr->drFreeBks = vibPtr->drNmAlblks;
/* volname */
vibPtr->drVolNameLen =
(namelen > MAX_MAC_VOL_NAME)? MAX_MAC_VOL_NAME : namelen;
strncpy( (char *)vibPtr->drVolName, diskname, (int)vibPtr->drVolNameLen );
/* clump size */
vibPtr->drXTClpSiz = ((int)(vibPtr->drNmAlblks/128) * vibPtr->drAlBlkSiz);
}
if (retval == E_NONE) /* if the 150MB drive can do the formatting */
{
vibPtr->drCTClpSiz = vibPtr->drXTClpSiz;
/* filCnt */
vibPtr->drFilCnt = 1;
/* catalog and extents */
vibPtr->drXTFlSize = vibPtr->drXTClpSiz;
vibPtr->drCTFlSize = vibPtr->drCTClpSiz;
vibPtr->drXTExtRec[0].ed_start = 0;
vibPtr->drXTExtRec[0].ed_length = vibPtr->drXTClpSiz/vibPtr->drAlBlkSiz;
vibPtr->drCTExtRec[0].ed_start = vibPtr->drXTClpSiz/vibPtr->drAlBlkSiz;
vibPtr->drCTExtRec[0].ed_length = vibPtr->drCTClpSiz/vibPtr->drAlBlkSiz;
/* desktop (should never be more than 32k) */
if ( (desktopBytes = vibPtr->drCTClpSiz) < 0x8000 )
{
desktopBlocks = (desktopBytes / vibPtr->drAlBlkSiz) + 1;
}
else
{
desktopBlocks = 0x8000/vibPtr->drAlBlkSiz;
}
/* set free blocks to final value */
vibPtr->drFreeBks -= vibPtr->drXTExtRec[0].ed_length +
vibPtr->drCTExtRec[0].ed_length + desktopBlocks;
retval = macWriteVIB ( volume );
}
if (debug_flag)
{
printf("mac_vib_init: drSigWord==0x%x\n", vibPtr->drSigWord);
printf("mac_vib_init: drCrDate==0x%x\n", vibPtr->drCrDate);
printf("mac_vib_init: drLsMod==0x%x\n", vibPtr->drLsMod);
printf("mac_vib_init: drAtrb==0x%x\n", vibPtr->drAtrb);
printf("mac_vib_init: drNmFls==0x%x\n", vibPtr->drNmFls);
printf("mac_vib_init: drVBMSt==0x%x\n", vibPtr->drVBMSt);
printf("mac_vib_init: drAllocPtr==0x%x\n", vibPtr->drAllocPtr);
printf("mac_vib_init: drNmAlblks==0x%x\n", vibPtr->drNmAlblks);
printf("mac_vib_init: drAlBlkSiz==0x%x\n", vibPtr->drAlBlkSiz);
printf("mac_vib_init: drClpSiz==0x%x\n", vibPtr->drClpSiz);
printf("mac_vib_init: drAlBlSt==0x%x\n", vibPtr->drAlBlSt);
printf("mac_vib_init: drNxtCNID==0x%x\n", vibPtr->drNxtCNID);
printf("mac_vib_init: drFreeBks==0x%x\n", vibPtr->drFreeBks);
printf("mac_vib_init: drVolNameLen==0x%x\n", vibPtr->drVolNameLen);
printf("mac_vib_init: drVolName==%s\n", vibPtr->drVolName);
printf("mac_vib_init: drVolBkUp==0x%x\n", vibPtr->drVolBkUp);
printf("mac_vib_init: drVSeqNum==0x%x\n", vibPtr->drVSeqNum);
printf("mac_vib_init: drWrCnt==0x%x\n", vibPtr->drWrCnt);
printf("mac_vib_init: drXTClpSiz==0x%x\n", vibPtr->drXTClpSiz);
printf("mac_vib_init: drCTClpSiz==0x%x\n", vibPtr->drCTClpSiz);
printf("mac_vib_init: drNmRtDirs==0x%x\n", vibPtr->drNmRtDirs);
printf("mac_vib_init: drFilCnt==0x%x\n", vibPtr->drFilCnt);
printf("mac_vib_init: drDirCnt==0x%x\n", vibPtr->drDirCnt);
printf("mac_vib_init: drFndrInfo==0x%x\n", vibPtr->drFndrInfo);
printf("mac_vib_init: drVCSiz==0x%x\n", vibPtr->drVCSiz);
printf("mac_vib_init: drVBMSiz==0x%x\n", vibPtr->drVBMSiz);
printf("mac_vib_init: drCtlCSiz==0x%x\n", vibPtr->drCtlCSiz);
printf("mac_vib_init: drXTFlSize==0x%x\n", vibPtr->drXTFlSize);
printf("mac_vib_init: drXTExtRec==0x%x\n", vibPtr->drXTExtRec);
printf("mac_vib_init: drCTFlSize==0x%x\n", vibPtr->drCTFlSize);
printf("mac_vib_init: drCTExtRec==0x%x\n", vibPtr->drCTExtRec);
}
return( retval );
}
/*-- mac_vbm_init -------
*
*/
int mac_vbm_init( volume )
struct m_volume *volume;
{
int retval = E_NONE;
char *vbm;
int a, b;
struct m_VIB *vibptr = volume->vib;
int vbmBlockCount = (vibptr->drAlBlSt - vibptr->drVBMSt);
int vbmSize = vbmBlockCount * SCSI_BLOCK_SIZE;
char *funcname = "mac_vbm_init";
if ( (vbm = malloc((unsigned)vbmSize)) == 0 )
{
retval = set_error( E_MEMORY, Module, funcname, "" );
}
else
{
for ( a = 0; a < vbmSize; a++ )
{
*(vbm+a) = 0;
}
/* mark off the extent tree */
for ( a = 0, b = (vibptr->drXTFlSize/vibptr->drAlBlkSiz); a < b; a++ )
{
macSetBit( vbm, a );
}
/* mark off the catalog tree */
for ( b = a + (vibptr->drCTFlSize/vibptr->drAlBlkSiz); a < b; a++ )
{
macSetBit( vbm, a );
}
/* mark off the Desktop file */
for ( b = a + (vibptr->drNmAlblks-vibptr->drFreeBks-a); a < b; a++ )
{
macSetBit( vbm, a );
}
volume->vbm = (struct m_VBM *)vbm;
retval = macWriteBitmap (volume);
}
if ( vbm )
{
free( vbm );
}
return( retval );
}
/*-- mac_extent_init -------
*
*/
int mac_extent_init( volume )
struct m_volume *volume;
{
int retval = E_NONE;
int a, b;
struct m_VIB *vibptr = volume->vib;
unsigned int esize = vibptr->drXTFlSize;
char *extents = malloc( (unsigned)(esize) );
struct header_node extentptr;
char *funcname = "mac_extent_init";
if ( extents )
{
for ( a = 0, b = esize;
a < b;
a++ )
{
*(extents+a) = 0;
}
macUnPackHeaderNode (&extentptr, (char *)Extent_data);
extentptr.hnHdrRec.hrTotalNodes = esize/NODE_SIZE;
extentptr.hnHdrRec.hrFreeNodes = esize/NODE_SIZE-1;
macPackHeaderNode ((char *) Extent_data, &extentptr);
memcpy( extents, Extent_data, NODE_SIZE );
retval = macWriteBlockDevice (volume->device, extents,
au_to_partition_block(vibptr,vibptr->drXTExtRec[0].ed_start,
volume->vstartblk), esize/SCSI_BLOCK_SIZE);
free( extents );
}
else
{
retval = set_error( E_MEMORY, Module, funcname, "" );
}
return( retval );
}
/*-- mac_catalog_init -------
*
*/
int mac_catalog_init( volume, diskname )
struct m_volume *volume;
char *diskname;
{
int retval = E_NONE;
int a, b;
struct m_VIB *vibptr = volume->vib;
unsigned int csize = vibptr->drCTFlSize;
char *catalog = malloc( (unsigned)(csize) );
char *funcname = "mac_catalog_init";
struct leaf_node catleaf;
int namelen = strlen( diskname );
struct header_node catptr;
if ( namelen > MAX_MAC_VOL_NAME )
{
namelen = MAX_MAC_VOL_NAME;
}
if ( catalog )
{
for ( a = 0, b = csize;
a < b;
a++ )
{
*(catalog+a) = 0;
}
macUnPackLeafNode( LEAF_NODE, &catleaf, (char *) Catalog_data+NODE_SIZE );
/* ROOT DIR DIRECTORY RECORD */
/* 1 for reserved byte, 4 for parent ID, 1 for name length */
((struct dir_record *)
catleaf.lnRecList[0])->dirRecKey.key.ckr.ckrKeyLen = namelen+6;
((struct dir_record *)
catleaf.lnRecList[0])->dirRecKey.key.ckr.ckrNameLen = namelen;
strncpy( ((struct dir_record *)
catleaf.lnRecList[0])->dirRecKey.key.ckr.ckrCName,
diskname, namelen );
*(((struct dir_record *)
catleaf.lnRecList[0])->dirRecKey.key.ckr.ckrCName+namelen) = 0;
((struct dir_record *)catleaf.lnRecList[0])->dirCrDat =
((struct dir_record *)catleaf.lnRecList[0])->dirMdDat = macDate();
/* ROOT DIR THREAD RECORD */
((struct thread_record *)catleaf.lnRecList[1])->thdCNameLen =
namelen;
strncpy( ((struct thread_record *)catleaf.lnRecList[1])->thdCName,
diskname, MAXMACNAME );
/* DESKTOP FILE RECORD */
((struct file_record *)catleaf.lnRecList[2])->filCrDat =
((struct file_record *)catleaf.lnRecList[2])->filMdDat = macDate();
((struct file_record *)
catleaf.lnRecList[2])->filRExtRec[0].ed_start =
vibptr->drCTExtRec[0].ed_start+vibptr->drCTExtRec[0].ed_length;
((struct file_record *)
catleaf.lnRecList[2])->filRExtRec[0].ed_length =
vibptr->drNmAlblks-vibptr->drFreeBks-
((struct file_record *)catleaf.lnRecList[2])->
filRExtRec[0].ed_start;
((struct file_record *)catleaf.lnRecList[2])->filRPyLen =
((struct file_record *)catleaf.lnRecList[2])->
filRExtRec[0].ed_length * vibptr->drAlBlkSiz;
macPackLeafNode( CATALOG_TREE, (char *) Catalog_data+NODE_SIZE, &catleaf );
macUnPackHeaderNode (&catptr, (char *) Catalog_data);
catptr.hnHdrRec.hrTotalNodes = csize/NODE_SIZE;
catptr.hnHdrRec.hrFreeNodes = csize/NODE_SIZE-2;
macPackHeaderNode((char *) Catalog_data, &catptr);
memcpy( catalog, Catalog_data, NODE_SIZE*2 );
retval = macWriteBlockDevice (volume->device, catalog,
au_to_partition_block(vibptr,vibptr->drCTExtRec[0].ed_start,
volume->vstartblk), csize/SCSI_BLOCK_SIZE);
free( catalog );
}
else
{
retval = set_error( E_MEMORY, Module, funcname, "" );
}
return( retval );
}
/*-- mac_desktop_init -------
*
*/
int mac_desktop_init( volume )
struct m_volume *volume;
{
int retval = E_NONE;
struct m_VIB *vibptr = volume->vib;
retval = macWriteBlockDevice (volume->device, (char *) Desktop_data,
au_to_partition_block(vibptr,vibptr->drCTExtRec[0].ed_length+
vibptr->drXTExtRec[0].ed_length, volume->vstartblk), 1);
return( retval );
}