jrb@wdl1.UUCP (John R Blaker) (02/17/84)
/*==========================================================================* * == E X T R A C T == * *==========================================================================* * John R Blaker -- Ford Aerospace & Communications Corporation -- Oct 1982 * *==========================================================================* * This implements the 'extract' function. This file contains the * * following functions: * * extract() Extracts files from the disc * * copy() Does the actual work * *==========================================================================* */ /* * Include files */ #include "rt11.h" /* Global definitions */ /* * extract() * This function extracts files from disc. There are two * cases: * 1. No files were specified on the command line * 2. One or more files were specified on the command line * In case 1 it is assumed that all files are to be extracted. In case * 2 only the specified files will be extracted. */ extract() { MEM_DIR *curpos; /* Current entry in directory */ int output; /* File descriptor for output */ int index; /* Loop index */ verbose("EXTRACTING FILES"); trace("Got to extract()"); if (TRACE) printf("TRACE: COUNT = %d\n", COUNT); if (COUNT == 0) { /* Case 1 */ curpos = dir_header; while (curpos != NULL) { output = creat(curpos -> md_name, 0644); close(output); output = open(curpos -> md_name, IO_WT); if (output < 0) { error("Can't open file"); unlock("/tmp/disc_lock"); exit(1); } else { if (VERBOSE) printf("extracting %s\n", curpos -> md_name); copy(curpos, output); } /* if...else */ close(output); curpos = curpos -> md_next; } /* while */ } else { /* Case 2 */ for (index = 0; index < COUNT; index++) { curpos = findentry(FILES[index]); if (curpos != NULL) { output = creat(curpos -> md_name, 0644); close(output); output = open(curpos -> md_name, IO_WT); if (output < 0) { error("Can't open file"); unlock("/tmp/disc_lock"); exit(1); } else { if (VERBOSE) printf("extracting %s\n", curpos -> md_name); copy(curpos, output); } /* if...else */ close(output); } /* if */ } /* for */ } /* if...else */ } /* extract */ /* * copy() * Copy file from floppy to UNIX */ copy(entry, output) MEM_DIR *entry; /* Directory entry */ int output; /* File descriptor for output file */ { unsigned blockno; /* Current block number */ unsigned size; /* Size of file in blocks */ int index; /* Loop index */ char info[BLOCKSIZE]; /* Info from floppy */ trace("Got to copy()"); blockno = entry -> md_addr; size = ((entry -> md_size) / BLOCKSIZE); if (TRACE) printf("TRACE: blockno = %u\tsize = %u\n", blockno, size); for (index = 0; index < size; index++) { getblock(blockno, info); write(output, info, BLOCKSIZE); blockno += BLOCKSIZE; } /* for */ } /* copy */