]>
cvs.zerfleddert.de Git - rsbs2/blob - filesystem.c
175cbc4d0670479af52999da0c800f3c69d4b24b
  13 #include "filesystem.h" 
  15 struct file_entry
* get_next_file(unsigned char *fw
, int len
) 
  17         static unsigned char *pos
; 
  18         static unsigned char *start
; 
  19         static unsigned char *end
; 
  20         static struct file_entry fent
; 
  23         if (fw 
!= NULL 
&& len 
!= 0) { 
  27                 printf("Start of filesystem: 0x%08x\n", *((unsigned int*)pos
)); 
  30                 pos 
= fw 
+ *((unsigned int*)pos
); 
  37         if (fent
.unknown 
== 0x00) { 
  39                 int fill 
= (4 - ((pos 
- start
) % 4)) % 4; 
  42                 for (i 
= 0; i 
< fill
; i
++) { 
  44                                 fprintf(stderr
, "Wrong fill byte after EOF: 0x%02x, aborting!\n", *pos
); 
  51                         fprintf(stderr
, "EOF marker not at end-of-file %p <-> %p, aborting!\n", pos
, end
); 
  59         name_length 
= *((unsigned int*)pos
); 
  62         fent
.length 
= *((unsigned int*)pos
); 
  65         if ((fent
.length 
> (end 
- pos
)) || 
  66             (name_length 
> (end 
- pos
))) { 
  67                 printf("EOF reached without hitting EOF marker, aborting " 
  68                         "(unknown: 0x%02x, namelen: 0x%08x, contentlen: 0x%08x!\n", 
  69                         fent
.unknown
, name_length
, fent
.length
); 
  73         fent
.name 
= (char*)pos
; 
  82 void extract_files(unsigned char *fw
, int len
) 
  84         struct file_entry 
*fent
; 
  86         fent 
= get_next_file(fw
, len
); 
  89                 printf("%s: unknown: 0x%02x, length: %d", 
  90                         fent
->name
, fent
->unknown
, fent
->length
); 
  92                 if (fent
->length 
> 0) { 
  93                         write_file(fent
->name
, fent
->start
, fent
->length
); 
  94                         if (*((unsigned int*)fent
->start
) == LZ_MAGIC
) { 
  97                                 if ((lzname 
= strdup(fent
->name
)) == NULL
) { 
 102                                 if (!strcmp(lzname 
+ strlen(lzname
) - 4 , ".lz")) { 
 103                                         fprintf(stderr
, "Ugh, can't derive filename...\n"); 
 106                                 lzname
[strlen(lzname
) - 3] = 0x00; 
 108                                 printf("%s: packed file found", lzname
); 
 110                                 extract_lz_file(fent
->start
, (unsigned char*)lzname
, 0); 
 112                         } else if (!strcmp(fent
->name
, "firmware")) { 
 113                                 unsigned char *lzpos
; 
 116                                 bzero(lzname
, sizeof(lzname
)); 
 117                                 strcpy(lzname
, "firmware."); 
 119                                 lzpos 
= fent
->start 
+ *((unsigned int*)(fent
->start 
+ 0x20)); 
 120                                 memcpy(lzname 
+ strlen(lzname
), lzpos 
- 4, 4); 
 122                                 if (*((unsigned int*)(lzpos
)) == LZ_MAGIC
) { 
 123                                         printf("%s: compressed firmware part found", lzname
); 
 124                                         extract_lz_file(lzpos
, (unsigned char*)lzname
, 1); 
 128                         printf(", ignoring...\n"); 
 130                 fent 
= get_next_file(NULL
, 0); 
 134 void replace_add_file(unsigned char *fw
, int len
, char *fwname
, char *lname
) 
 136         fprintf(stderr
, "%s: Implement me!\n", __func__
); 
 140 void list_files(unsigned char *fw
, int len
) 
 142         struct file_entry 
*fent
; 
 144         for (fent 
= get_next_file(fw
, len
); fent 
!= NULL
; fent 
= get_next_file(NULL
, 0)) { 
 145                 printf("0x%x %8d %s\n", fent
->unknown
, fent
->length
, fent
->name
); 
 150 void mkdir_p(char *dir
) 
 154         if ((dir 
== NULL
) || (!strcmp(dir
, "."))) 
 157         if ((copy 
= strdup(dir
)) == NULL
) { 
 161         parent 
= dirname(copy
); 
 165         if (mkdir(dir
, 0755) == -1) { 
 166                 if (errno 
!= EEXIST
) { 
 167                         fprintf(stderr
, "%s: ", dir
); 
 175 void write_file(char *fname
, unsigned char *buf
, int len
) 
 177         char filename
[PATH_MAX
]; 
 178         char *filename_c
, *dirn
; 
 183         strcpy(filename
, "extracted/"); 
 184         strcat(filename
, fname
); 
 186         if ((filename_c 
= strdup(filename
)) == NULL
) { 
 190         dirn 
= dirname(filename_c
); 
 194         if ((fd 
= open(filename
, O_WRONLY
|O_CREAT
, 0644)) == -1) { 
 195                 fprintf(stderr
, "%s: ", filename
); 
 203                 ret 
= write(fd
, buf 
+ (len 
- remaining
), remaining
); 
 211         printf(", %s written.\n", filename
);