prodos: strip out some unneeded stuff

This commit is contained in:
Vince Weaver 2021-07-29 22:29:06 -04:00
parent 67814b316d
commit 643aca2973
2 changed files with 86 additions and 260 deletions

View File

@ -13,6 +13,7 @@
static int debug=0,ignore_errors=0;
#if 0
static unsigned char get_high_byte(int value) {
return (value>>8)&0xff;
}
@ -20,6 +21,7 @@ static unsigned char get_high_byte(int value) {
static unsigned char get_low_byte(int value) {
return (value&0xff);
}
#endif
/* Read volume directory into a buffer */
static int prodos_read_voldir(int fd, struct voldir_t *voldir, int interleave) {
@ -80,6 +82,8 @@ static int prodos_check_file_exists(int fd,
char *filename,
int file_deleted) {
#if 0
int catalog_track,catalog_sector;
int i,file_track;
char file_name[31];
@ -87,7 +91,7 @@ static int prodos_check_file_exists(int fd,
struct voldir_t voldir;
unsigned char catalog_buffer[PRODOS_BYTES_PER_BLOCK];
#if 0
/* read the VOLDIR into buffer */
prodos_read_voldir(fd,&voldir,interleave);
@ -144,12 +148,14 @@ repeat_catalog:
static int prodos_free_block(struct voldir_t *voldir,int block) {
#if 0
int result;
/* mark as free using VOLDIR */
result=prodos_voldir_free_block(voldir,block);
#if 0
/* write modified VTOC back out */
lseek(fd,DISK_OFFSET(PRODOS_VOLDIR_TRACK,PRODOS_VOLDIR_BLOCK),SEEK_SET);
result=write(fd,&voldir,PRODOS_BYTES_PER_BLOCK);
@ -164,6 +170,8 @@ static int prodos_free_block(struct voldir_t *voldir,int block) {
static int prodos_allocate_sector(int fd, struct voldir_t *voldir) {
#if 0
int found_track=0,found_sector=0;
int result;
@ -175,7 +183,7 @@ static int prodos_allocate_sector(int fd, struct voldir_t *voldir) {
return -1;
}
#if 0
/* store new track/direction info */
voldir[VTOC_LAST_ALLOC_T]=found_track;
@ -189,8 +197,10 @@ static int prodos_allocate_sector(int fd, struct voldir_t *voldir) {
result=write(fd,voldir,PRODOS_BYTES_PER_BLOCK);
if (result<0) fprintf(stderr,"Error on I/O\n");
#endif
return ((found_track<<8)+found_sector);
#endif
return 0;
}
@ -210,6 +220,7 @@ static int prodos_add_file(struct voldir_t *voldir,
int file_type, int address, int length,
char *filename, char *apple_filename) {
#if 0
int free_space,file_size,needed_sectors;
struct stat file_info;
int size_in_sectors=0;
@ -256,7 +267,7 @@ static int prodos_add_file(struct voldir_t *voldir,
if (length==0) length=file_size;
file_size+=4;
}
#if 0
/* We need to round up to nearest sector size */
/* Add an extra sector for the T/S list */
/* Then add extra sector for a T/S list every 122*256 bytes (~31k) */
@ -481,6 +492,7 @@ got_a_dentry:
/* load a file. fts=entry/track/sector */
static int prodos_load_file(int fd,int fts,char *filename) {
#if 0
int output_fd;
int catalog_file,catalog_track,catalog_sector;
int file_type,file_size=-1,tsl_track,tsl_sector,data_t,data_s;
@ -577,53 +589,19 @@ keep_saving:
}
if (result<0) fprintf(stderr,"Error on I/O\n");
#endif
return 0;
}
/* lock a file. fts=entry/track/sector */
static int prodos_lock_file(int fd,int fts,int lock) {
int catalog_file,catalog_track,catalog_sector;
int file_type,result;
unsigned char sector_buffer[PRODOS_BYTES_PER_BLOCK];
catalog_file=fts>>16;
catalog_track=(fts>>8)&0xff;
catalog_sector=(fts&0xff);
/* Read in Catalog Sector */
lseek(fd,DISK_OFFSET(catalog_track,catalog_sector),SEEK_SET);
result=read(fd,sector_buffer,PRODOS_BYTES_PER_BLOCK);
file_type=sector_buffer[CATALOG_FILE_LIST+
(catalog_file*CATALOG_ENTRY_SIZE)
+FILE_TYPE];
if (lock) file_type|=0x80;
else file_type&=0x7f;
sector_buffer[CATALOG_FILE_LIST+
(catalog_file*CATALOG_ENTRY_SIZE)
+FILE_TYPE]=file_type;
/* write back modified catalog sector */
lseek(fd,DISK_OFFSET(catalog_track,catalog_sector),SEEK_SET);
result=write(fd,sector_buffer,PRODOS_BYTES_PER_BLOCK);
if (result<0) fprintf(stderr,"Error on I/O\n");
return 0;
}
/* rename a file. fts=entry/track/sector */
/* FIXME: can we rename a locked file? */
/* FIXME: validate the new filename is valid */
static int prodos_rename_file(int fd,int fts,char *new_name) {
#if 0
int catalog_file,catalog_track,catalog_sector;
int x,result;
unsigned char sector_buffer[PRODOS_BYTES_PER_BLOCK];
@ -657,56 +635,15 @@ static int prodos_rename_file(int fd,int fts,char *new_name) {
if (result<0) {
fprintf(stderr,"Error on I/O\n");
}
return 0;
}
/* undelete a file. fts=entry/track/sector */
/* FIXME: validate the new filename is valid */
static int prodos_undelete_file(int fd,int fts,char *new_name) {
int catalog_file,catalog_track,catalog_sector;
char replacement_char;
int result;
unsigned char sector_buffer[PRODOS_BYTES_PER_BLOCK];
catalog_file=fts>>16;
catalog_track=(fts>>8)&0xff;
catalog_sector=(fts&0xff);
/* Read in Catalog Sector */
lseek(fd,DISK_OFFSET(catalog_track,catalog_sector),SEEK_SET);
result=read(fd,sector_buffer,PRODOS_BYTES_PER_BLOCK);
/* get the stored track value, and put it back */
/* FIXME: should walk file to see if T/s valild */
/* by setting the track value to FF which indicates deleted file */
sector_buffer[CATALOG_FILE_LIST+(catalog_file*CATALOG_ENTRY_SIZE)]=
sector_buffer[CATALOG_FILE_LIST+
(catalog_file*CATALOG_ENTRY_SIZE)+
FILE_NAME+29];
/* restore file name if possible */
replacement_char=0xa0;
if (strlen(new_name)>29) {
replacement_char=new_name[29]^0x80;
}
sector_buffer[CATALOG_FILE_LIST+(catalog_file*CATALOG_ENTRY_SIZE)+
FILE_NAME+29]=replacement_char;
/* write back modified catalog sector */
lseek(fd,DISK_OFFSET(catalog_track,catalog_sector),SEEK_SET);
result=write(fd,sector_buffer,PRODOS_BYTES_PER_BLOCK);
if (result<0) fprintf(stderr,"Error on I/O\n");
#endif
return 0;
}
static int prodos_delete_file(struct voldir_t *voldir,int fd,int fsl) {
#if 0
int i;
int catalog_track,catalog_sector,catalog_entry;
int ts_track,ts_sector;
@ -719,7 +656,7 @@ static int prodos_delete_file(struct voldir_t *voldir,int fd,int fsl) {
catalog_track=(fsl>>8)&0xff;
catalog_sector=(fsl&0xff);
#if 0
/* Load in the catalog table for the file */
lseek(fd,DISK_OFFSET(catalog_track,catalog_sector),SEEK_SET);
result=read(fd,catalog_buffer,PRODOS_BYTES_PER_BLOCK);
@ -795,29 +732,6 @@ keep_deleting:
return 0;
}
/* ??? */
static int prodos_rename_hello(int fd, char *new_name) {
char buffer[PRODOS_BYTES_PER_BLOCK];
int i;
lseek(fd,DISK_OFFSET(1,9),SEEK_SET);
read(fd,buffer,PRODOS_BYTES_PER_BLOCK);
for(i=0;i<30;i++) {
if (i<strlen(new_name)) {
buffer[0x75+i]=new_name[i]|0x80;
}
else {
buffer[0x75+i]=' '|0x80;
}
}
lseek(fd,DISK_OFFSET(1,9),SEEK_SET);
write(fd,buffer,PRODOS_BYTES_PER_BLOCK);
return 0;
}
static void display_help(char *name, int version_only) {
printf("\nprodos version %s\n",VERSION);
@ -826,28 +740,26 @@ static void display_help(char *name, int version_only) {
if (version_only) return;
printf("Usage: %s [-h] [-y] [-x] disk_image COMMAND [options]\n",name);
printf("Usage: %s [-h] [i interleave] [-y] [-x] disk_image COMMAND [options]\n",name);
printf("\t-h : this help message\n");
printf("\t-y : always answer yes for anying warning questions\n");
printf("\t-i : interleave (prodos or dos33)\n");
printf("\t-y : always answer yes for warning questions\n");
printf("\t-x : ignore errors (useful for making invalid filenames)\n");
printf("\n");
printf(" Where disk_image is a valid dos3.3 disk image\n"
printf(" Where disk_image is a valid PRODOS disk image\n"
" and COMMAND is one of the following:\n");
printf("\tCATALOG\n");
printf("\tLOAD apple_file <local_file>\n");
printf("\tSAVE type local_file <apple_file>\n");
printf("\tBSAVE [-a addr] [-l len] local_file <apple_file>\n");
printf("\tDELETE apple_file\n");
printf("\tLOCK apple_file\n");
printf("\tUNLOCK apple_file\n");
printf("\tRENAME apple_file_old apple_file_new\n");
printf("\tUNDELETE apple_file\n");
printf("\tCATALOG [dir]\n");
printf("\tLOAD apple_file <local_file>\n");
printf("\tSAVE type local_file <apple_file>\n");
printf("\tBSAVE [-a addr] [-l len] local_file <apple_file>\n");
printf("\tDELETE apple_file\n");
printf("\tRENAME apple_file_old apple_file_new\n");
printf("\tDUMP\n");
printf("\tHELLO apple_file\n");
#if 0
printf("\tINIT\n");
printf("\tCOPY\n");
#endif
printf("\tTYPE TODO: set type\n");
printf("\tAUX TODO: set aux\n");
printf("\tTIMESTAMP TODO: set timestamp\n");
printf("\tACCESS TODO: set access\n");
printf("\n");
return;
}
@ -856,20 +768,13 @@ static void display_help(char *name, int version_only) {
#define COMMAND_SAVE 1
#define COMMAND_CATALOG 2
#define COMMAND_DELETE 3
#define COMMAND_UNDELETE 4
#define COMMAND_LOCK 5
#define COMMAND_UNLOCK 6
#define COMMAND_INIT 7
#define COMMAND_RENAME 8
#define COMMAND_COPY 9
#define COMMAND_DUMP 10
#define COMMAND_HELLO 11
#define COMMAND_BSAVE 12
#define COMMAND_BLOAD 13
#define COMMAND_SHOWFREE 14
#define COMMAND_RAW_WRITE 15
#define COMMAND_RENAME 4
#define COMMAND_DUMP 5
#define COMMAND_BSAVE 6
#define COMMAND_BLOAD 7
#define COMMAND_SHOWFREE 8
#define MAX_COMMAND 15
#define MAX_COMMAND 9
#define COMMAND_UNKNOWN 255
static struct command_type {
@ -880,17 +785,11 @@ static struct command_type {
{COMMAND_SAVE,"SAVE"},
{COMMAND_CATALOG,"CATALOG"},
{COMMAND_DELETE,"DELETE"},
{COMMAND_UNDELETE,"UNDELETE"},
{COMMAND_LOCK,"LOCK"},
{COMMAND_UNLOCK,"UNLOCK"},
{COMMAND_INIT,"INIT"},
{COMMAND_RENAME,"RENAME"},
{COMMAND_COPY,"COPY"},
{COMMAND_DUMP,"DUMP"},
{COMMAND_HELLO,"HELLO"},
{COMMAND_BSAVE,"BSAVE"},
{COMMAND_BLOAD,"BLOAD"},
{COMMAND_SHOWFREE,"SHOWFREE"},
{COMMAND_RAW_WRITE,"RAWWRITE"},
};
static int lookup_command(char *name) {
@ -912,12 +811,12 @@ static int truncate_filename(char *out, char *in) {
int truncated=0;
/* Truncate filename if too long */
if (strlen(in)>30) {
fprintf(stderr,"Warning! Truncating %s to 30 chars\n",in);
if (strlen(in)>15) {
fprintf(stderr,"Warning! Truncating %s to 15 chars\n",in);
truncated=1;
}
strncpy(out,in,30);
out[30]='\0';
strncpy(out,in,15);
out[15]='\0';
return truncated;
}
@ -926,8 +825,8 @@ int main(int argc, char **argv) {
char image[BUFSIZ];
unsigned char type='b';
int dos_fd=0,i;
int interleave=PRODOS_INTERLEAVE_PRODOS;
int prodos_fd=0,i;
int interleave=PRODOS_INTERLEAVE_PRODOS,arg_interleave=0;
int command,catalog_entry;
char temp_string[BUFSIZ];
@ -941,7 +840,7 @@ int main(int argc, char **argv) {
struct voldir_t voldir;
/* Check command line arguments */
while ((c = getopt (argc, argv,"a:l:t:s:dhvxy"))!=-1) {
while ((c = getopt (argc, argv,"a:i:l:t:s:dhvxy"))!=-1) {
switch (c) {
case 'd':
@ -952,6 +851,15 @@ int main(int argc, char **argv) {
address=strtol(optarg,&endptr,0);
if (debug) fprintf(stderr,"Address=%d\n",address);
break;
case 'i':
if (!strncmp(optarg,"prodos",6)) {
arg_interleave=1;
}
if (!strncmp(optarg,"dos33",5)) {
arg_interleave=2;
}
if (debug) fprintf(stderr,"Interleave=%d\n",arg_interleave);
break;
case 'l':
length=strtol(optarg,&endptr,0);
if (debug) fprintf(stderr,"Length=%d\n",address);
@ -977,8 +885,8 @@ int main(int argc, char **argv) {
/* get argument 1, which is image name */
strncpy(image,argv[optind],BUFSIZ-1);
dos_fd=open(image,O_RDWR);
if (dos_fd<0) {
prodos_fd=open(image,O_RDWR);
if (prodos_fd<0) {
fprintf(stderr,"Error opening disk_image: %s\n",image);
return -1;
}
@ -987,14 +895,19 @@ int main(int argc, char **argv) {
printf("checking extension: %s\n",&image[strlen(image)-4]);
}
/* Try to autodetch interleave based on filename */
if (strlen(image)>4) {
if (!strncmp(&image[strlen(image)-4],".dsk",4)) {
if (debug) printf("Detected DOS33\n");
interleave=PRODOS_INTERLEAVE_DOS33;
}
}
/* override inteleave if set */
if (arg_interleave) {
interleave=arg_interleave-1;
}
prodos_read_voldir(dos_fd,&voldir,interleave);
prodos_read_voldir(prodos_fd,&voldir,interleave);
/* Move to next argument */
optind++;
@ -1057,7 +970,7 @@ int main(int argc, char **argv) {
/* get the entry/track/sector for file */
catalog_entry=prodos_check_file_exists(dos_fd,
catalog_entry=prodos_check_file_exists(prodos_fd,
apple_filename,
DOS33_FILE_NORMAL);
if (catalog_entry<0) {
@ -1066,13 +979,13 @@ int main(int argc, char **argv) {
goto exit_and_close;
}
prodos_load_file(dos_fd,catalog_entry,local_filename);
prodos_load_file(prodos_fd,catalog_entry,local_filename);
break;
case COMMAND_CATALOG:
prodos_catalog(dos_fd,&voldir);
prodos_catalog(prodos_fd,&voldir);
break;
@ -1095,7 +1008,7 @@ int main(int argc, char **argv) {
case COMMAND_BSAVE:
if (debug) printf("\ttype=%c\n",type);
#if 0
//#if 0
if (argc==optind) {
fprintf(stderr,"Error! Need file_name\n");
@ -1143,7 +1056,7 @@ int main(int argc, char **argv) {
if (debug) printf("\tApple filename: %s\n",apple_filename);
catalog_entry=prodos_check_file_exists(dos_fd,apple_filename,
catalog_entry=prodos_check_file_exists(prodos_fd,apple_filename,
DOS33_FILE_NORMAL);
if (catalog_entry>=0) {
@ -1157,29 +1070,22 @@ int main(int argc, char **argv) {
}
}
fprintf(stderr,"Deleting previous version...\n");
prodos_delete_file(voldir,dos_fd,catalog_entry);
prodos_delete_file(&voldir,prodos_fd,catalog_entry);
}
if (command==COMMAND_SAVE) {
prodos_add_file(&voldir,dos_fd,type,
prodos_add_file(&voldir,prodos_fd,type,
ADD_RAW, address, length,
local_filename,apple_filename);
}
else {
prodos_add_file(&voldir,dos_fd,type,
prodos_add_file(&voldir,prodos_fd,type,
ADD_BINARY, address, length,
local_filename,apple_filename);
}
#endif
//#endif
break;
case COMMAND_RAW_WRITE:
fprintf(stderr,"ERROR! Not implemented!\n\n");
goto exit_and_close;
break;
case COMMAND_DELETE:
if (argc==optind) {
@ -1191,7 +1097,7 @@ int main(int argc, char **argv) {
truncate_filename(apple_filename,argv[optind]);
catalog_entry=prodos_check_file_exists(dos_fd,
catalog_entry=prodos_check_file_exists(prodos_fd,
apple_filename,
DOS33_FILE_NORMAL);
if (catalog_entry<0) {
@ -1199,44 +1105,18 @@ int main(int argc, char **argv) {
apple_filename);
goto exit_and_close;
}
prodos_delete_file(&voldir,dos_fd,catalog_entry);
prodos_delete_file(&voldir,prodos_fd,catalog_entry);
break;
case COMMAND_DUMP:
printf("Dumping %s!\n",image);
prodos_dump(&voldir,dos_fd);
prodos_dump(&voldir,prodos_fd);
break;
case COMMAND_SHOWFREE:
printf("Showing Free %s!\n",image);
prodos_showfree(&voldir,dos_fd);
break;
case COMMAND_LOCK:
case COMMAND_UNLOCK:
/* check and make sure we have apple_filename */
if (argc==optind) {
fprintf(stderr,"Error! Need apple file_name\n");
fprintf(stderr,"%s %s %s apple_filename\n",
argv[0],image,temp_string);
goto exit_and_close;
}
truncate_filename(apple_filename,argv[optind]);
/* get the entry/track/sector for file */
catalog_entry=prodos_check_file_exists(dos_fd,
apple_filename,
DOS33_FILE_NORMAL);
if (catalog_entry<0) {
fprintf(stderr,"Error! %s not found!\n",
apple_filename);
goto exit_and_close;
}
prodos_lock_file(dos_fd,catalog_entry,command==COMMAND_LOCK);
prodos_showfree(&voldir,prodos_fd);
break;
case COMMAND_RENAME:
@ -1264,7 +1144,7 @@ int main(int argc, char **argv) {
truncate_filename(new_filename,argv[optind]);
/* get the entry/track/sector for file */
catalog_entry=prodos_check_file_exists(dos_fd,
catalog_entry=prodos_check_file_exists(prodos_fd,
apple_filename,
DOS33_FILE_NORMAL);
if (catalog_entry<0) {
@ -1273,71 +1153,17 @@ int main(int argc, char **argv) {
goto exit_and_close;
}
prodos_rename_file(dos_fd,catalog_entry,new_filename);
prodos_rename_file(prodos_fd,catalog_entry,new_filename);
break;
case COMMAND_UNDELETE:
/* check and make sure we have apple_filename */
if (argc==optind) {
fprintf(stderr,"Error! Need apple file_name\n");
fprintf(stderr,"%s %s UNDELETE apple_filename\n\n",
argv[0],image);
goto exit_and_close;
}
/* Truncate filename if too long */
/* what to do about last char ? */
truncate_filename(apple_filename,argv[optind]);
/* get the entry/track/sector for file */
catalog_entry=prodos_check_file_exists(dos_fd,
apple_filename,
DOS33_FILE_DELETED);
if (catalog_entry<0) {
fprintf(stderr,"Error! %s not found!\n",
apple_filename);
goto exit_and_close;
}
prodos_undelete_file(dos_fd,catalog_entry,apple_filename);
break;
case COMMAND_HELLO:
if (argc==optind) {
fprintf(stderr,"Error! Need file_name\n");
fprintf(stderr,"%s %s HELLO apple_filename\n\n",
argv[0],image);
goto exit_and_close;
}
truncate_filename(apple_filename,argv[optind]);
catalog_entry=prodos_check_file_exists(dos_fd,
apple_filename,
DOS33_FILE_NORMAL);
if (catalog_entry<0) {
fprintf(stderr,
"Warning! File %s does not exist\n",
apple_filename);
}
prodos_rename_hello(dos_fd,apple_filename);
break;
case COMMAND_INIT:
/* use common code from mkprodosfs? */
case COMMAND_COPY:
/* use temp file? Walking a sector at a time seems a pain */
default:
fprintf(stderr,"Sorry, unsupported command %s\n\n",temp_string);
goto exit_and_close;
}
exit_and_close:
close(dos_fd);
close(prodos_fd);
return 0;
}

View File

@ -5,7 +5,7 @@
#include "prodos.h"
static int debug=0;
//static int debug=0;
/* returns the next valid catalog entry */