prodos: fix bug when findind free block

meant that SAVE was not working quite right

also added a bunch of debugging messages
This commit is contained in:
Vince Weaver 2021-08-05 14:00:46 -04:00
parent 628513d1c1
commit 62f80a60fc
4 changed files with 50 additions and 19 deletions

View File

@ -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,
file<voldir->entries_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,

View File

@ -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);

View File

@ -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);

View File

@ -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;
}
}
}