/* (bbcim) cat-extract.c: toon catalogus van bestanden etc in diskbeeld (DFS/ADFS). * Copyright (C) W.H.Scholten 1996,1997 * */ /* Show catalogue & extract files & calc CRC's (Acorn DFS)*/ /* int disk_cat_extract_crc(char *disk, int args, char *arglist[], struct diskimage *image, int flags) { */ int disk_cat_extract_crc(struct diskimage *image, int args, char *arglist[], struct bbcfile *beeb_file, int flags) { FILE *fpdisk, *fpcat, *fpextract, *fpinfo; char /*disk[50],*/ catalogus[50], extract[50], info_naam[50], basisnaam[50]; char bbcdisk_naam[15], bbcfile_naam[15]; char unix_bbcfile_naam[15]; char testnaam[15]; char *disk; unsigned char filebyte,H; long filesizesum=0; int extr_list=0; /* list of files given ? */ int i, rfiles, bootoption, antwoord, k; unsigned char files=0; unsigned int sectorsondisk; long file; int locked; unsigned char eellddss; long startsector; unsigned long loadaddress, execaddress, length; unsigned int crc; /* FOR ADFS */ char string[100]; #define NUM_FREESPACE_ENTRIES 82 #define ADFS_BOOTOPTION (256+253) #define DIRECTORY_SIZE 1280 byte dir_entry[DIRECTORY_SIZE]; byte buf[512]; long freespace_entries; char fullpath[100]; char *path; int path_index; char dirname[100]; long dir_sector; int status; int extr_list_no; byte accessR, accessW, accessL, accessDIR, attributeE; /* Internal use only (ADFS): */ #define FIND_DIR 1 #define NEXT_DIR 2 #define DIR_FOUND 3 #ifdef UNIX_MKDIR mode_t dir_mode; #endif #if defined(MAC_MKDIR) || defined(SYSTEM_MKDIR) char actie[60]; #endif static long find_file_infoaddr; /* for GET_ATTRIBUTES */ if (flags & NEW_DISK) { find_file_infoaddr=-1; return 0; } bbcim_errno=0; disk = image->filename; if (flags & EXTRACT_FILES) flags |=SHOW_FILES; if (image->type==DFS_DISK) { /* -- DFS diskbeelden -- */ /* disk d.f -> * -ed disk/d.f * -ed# disk/df * -e# disk.df * -e disk.d.f * -es d.f * -es# df */ if (diskimage_sanitycheck(image, flags & VERBOSE)) return bbcim_errno; strcpy(basisnaam, disk); basisnaam[strcspn(disk,".")]=0; strcpy(catalogus, basisnaam); strcat(catalogus,".cat"); fpdisk=fopen(disk,"rb"); if (flags & EXTRACT_DIR) { rename_sequential(basisnaam); /* in case a file (dir too?) already exists named basis_naam */ #ifdef MAC_MKDIR strcpy(actie, ":"); /*MIGHT NEED TO BE "volume:" where volume is ? */ strcat(actie, basisnaam); mkdir(actie,0); #endif #ifdef UNIX_MKDIR dir_mode=0777; /* CHANGE */ mkdir(basisnaam, dir_mode); #endif #ifdef SYSTEM_MKDIR sprintf(actie, "mkdir %s", basisnaam); system(actie); #endif } /* DISKNAAM BEPALEN (voor cat, crc, extract) */ fseek(fpdisk,0L,SEEK_SET); for (i=0; i<8; i++) { fread (&filebyte,1,1,fpdisk); bbcdisk_naam[i]=filebyte; if (filebyte==0) break; } fseek(fpdisk,256L,SEEK_SET); for (i=0; i<4; i++) { fread (&filebyte,1,1,fpdisk); bbcdisk_naam[i+8]=filebyte; if (filebyte==0) break; } fseek(fpdisk,256+5L,SEEK_SET); fread(&files,1,1,fpdisk); rfiles=files/8; extr_list=((flags & EXTRACT_FILES) && (args>0)); fread(&filebyte,1,1,fpdisk); bootoption=filebyte >> 4; H=filebyte & 3; fread(&filebyte,1,1,fpdisk); sectorsondisk=filebyte+H*256L; if ((flags & EXTRACT_FILES) && !extr_list) fpcat=fopen(catalogus,"w"); else fpcat=stdout; /* if (flags & SHOW_FILES) goto skip_diskinfo;*/ #ifdef NL fprintf(fpcat,"\nDiskette :%s",bbcdisk_naam); if (strlen(bbcdisk_naam)==0) fprintf(fpcat, "(geen naam)"); fprintf(fpcat,"\n%d sectoren op de diskette\n",sectorsondisk); #else fprintf(fpcat,"\nDisk :%s",bbcdisk_naam); if (strlen(bbcdisk_naam)==0) fprintf(fpcat, "(no name)"); fprintf(fpcat,"\n%d sectors on disk\n",sectorsondisk); #endif #ifdef NL fprintf(fpcat, "bootoptie: "); #else fprintf(fpcat, "bootoption: "); #endif switch(bootoption) { case 0 : #ifdef NL fprintf(fpcat, "geen"); #else fprintf(fpcat, "none"); #endif break; case 1 : fprintf(fpcat, "*LOAD !BOOT");break; case 2 : fprintf(fpcat, "*RUN !BOOT");break; case 3 : fprintf(fpcat, "*EXEC !BOOT"); } fprintf(fpcat,"\n"); #ifdef NL fprintf(fpcat, "Bestand Laad Start Lengte Toegang startsector\n"); #else fprintf(fpcat, "File Load Exec Length Access startsector\n"); #endif skip_diskinfo: /*Hoofdlus: alle bestanden opzoeken*/ if (files>0) { extr_list_no=0; for(file=0;file>7; bbcfile_naam[0]=(filebyte & 0x7F); bbcfile_naam[1]='.'; fseek(fpdisk,file+8L,SEEK_SET); fread(bbcfile_naam+2,1,7,fpdisk); bbcfile_naam[9]=0; /* spaties aan het einde van bbc naam weghalen: geeft anders bestands namen met spaties (in linux). */ for (i=8;i>0 && (bbcfile_naam[i]==' '); i--); bbcfile_naam[i+1]=0; /* IF FILE LIST GIVEN, SEE IF NAME IS IN DISKIMAGE */ if (extr_list) { int found=0; for (i=0; ifind_file_infoaddr) { /* new file found */ strcpy(beeb_file->naam, bbcfile_naam); beeb_file->loadaddr=loadaddress; beeb_file->execaddr=execaddress; beeb_file->length=length; beeb_file->attributes=locked; return 0; } } if (flags & LOAD_FILE) { fseek(fpdisk, startsector*256, SEEK_SET); fread(beeb_file->data, length, 1, fpdisk); return 0; } /* UITVOER VAN DEZE GEGEVENS NAAR CATALOGUS */ if (flags & SHOW_FILES) { fprintf(fpcat,"%-9s %6lX %6lX %6lX", bbcfile_naam, loadaddress, execaddress, length); if (locked) fprintf(fpcat," Locked"); else fprintf(fpcat," "); /*VOOR CRC UITLIJNEN*/ } strcpy(unix_bbcfile_naam, bbcfile_naam); replace_bad_chars(unix_bbcfile_naam); if (!(flags & BBC_DIR)) { reduceer_unix_naam(extract+strlen(extract), unix_bbcfile_naam); } else strcat(extract, unix_bbcfile_naam); if (flags & EXTRACT_FILES) { /* NAME CHECK: does it already exist? */ char nieuwe_naam[55]; strcpy(nieuwe_naam, extract); if ((fpextract=fopen(extract, "rb"))!=NULL) { fclose(fpextract); antwoord=overschrijf_vraag(extract, nieuwe_naam); switch(antwoord) { case OVERSCHRIJVEN: break; case HERNOEM_NIEUW: strcpy(extract, nieuwe_naam); break; case HERNOEM_BESTAAND: rename(extract, nieuwe_naam); /* altijd ook info bestand hernoemen: */ strcpy(info_naam, extract); strcat(info_naam, ".inf"); strcat(nieuwe_naam, ".inf"); rename(info_naam, nieuwe_naam); break; case SLA_OVER: continue; /*to for*/ } /*switch */ } /* END NAME CHECK */ fpextract=fopen(extract, "wb"); fseek(fpdisk,startsector*256, SEEK_SET); for (i=0; i * -ed disk/a/b/f * -ed# disk/f * -e# disk.f * -e disk.a.b.f * -es a.b.f * -es# f */ #define NUM_FREESPACE_ENTRIES 82 #define ADFS_BOOTOPTION (256+253) #define DIRECTORY_SIZE 1280 /* Internal use only: */ #define FIND_DIR 1 #define NEXT_DIR 2 #define DIR_FOUND 3 /* int disk_adfscat_extract_crc(char *disk, int args, char *arglist[], struct diskimage *image, int flags) { */ #if 0 FILE *fpdisk, *fpcat, *fpextract, *fpinfo; byte filebyte; char string[100], bbcfile_naam[100], testnaam[100], unix_bbcfile_naam[100]; char catalogus[100], info_naam[100]; byte dir_entry[DIRECTORY_SIZE]; byte buf[512]; char extract[200], basisnaam[200]; int i,k; long sector, sectorsondisk, freespace; long freespace_entries; char path[100]; int path_index; char dirname[100]; long dir_sector; int status; unsigned long loadaddress, execaddress, length, startsector; byte accessR, accessW, accessL, accessDIR, attributeE; int extr_list=0; int extr_list_no, antwoord; long filesizesum=0; unsigned int crc; int file; int bootoption; #ifdef UNIX_MKDIR mode_t dir_mode; #endif #if defined(MAC_MKDIR) || defined(SYSTEM_MKDIR) char actie[60]; #endif #endif if (diskimage_sanitycheck(image, 1)) return bbcim_errno; extr_list=((flags & EXTRACT_FILES) && (args>1)); /* if ((flags & EXTRACT_FILES) && !extr_list) fpcat=fopen(catalogus,"w"); else fpcat=stdout; */ /* wordt in extr lus gedaan */ /* printf("extr_list %d\n", extr_list); */ /* printf("args=%d\n", args); */ if (args<1) fullpath[0]=0; else { strcpy(fullpath, arglist[0]); } /* printf("arglist[0]=%s\n", arglist[0]); */ /*------------- FREE SPACE ------------------*/ fpdisk=fopen(disk,"rb"); fseek(fpdisk,0L,SEEK_SET); if (fread(buf, 512,1, fpdisk)<1) { #ifdef NL printf("ADFS sector 0&1 lezen mislukt\n"); #else printf("Failed to read ADFS sector 0\n"); #endif return BBC_DISK_TRUNCATED; } #if 0 /* -- ADFS Freespace not used in cat,extr,crc -- */ freespace_entries=buf[256+254]/3; printf("freespace entries %d\n", (int) freespace_entries); for (i=0; i=strlen(path)) { strcpy(dirname,path+path_index); path_index=strlen(path); } if (strlen(dirname)==0) { status=DIR_FOUND; } /* printf("dirname=%s\n", dirname); */ /* ROOT DIR =sec 2-6 track 0 */ fseek(fpdisk,256L*dir_sector,SEEK_SET); if (fread(dir_entry, 1280,1, fpdisk)<1) { #ifdef NL printf("ADFS dir lezen mislukt\n"); #else printf("Failed to read ADFS dir\n"); #endif exit(0); } memcpy(string, dir_entry+1, 4); string[4]=0; printf("fixed root string = %s\n", string); /* =Hugo*/ if (status == DIR_FOUND) { strcpy(basisnaam, disk); basisnaam[strcspn(disk,".")]=0; /* disk a/b/f -> * -ed disk/a/b/f disk/a/b.cat * -ed# disk/f disk.cat * -e# disk.f disk.cat * -e disk.a.b.f disk.a.b.cat * -es a.b.f a.b.cat * -es# f cat */ #if 0 if (!(flags & SHORT_NAME)) { strcat(basisnaam, "/"); } else basisnaam[0]=0; if (flags & BBC_DIR) strcat(basisnaam, path); #else if (flags & SHORT_NAME) basisnaam[0]=0; if (flags & BBC_DIR) { if (!(flags & SHORT_NAME)) strcat(basisnaam, "/"); strcat(basisnaam, path); } #endif /* printf("basisnaam=%s\n", basisnaam); */ if (flags & EXTRACT_DIR) { /* rename_sequential(basisnaam);*/ /* in case a file (dir too?) already exists named basis_naam */ for (i=0; i<=strlen(basisnaam); i++) {printf("i=%d\n",i); if (basisnaam[i]=='/' || i==strlen(basisnaam)) { char temp[256]; strcpy(temp, basisnaam); temp[i]=0; /* printf("temp=%s\n", temp); */ #ifdef MAC_MKDIR strcpy(actie, ":"); /*MIGHT NEED TO BE "volume:" where volume is ? */ strcat(actie, /*basisnaam*/temp); mkdir(actie,0); #endif #ifdef UNIX_MKDIR dir_mode=0777; /* CHANGE */ mkdir(/*basisnaam*/temp, dir_mode); #endif #ifdef SYSTEM_MKDIR sprintf(actie, "mkdir %s", /*basisnaam*/temp); system(actie); #endif } } } else { for (i=0; i>7; accessW=dir_entry[6+file*26]>>7; accessL=dir_entry[7+file*26]>>7; accessDIR=dir_entry[8+file*26]>>7; attributeE=dir_entry[9+file*26]>>7; loadaddress=read4lsb(dir_entry+15+file*26); execaddress=read4lsb(dir_entry+19+file*26); length=read4lsb(dir_entry+23+file*26); startsector=read3lsb(dir_entry+27+file*26); if (status == DIR_FOUND) { /* UITVOER VAN DE GEGEVENS NAAR CATALOGUS */ if (flags & SHOW_FILES) { #if 0 fprintf(fpcat,"%-9s %6lX %6lX %6lX", bbcfile_naam, loadaddress, execaddress, length); if (locked) fprintf(fpcat," Locked"); else fprintf(fpcat," "); /*VOOR CRC UITLIJNEN*/ #else fprintf(fpcat, " %s %-12s %8lX %8lX %6lX", accessDIR ? "DIR: " : " ", string, loadaddress, execaddress, length); fprintf(fpcat, " %s %s %s %s %s", accessR ? "R" : "-", accessW ? "W" : "-", accessL ? "L" : "-", accessDIR ? "D" : "-", attributeE ? "E" : "-"); #endif } strcpy(unix_bbcfile_naam, bbcfile_naam); replace_bad_chars(unix_bbcfile_naam); /* if (!(flags & BBC_DIR)) { reduceer_unix_naam(extract+strlen(extract), unix_bbcfile_naam); } else*/ strcat(extract, unix_bbcfile_naam); filesizesum +=length; if ((flags & EXTRACT_FILES) && !accessDIR) { /* extract files */ /* NAME CHECK: does it already exist? */ char nieuwe_naam[55]; FILE *fpextract; strcpy(nieuwe_naam, extract); if ((fpextract=fopen(extract, "rb"))!=NULL) { fclose(fpextract); antwoord=overschrijf_vraag(extract, nieuwe_naam); switch(antwoord) { case OVERSCHRIJVEN: break; case HERNOEM_NIEUW: strcpy(extract, nieuwe_naam); break; case HERNOEM_BESTAAND: rename(extract, nieuwe_naam); /* altijd ook info bestand hernoemen: */ strcpy(info_naam, extract); strcat(info_naam, ".inf"); strcat(nieuwe_naam, ".inf"); rename(info_naam, nieuwe_naam); break; case SLA_OVER: continue; /*to for*/ } /*switch */ } /* END NAME CHECK */ fpextract=fopen(extract, "wb"); fseek(fpdisk,startsector*256, SEEK_SET); for (i=0; i