Changeset 13
- Timestamp:
- 10/28/07 19:32:57 (10 months ago)
- Files:
-
- tarfs/tarfs.c (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
tarfs/tarfs.c
r12 r13 19 19 #define true 1 20 20 #define false 0 21 #define eprintf(...) fprintf(stderr, __VA_ARGS__) 22 21 #define eprintf(...) fprintf(error_log, __VA_ARGS__) 22 23 FILE *error_log; 23 24 24 25 typedef struct posix_header posix_header; … … 76 77 char delims[]="/"; 77 78 inode *i=file_tree, *node; 78 79 79 80 /* Traverse the file tree */ 80 result=strtok( file_path, delims);81 result=strtok(++file_path, delims); 81 82 while( result != NULL ){ 82 83 while(i){ … … 95 96 } 96 97 97 return -ENOENT;98 99 readdir:100 98 while(i){ 101 99 filler(buffer,i->file_name,NULL,0); … … 108 106 static int tarfs_getattr(const char *file_path, struct stat *stbuf) 109 107 { 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){117 108 char *result; 118 109 char delims[]="/"; 119 110 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); 124 116 while( result != NULL ){ 125 117 while(i){ … … 131 123 else{ 132 124 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 137 is_file: 138 stbuf->st_mode = S_IFREG | 0555; 139 stbuf->st_size = i->file_length; 140 return res; 141 } 142 143 static 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; 133 162 goto read; 134 163 } … … 144 173 /* Get the file length */ 145 174 len=node->file_length; 175 eprintf("size: %i\nlen: %i\noffset %s\n",size,len,offset); 146 176 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{ 156 185 size = 0; 157 158 fflush(tar_file); 186 } 187 159 188 return size; 160 189 } … … 231 260 } 232 261 233 void tarfs_destroy (inode *file_tree){234 inode *i= file_tree, *j;262 void tarfs_destroy_internal(inode *_file_tree){ 263 inode *i=_file_tree, *j; 235 264 236 265 while(i){ 237 266 if(i->subdir && !i->special ) 238 tarfs_destroy (i->subdir);267 tarfs_destroy_internal(i->subdir); 239 268 j=i; 240 269 i=i->next; … … 244 273 } 245 274 275 void tarfs_destroy(){ 276 tarfs_destroy_internal(file_tree); 277 } 246 278 247 279 void tarfs_print(inode *file_tree, int tab){ … … 271 303 272 304 int main(int argc, char **argv){ 305 /* Parse filepath and initialize the file tree */ 306 /* 273 307 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 ){ 277 309 switch(c){ 278 310 case 'f': … … 299 331 eprintf("Use: %s -f filepath\n", argv[0]); 300 332 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); 303 339 return fuse_main(argc, argv, &tarfs_oper); 304 340 }
