Changeset 5
- Timestamp:
- 10/28/07 15:12:27 (10 months ago)
- Files:
-
- tarfs/tarfs.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
tarfs/tarfs.c
r4 r5 26 26 char file_name[NAME_SIZE]; 27 27 28 intblock_offset;29 int block_length; 30 31 int file_length;28 unsigned long block_offset; 29 30 int block_length; 31 int file_length; 32 32 33 33 bool special; // if . or .. 34 34 }; 35 35 36 inode *read_file(FILE *file, inode *file_tree, char *file_path){ 37 char buffer[BLOCK_SIZE]; 38 char *result; 39 char delims[]="/\n"; 40 inode *i=file_tree, *node; 41 int size; 42 43 44 /* Traverse the file tree */ 45 result=strtok(file_path, delims); 46 while( result != NULL ){ 47 while(i){ 48 if(!strcmp(result, i->file_name)){ 49 if(i->subdir){ 50 i=i->subdir; 51 break; 52 } 53 else{ 54 node=i; 55 goto print; 56 } 57 } 58 i=i->next; 59 } 60 result=strtok(NULL, delims); 61 } 62 63 return NULL; 64 65 print: 66 /* Print out the file */ 67 size=node->file_length; 68 fseek(file, node->block_offset, SEEK_SET); 69 for(; size > BLOCK_SIZE; size -=BLOCK_SIZE){ 70 fread(buffer, sizeof(char), BLOCK_SIZE, file); 71 fwrite(buffer, sizeof(char), BLOCK_SIZE, stdout); 72 } 73 74 fread(buffer, sizeof(char), size, file); 75 fwrite(buffer, sizeof(char), size, stdout); 76 77 fflush(file); 78 fflush(stdout); 79 return node; 80 } 81 36 82 inode *create_file_tree(FILE *file){ 37 83 char buffer[BLOCK_SIZE]; 38 char *result , *last_result;84 char *result; 39 85 char delims[]="/"; 40 86 posix_header header; 41 42 87 inode *file_tree, *i, *last_i, *new; 43 88 89 /* Create a root directory of the tree */ 44 90 new=file_tree=malloc(sizeof(inode)); 45 46 91 file_tree->special=true; 47 92 file_tree->file_name[0]='.'; … … 54 99 memcpy(&header, buffer, HEADER_SIZE); 55 100 56 101 /* Check that the header is valid */ 57 102 if(!memcmp(header.magic,"\0\0\0\0\0",5)) break; 58 103 … … 78 123 if(!i){ 79 124 last_i->next=new; 125 break; 80 126 } 81 last_result=result;82 127 result=strtok(NULL, delims); 83 128 } 129 84 130 /* Add inode attributes */ 85 memcpy(new->file_name, last_result, NAME_SIZE);131 memcpy(new->file_name, result, NAME_SIZE); 86 132 87 133 switch(header.typeflag){ … … 102 148 } 103 149 104 150 /* Read in the file's data */ 105 151 sscanf(header.size,"%o",&new->file_length); 106 152 new->block_length=(new->file_length + 511 ) & ~511; 107 153 new->next=NULL; 108 154 new->block_offset=ftell(file); 155 156 /* Jump to the next header */ 109 157 fseek(file, new->block_length, SEEK_CUR); 110 158 } 159 fflush(file); 111 160 return file_tree; 112 161 } … … 122 171 free(j); 123 172 } 173 fflush(stdout); 124 174 } 125 175 … … 134 184 135 185 while(i){ 136 printf("%s%s \n",tabs,i->file_name);186 printf("%s%s (offset=%i, length=%i)\n",tabs,i->file_name,i->block_offset,i->file_length); 137 187 if( i->subdir && !i->special ) 138 188 print_tree(i->subdir, tab+3); … … 144 194 int main(int argc, char **argv){ 145 195 FILE *tar_file; 196 char filepath[NAME_SIZE]; 146 197 inode *file_tree; 147 198 if(argc < 2){ … … 164 215 print_tree(file_tree,0); 165 216 217 printf("Please enter the name of the file you would like to read:"); 218 fgets(filepath,NAME_SIZE,stdin); 219 220 inode *i=read_file(tar_file, file_tree, filepath); 221 if( i == NULL ){ 222 eprintf("Invalid filename: %s", filepath); 223 return 1; 224 } 225 166 226 destroy_file_tree(file_tree); 167 227
