Changeset 4

Show
Ignore:
Timestamp:
10/28/07 13:52:11 (10 months ago)
Author:
nlawren2
Message:

It's reading the file tree now

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • tarfs/tarfs.c

    r3 r4  
    3636inode *create_file_tree(FILE *file){ 
    3737        char buffer[BLOCK_SIZE]; 
    38         char *result
     38        char *result, *last_result
    3939        char delims[]="/"; 
    4040        posix_header header; 
    4141 
    42         inode *file_tree, *i, *new; 
     42        inode *file_tree, *i, *last_i, *new; 
    4343         
    44         file_tree=malloc(sizeof(inode)); 
     44        new=file_tree=malloc(sizeof(inode)); 
    4545 
    4646        file_tree->special=true; 
     
    4848        file_tree->file_name[1]='\0'; 
    4949        file_tree->subdir=file_tree; 
     50        file_tree->next=NULL; 
    5051 
    5152        while(true){ 
    5253                fread(buffer, sizeof(char), BLOCK_SIZE, file); 
    53                 memcpy(buffer, &header, HEADER_SIZE); 
     54                memcpy(&header, buffer, HEADER_SIZE); 
    5455 
    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; 
    5758 
    5859                if(memcmp(header.magic,"ustar",5)) return NULL; 
    5960 
    60  
     61                /* Create the next inode */ 
     62                new=malloc(sizeof(inode));       
     63                 
    6164                /* Traverse the file tree */ 
    62                 /*strtok(header.name, delims); 
     65                result=strtok(header.name, delims); 
     66                i=file_tree; 
    6367                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                } 
    7084                /* Add inode attributes */ 
    71                 memcpy(buffer,new->file_name,NAME_SIZE); 
     85                memcpy(new->file_name, last_result, NAME_SIZE); 
    7286                 
    73                 /*switch(header.typeflag){ 
     87                switch(header.typeflag){ 
    7488                case '\0': 
    7589                case '0': 
    76                          
     90                        new->subdir=NULL; 
    7791                        break; 
    7892                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; 
    8099                        break; 
    81100                default: 
    82101                        return NULL; 
    83                 }*/ 
    84                 printf("%s\n",new->file_name); 
     102                } 
     103                 
     104                 
    85105                sscanf(header.size,"%o",&new->file_length); 
    86106                new->block_length=(new->file_length + 511 ) & ~511; 
     107                new->next=NULL; 
     108         
    87109                fseek(file, new->block_length, SEEK_CUR); 
    88110        } 
     
    109131        char *tabs=malloc(temp+1); 
    110132        tabs[temp]='\0'; 
    111         while(--temp) tabs[temp]=' '; 
    112  
     133        while(temp--) tabs[temp]=' '; 
     134         
    113135        while(i){ 
    114                 printf("%s%s",tabs,i->file_name); 
     136                printf("%s%s\n",tabs,i->file_name); 
    115137                if( i->subdir && !i->special ) 
    116                         print_tree(i->subdir, tab+1); 
     138                        print_tree(i->subdir, tab+3); 
    117139                i=i->next; 
    118140        } 
     
    139161                return 1; 
    140162        } 
    141         else 
    142         { 
    143                 print_tree(file_tree,0); 
     163         
     164        print_tree(file_tree,0); 
    144165 
    145                destroy_file_tree(file_tree); 
    146         } 
     166        destroy_file_tree(file_tree); 
     167 
    147168        return 0; 
    148169}