Changeset 5

Show
Ignore:
Timestamp:
10/28/07 15:12:27 (10 months ago)
Author:
nlawren2
Message:

It can read and print files now

Files:

Legend:

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

    r4 r5  
    2626        char file_name[NAME_SIZE]; 
    2727         
    28         int block_offset; 
    29         int  block_length; 
    30  
    31         int file_length; 
     28        unsigned long block_offset; 
     29 
     30        int block_length; 
     31        int file_length; 
    3232 
    3333        bool special; // if . or .. 
    3434}; 
    3535 
     36inode *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 
     65print: 
     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 
    3682inode *create_file_tree(FILE *file){ 
    3783        char buffer[BLOCK_SIZE]; 
    38         char *result, *last_result
     84        char *result
    3985        char delims[]="/"; 
    4086        posix_header header; 
    41  
    4287        inode *file_tree, *i, *last_i, *new; 
    43          
     88 
     89        /* Create a root directory of the tree */ 
    4490        new=file_tree=malloc(sizeof(inode)); 
    45  
    4691        file_tree->special=true; 
    4792        file_tree->file_name[0]='.'; 
     
    5499                memcpy(&header, buffer, HEADER_SIZE); 
    55100 
    56                  
     101                /* Check that the header is valid */ 
    57102                if(!memcmp(header.magic,"\0\0\0\0\0",5)) break; 
    58103 
     
    78123                        if(!i){ 
    79124                                last_i->next=new; 
     125                                break; 
    80126                        } 
    81                         last_result=result; 
    82127                        result=strtok(NULL, delims); 
    83128                } 
     129 
    84130                /* Add inode attributes */ 
    85                 memcpy(new->file_name, last_result, NAME_SIZE); 
     131                memcpy(new->file_name, result, NAME_SIZE); 
    86132                 
    87133                switch(header.typeflag){ 
     
    102148                } 
    103149                 
    104                  
     150                /* Read in the file's data */ 
    105151                sscanf(header.size,"%o",&new->file_length); 
    106152                new->block_length=(new->file_length + 511 ) & ~511; 
    107153                new->next=NULL; 
    108          
     154                new->block_offset=ftell(file); 
     155                 
     156                /* Jump to the next header */    
    109157                fseek(file, new->block_length, SEEK_CUR); 
    110158        } 
     159        fflush(file); 
    111160        return file_tree; 
    112161} 
     
    122171                free(j); 
    123172        } 
     173        fflush(stdout); 
    124174} 
    125175 
     
    134184         
    135185        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); 
    137187                if( i->subdir && !i->special ) 
    138188                        print_tree(i->subdir, tab+3); 
     
    144194int main(int argc, char **argv){ 
    145195        FILE *tar_file; 
     196        char filepath[NAME_SIZE]; 
    146197        inode *file_tree; 
    147198        if(argc < 2){ 
     
    164215        print_tree(file_tree,0); 
    165216 
     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         
    166226        destroy_file_tree(file_tree); 
    167227