Changeset 4
- Timestamp:
- 10/28/07 13:52:11 (10 months ago)
- Files:
-
- tarfs/tarfs.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
tarfs/tarfs.c
r3 r4 36 36 inode *create_file_tree(FILE *file){ 37 37 char buffer[BLOCK_SIZE]; 38 char *result ;38 char *result, *last_result; 39 39 char delims[]="/"; 40 40 posix_header header; 41 41 42 inode *file_tree, *i, * new;42 inode *file_tree, *i, *last_i, *new; 43 43 44 file_tree=malloc(sizeof(inode));44 new=file_tree=malloc(sizeof(inode)); 45 45 46 46 file_tree->special=true; … … 48 48 file_tree->file_name[1]='\0'; 49 49 file_tree->subdir=file_tree; 50 file_tree->next=NULL; 50 51 51 52 while(true){ 52 53 fread(buffer, sizeof(char), BLOCK_SIZE, file); 53 memcpy( buffer, &header, HEADER_SIZE);54 memcpy(&header, buffer, HEADER_SIZE); 54 55 55 eprintf("magic: %s\n",header.magic);56 if( memcmp(header.magic,"\0\0\0\0\0",5)) break;56 57 if(!memcmp(header.magic,"\0\0\0\0\0",5)) break; 57 58 58 59 if(memcmp(header.magic,"ustar",5)) return NULL; 59 60 60 61 /* Create the next inode */ 62 new=malloc(sizeof(inode)); 63 61 64 /* Traverse the file tree */ 62 /*strtok(header.name, delims); 65 result=strtok(header.name, delims); 66 i=file_tree; 63 67 while( result != NULL ){ 64 strtok(NULL, delims); 65 i=file_tree; 66 // TODO 67 }*/ 68 new->next=malloc(sizeof(inode)); 69 new=new->next; 68 while(i){ 69 if(i->subdir){ 70 if(!strcmp(i->file_name,result)){ 71 i=i->subdir; 72 break; 73 } 74 } 75 last_i=i; 76 i=i->next; 77 } 78 if(!i){ 79 last_i->next=new; 80 } 81 last_result=result; 82 result=strtok(NULL, delims); 83 } 70 84 /* Add inode attributes */ 71 memcpy( buffer,new->file_name,NAME_SIZE);85 memcpy(new->file_name, last_result, NAME_SIZE); 72 86 73 /*switch(header.typeflag){87 switch(header.typeflag){ 74 88 case '\0': 75 89 case '0': 76 90 new->subdir=NULL; 77 91 break; 78 92 case '5': 79 93 new->subdir=malloc(sizeof(inode)); 94 new->subdir->special=true; 95 new->subdir->file_name[0]='.'; 96 new->subdir->file_name[1]='\0'; 97 new->subdir->subdir=new->subdir; 98 new->subdir->next=NULL; 80 99 break; 81 100 default: 82 101 return NULL; 83 }*/ 84 printf("%s\n",new->file_name); 102 } 103 104 85 105 sscanf(header.size,"%o",&new->file_length); 86 106 new->block_length=(new->file_length + 511 ) & ~511; 107 new->next=NULL; 108 87 109 fseek(file, new->block_length, SEEK_CUR); 88 110 } … … 109 131 char *tabs=malloc(temp+1); 110 132 tabs[temp]='\0'; 111 while( --temp) tabs[temp]=' ';112 133 while(temp--) tabs[temp]=' '; 134 113 135 while(i){ 114 printf("%s%s ",tabs,i->file_name);136 printf("%s%s\n",tabs,i->file_name); 115 137 if( i->subdir && !i->special ) 116 print_tree(i->subdir, tab+ 1);138 print_tree(i->subdir, tab+3); 117 139 i=i->next; 118 140 } … … 139 161 return 1; 140 162 } 141 else 142 { 143 print_tree(file_tree,0); 163 164 print_tree(file_tree,0); 144 165 145 destroy_file_tree(file_tree);146 } 166 destroy_file_tree(file_tree); 167 147 168 return 0; 148 169 }
