diff --git a/utils/prodos-utils/prodos.c b/utils/prodos-utils/prodos.c index 68388351..c0f5d2ba 100644 --- a/utils/prodos-utils/prodos.c +++ b/utils/prodos-utils/prodos.c @@ -27,6 +27,8 @@ static int prodos_lookup_file(struct voldir_t *voldir, unsigned char voldir_buffer[PRODOS_BYTES_PER_BLOCK]; int result,file; + if (debug) printf("\t*** Looking for %s in block $%X\n",filename,subdir_block); + voldir_block=subdir_block; voldir_offset=1; /* skip the header */ @@ -44,13 +46,21 @@ static int prodos_lookup_file(struct voldir_t *voldir, fileentries_per_block;file++) { prodos_populate_filedesc( - voldir_buffer+4+file*PRODOS_FILE_DESC_LEN, + voldir_buffer+4+(file*PRODOS_FILE_DESC_LEN), &file_entry); if (file_entry.storage_type==PRODOS_FILE_DELETED) continue; + + if (debug) printf("\tTrying $%X = %s\n", + (voldir_block<<8)|file, + file_entry.file_name); + /* FIXME: case insensitive? */ if (!strncmp(filename,(char *)file_entry.file_name,15)) { + if (debug) printf("*** MATCH: %s = %s at inode $%X\n", + filename,file_entry.file_name, + (voldir_block<<8)|file); return (voldir_block<<8)|file; } } @@ -362,6 +372,7 @@ static int prodos_add_file(struct voldir_t *voldir, /* allocate index */ index=prodos_allocate_block(voldir); key_block=index; + if (debug) printf("**** ALLOCATING SAPLING key_block=$%X\n",key_block); memset(index_buffer,0,PRODOS_BYTES_PER_BLOCK); @@ -442,7 +453,12 @@ static int prodos_add_file(struct voldir_t *voldir, file.version=0; file.min_version=0; file.access=0xe3; // 0x21? - file.aux_type=0; + if (file.file_type==PRODOS_TYPE_BIN) { + file.aux_type=address; + } + else { + file.aux_type=0; + } file.last_mod=prodos_time(time(NULL)); file.header_pointer=dir_block; @@ -787,9 +803,11 @@ static int prodos_delete_file(struct voldir_t *voldir, struct file_entry_t file; int inode; + if (debug) printf("*** DELETING FILE %s\n",apple_filename); /* get the voldir/entry for file */ inode=prodos_lookup_file(voldir,dir_block,apple_filename); + if (debug) printf("\t*** Found inode $%X for file %s\n",inode,apple_filename); if (inode<0) { fprintf(stderr,"Error! %s not found!\n", @@ -804,6 +822,9 @@ static int prodos_delete_file(struct voldir_t *voldir, return -1; } + if (debug) printf("*** PERMANENTLY DELETING %s (inode: $%X)\n", + file.file_name,inode); + /******************************/ /* delete all the file blocks */ /******************************/ @@ -811,7 +832,7 @@ static int prodos_delete_file(struct voldir_t *voldir, switch(file.storage_type) { case PRODOS_FILE_SEEDLING: /* Just a single block */ - if (debug) fprintf(stderr,"Deleting block $%x\n", + if (debug) fprintf(stderr,"*** SEEDLING Deleting block $%x\n", file.key_pointer); result=prodos_free_block(voldir,file.key_pointer); @@ -824,8 +845,8 @@ static int prodos_delete_file(struct voldir_t *voldir, /* Index block points to up to 256 blocks */ /* Addresses are stored low-byte (256 bytes) then hi-byte */ /* Address of zero means file hole, all zeros */ - if (debug) fprintf(stderr,"Freeing index " - "block $%x\n", + if (debug) printf("*** SAPLING " + "Freeing index block $%x\n", file.key_pointer); result=prodos_read_block(voldir,index_block, file.key_pointer); @@ -858,8 +879,8 @@ static int prodos_delete_file(struct voldir_t *voldir, blocks_left=file.blocks_used; - if (debug) fprintf(stderr,"Deleting master index " - "block $%x\n", + if (debug) fprintf(stderr,"*** TREE: " + "Deleting master index block $%x\n", file.key_pointer); result=prodos_read_block(voldir,master_index_block, file.key_pointer); @@ -915,9 +936,12 @@ static int prodos_delete_file(struct voldir_t *voldir, /* should we clear it out? */ /* makes undelete harder */ + /* ProDOS 1.0.1 clears filename but leaves rest */ // memset(&file,0,sizeof(struct file_entry_t)); file.storage_type=PRODOS_FILE_DELETED; + file.name_length=0; + memset(file.file_name,0,PRODOS_FILENAME_LEN); /* copy in new data */ prodos_writeout_filedesc(voldir,&file, diff --git a/utils/prodos-utils/prodos_dump.c b/utils/prodos-utils/prodos_dump.c index 39f24da3..71d352ce 100644 --- a/utils/prodos-utils/prodos_dump.c +++ b/utils/prodos-utils/prodos_dump.c @@ -340,10 +340,13 @@ int prodos_dump(struct voldir_t *voldir) { PRODOS_FILE_DESC_LEN); prodos_populate_filedesc(file_desc,&file_entry); - if (file_entry.storage_type==PRODOS_FILE_DELETED) continue; +// if (file_entry.storage_type==PRODOS_FILE_DELETED) continue; printf("\n\n"); - printf("FILE %d: %s\n",file,file_entry.file_name); + printf("FILE $%x: %s\n", + (catalog_block<<8)|file, + file_entry.file_name); + printf("\tFilename len: %d\n",file_entry.name_length); printf("\t($%X): ",file_entry.storage_type); prodos_print_storage_type(file_entry.storage_type); diff --git a/utils/prodos-utils/prodos_read.c b/utils/prodos-utils/prodos_read.c index 43b76c3b..f3de8436 100644 --- a/utils/prodos-utils/prodos_read.c +++ b/utils/prodos-utils/prodos_read.c @@ -41,14 +41,14 @@ int prodos_read_block(struct voldir_t *voldir, } } else if (voldir->interleave==PRODOS_INTERLEAVE_DOS33) { - if (debug) printf("Using DOS33 interleave, finding block $%X\n",blocknum); + if (debug) printf("\tUsing DOS33 interleave, finding block $%X\n",blocknum); track=(blocknum>>3); sector1=dos_interleave[(blocknum&0x7)*2]; sector2=dos_interleave[(blocknum&0x7)*2+1]; - if (debug) printf("Remapping block $%X to T%d S%d and T%d S%d\n", + if (debug) printf("\tRemapping block $%X to T%d S%d and T%d S%d\n", blocknum,track,sector1,track,sector2); - if (debug) printf("Seeking to %x\n",((track<<4)+sector1)*256); + if (debug) printf("\tSeeking to %x\n",((track<<4)+sector1)*256); lseek(voldir->fd,voldir->image_offset+ ((track<<4)+sector1)*256,SEEK_SET); result=read(voldir->fd,block,PRODOS_BYTES_PER_BLOCK/2); @@ -59,7 +59,7 @@ int prodos_read_block(struct voldir_t *voldir, return -1; } - if (debug) printf("Seeking to %x\n",((track<<4)+sector2)*256); + if (debug) printf("\tSeeking to %x\n",((track<<4)+sector2)*256); lseek(voldir->fd,voldir->image_offset+ ((track<<4)+sector2)*256,SEEK_SET); result=read(voldir->fd,block+256,PRODOS_BYTES_PER_BLOCK/2); @@ -101,14 +101,14 @@ int prodos_write_block(struct voldir_t *voldir, } } else if (voldir->interleave==PRODOS_INTERLEAVE_DOS33) { - if (debug) printf("Using DOS33 interleave, finding block $%X\n",blocknum); + if (debug) printf("\tUsing DOS33 interleave, finding block $%X\n",blocknum); track=(blocknum>>3); sector1=dos_interleave[(blocknum&0x7)*2]; sector2=dos_interleave[(blocknum&0x7)*2+1]; - if (debug) printf("Remapping block $%X to T%d S%d and T%d S%d\n", + if (debug) printf("\tRemapping block $%X to T%d S%d and T%d S%d\n", blocknum,track,sector1,track,sector2); - if (debug) printf("Seeking to %x\n",((track<<4)+sector1)*256); + if (debug) printf("\tSeeking to %x\n",((track<<4)+sector1)*256); lseek(voldir->fd,voldir->image_offset+ ((track<<4)+sector1)*256,SEEK_SET); result=write(voldir->fd,block,PRODOS_BYTES_PER_BLOCK/2); @@ -119,7 +119,7 @@ int prodos_write_block(struct voldir_t *voldir, return -1; } - if (debug) printf("Seeking to %x\n",((track<<4)+sector2)*256); + if (debug) printf("\tSeeking to %x\n",((track<<4)+sector2)*256); lseek(voldir->fd,voldir->image_offset+ ((track<<4)+sector2)*256,SEEK_SET); result=write(voldir->fd,block+256,PRODOS_BYTES_PER_BLOCK/2); diff --git a/utils/prodos-utils/prodos_volume_bitmap.c b/utils/prodos-utils/prodos_volume_bitmap.c index b171d4b3..7a535e70 100644 --- a/utils/prodos-utils/prodos_volume_bitmap.c +++ b/utils/prodos-utils/prodos_volume_bitmap.c @@ -208,11 +208,15 @@ int prodos_voldir_find_free_block(struct voldir_t *voldir) { for(i=0;i<(512/16);i++) { result=find_first_one(temp_block[i*2]); if (result>=0) { - return (k<<4)+result; + if (debug) printf("Found free block %x\n", + (k<<12)+(i<<4)+result); + return (k<<12)+(i<<4)+result; } result=find_first_one(temp_block[(1+i*2)]); if (result>=0) { - return (k<<4)+result+8; + if (debug) printf("Found free block %x\n", + (k<<12)+(i<<4)+result+8); + return (k<<12)+(i<<4)+result+8; } } }