Changeset 13

Show
Ignore:
Timestamp:
10/28/07 19:32:57 (10 months ago)
Author:
dmajnem2
Message:

Reading directories fully works
Reading files fuly crashes the program

Files:

Legend:

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

    r12 r13  
    1919#define true        1 
    2020#define false       0 
    21 #define eprintf(...) fprintf(stderr, __VA_ARGS__) 
    22  
     21#define eprintf(...) fprintf(error_log, __VA_ARGS__) 
     22 
     23FILE *error_log; 
    2324 
    2425typedef struct posix_header posix_header; 
     
    7677        char delims[]="/"; 
    7778        inode *i=file_tree, *node; 
    78          
     79 
    7980        /* Traverse the file tree */ 
    80         result=strtok(file_path, delims); 
     81        result=strtok(++file_path, delims); 
    8182        while( result != NULL ){ 
    8283                while(i){ 
     
    9596        } 
    9697 
    97         return -ENOENT; 
    98  
    99 readdir: 
    10098        while(i){ 
    10199                filler(buffer,i->file_name,NULL,0); 
     
    108106static int tarfs_getattr(const char *file_path, struct stat *stbuf) 
    109107{ 
    110    int res = 0; 
    111    stbuf->st_mode = S_IFDIR | 0555; 
    112    stbuf->st_nlink = 2; 
    113    return res; 
    114 } 
    115  
    116 static int tarfs_read(const char *file_path, void *buffer, size_t size, off_t offset, struct fuse_file_info *fi){ 
    117108        char *result; 
    118109        char delims[]="/"; 
    119110        inode *i=file_tree, *node; 
    120         size_t len; 
    121  
    122         /* Traverse the file tree */ 
    123         result=strtok(file_path, delims); 
     111        int res = 0; 
     112         
     113        stbuf->st_nlink = 1; 
     114 
     115        result=strtok(++file_path, delims); 
    124116        while( result != NULL ){ 
    125117                while(i){ 
     
    131123                                else{ 
    132124                                        node=i; 
     125                                        goto is_file; 
     126                                } 
     127                        } 
     128                        i=i->next; 
     129                } 
     130                if(!i) return -ENOENT; 
     131                result=strtok(NULL, delims); 
     132        } 
     133         
     134        stbuf->st_mode = S_IFDIR | 0555; 
     135        return res; 
     136 
     137is_file: 
     138        stbuf->st_mode = S_IFREG | 0555; 
     139        stbuf->st_size = i->file_length; 
     140        return res; 
     141} 
     142 
     143static int tarfs_read(const char *file_path, char *buffer, size_t size, off_t offset, struct fuse_file_info *fi){ 
     144        char *result; 
     145        char delims[]="/"; 
     146        inode *i=file_tree, *node; 
     147        size_t len; 
     148 
     149        eprintf("\n\nLogging for %s\n", file_path); 
     150         
     151        /* Traverse the file tree */ 
     152        result=strtok(++file_path, delims); 
     153        while( result != NULL ){ 
     154                while(i){ 
     155                        if(!strcmp(result, i->file_name)){ 
     156                                if(i->subdir){ 
     157                                        i=i->subdir; 
     158                                        break; 
     159                                } 
     160                                else{ 
     161                                        node=i; 
    133162                                        goto read; 
    134163                                } 
     
    144173        /* Get the file length */ 
    145174        len=node->file_length; 
     175        eprintf("size: %i\nlen: %i\noffset %s\n",size,len,offset); 
    146176        if (offset < len) { 
    147                 /* Seek to the position of the file in the tar */ 
    148                 fseek(tar_file, node->block_offset, SEEK_SET); 
    149  
    150                 /* Seek to the requested offset */ 
    151                 fseek(tar_file, offset, SEEK_CUR); 
    152  
    153                 /* Do the actual read */ 
    154                 size = fread(buffer, sizeof(char), len, tar_file); 
    155         } else 
     177                fseek(tar_file, node->block_offset + offset, SEEK_SET); 
     178                 
     179                if( size + offset > len ) size=len-offset; 
     180         
     181                size = fread(buffer, sizeof(char), size, tar_file); 
     182                 
     183                fflush(tar_file); 
     184        } else{ 
    156185                size = 0; 
    157  
    158         fflush(tar_file); 
     186        } 
     187 
    159188        return size; 
    160189} 
     
    231260} 
    232261 
    233 void tarfs_destroy(inode *file_tree){ 
    234         inode *i=file_tree, *j; 
     262void tarfs_destroy_internal(inode *_file_tree){ 
     263        inode *i=_file_tree, *j; 
    235264 
    236265        while(i){ 
    237266                if(i->subdir && !i->special ) 
    238                         tarfs_destroy(i->subdir); 
     267                        tarfs_destroy_internal(i->subdir); 
    239268                j=i; 
    240269                i=i->next; 
     
    244273} 
    245274 
     275void tarfs_destroy(){ 
     276        tarfs_destroy_internal(file_tree); 
     277} 
    246278 
    247279void tarfs_print(inode *file_tree, int tab){ 
     
    271303 
    272304int main(int argc, char **argv){ 
     305        /* Parse filepath and initialize the file tree */ 
     306        /* 
    273307        int c; 
    274          
    275         /* Parse filepath and initialize the file tree */ 
    276         while( (c=getopt(argc, argv, "f")) != -1 ){ 
     308        while( (c=getopt(argc, argv, "f:")) != -1 ){ 
    277309                switch(c){ 
    278310                case 'f': 
     
    299331                eprintf("Use: %s -f filepath\n", argv[0]); 
    300332                return 1; 
    301         } 
    302  
     333        }*/ 
     334        error_log=fopen("./error.log", "a"); 
     335        eprintf("\n\nLogging...\n"); 
     336 
     337        tar_file = fopen("./SourceImages.tar", "r"); 
     338        file_tree=tarfs_init(tar_file); 
    303339        return fuse_main(argc, argv, &tarfs_oper); 
    304340}