diff --git a/utils/dos33fs-utils/dos33.c b/utils/dos33fs-utils/dos33.c index dc270207..1c9f403e 100644 --- a/utils/dos33fs-utils/dos33.c +++ b/utils/dos33fs-utils/dos33.c @@ -36,7 +36,7 @@ static int dos33_read_vtoc(int fd, unsigned char *vtoc) { /* read in VTOC */ result=read(fd,vtoc,BYTES_PER_SECTOR); - if (result<0) { + if (result>8)&0xff,ts_list&0xff),SEEK_SET); result=write(fd,ts_buffer,BYTES_PER_SECTOR); + if (result>8)&0xff; data_buffer[2]=(length)&0xff; data_buffer[3]=((length)>>8)&0xff; - bytes_read=read(input_fd,data_buffer+4, + result=read(input_fd,data_buffer+4, BYTES_PER_SECTOR-4); - bytes_read+=4; + bytes_read=result+4; } else { - bytes_read=read(input_fd,data_buffer, + result=read(input_fd,data_buffer, BYTES_PER_SECTOR); + bytes_read=result; } - first_write=0; - if (bytes_read<0) fprintf(stderr,"Error reading bytes!\n"); + /* Note, we might not read a full sector worth */ + /* if the file is smaller */ + if (result<0) { + fprintf(stderr,"Error reading input file!\n"); + return -ERROR_FILE_READ; + } + + first_write=0; /* write to disk image */ lseek(fd,DISK_OFFSET((data_ts>>8)&0xff,data_ts&0xff),SEEK_SET); result=write(fd,data_buffer,BYTES_PER_SECTOR); + if (result>8)&0xff,data_ts&0xff); } @@ -357,6 +380,9 @@ static int dos33_add_file(unsigned char *vtoc, /* read in t/s list */ lseek(fd,DISK_OFFSET((ts_list>>8)&0xff,ts_list&0xff),SEEK_SET); result=read(fd,ts_buffer,BYTES_PER_SECTOR); + if (result>8)&0xff; @@ -365,6 +391,9 @@ static int dos33_add_file(unsigned char *vtoc, /* write t/s list back out */ lseek(fd,DISK_OFFSET((ts_list>>8)&0xff,ts_list&0xff),SEEK_SET); result=write(fd,ts_buffer,BYTES_PER_SECTOR); + if (result0x7f) { printf("*"); @@ -183,14 +187,13 @@ static int dos33_print_file_info(int fd,int catalog_tsf) { printf("\n"); - if (result<0) fprintf(stderr,"Error on I/O\n"); - return 0; } -void dos33_catalog(int dos_fd, unsigned char *vtoc) { +int dos33_catalog(int dos_fd, unsigned char *vtoc) { int catalog_entry; + int result; /* get first catalog */ catalog_entry=dos33_get_catalog_ts(vtoc); @@ -200,11 +203,15 @@ void dos33_catalog(int dos_fd, unsigned char *vtoc) { catalog_entry=dos33_find_next_file(dos_fd,catalog_entry,vtoc); if (debug) fprintf(stderr,"CATALOG entry=$%X\n",catalog_entry); if (catalog_entry>0) { - dos33_print_file_info(dos_fd,catalog_entry); + result=dos33_print_file_info(dos_fd,catalog_entry); + if (result<0) return result; + /* why 1<<16 ? */ catalog_entry+=(1<<16); /* dos33_find_next_file() handles wrapping issues */ } } printf("\n"); + + return 0; }