FreeCalypso > hg > freecalypso-reveng
annotate mysteryffs/extract.c @ 144:fd772de226cb
tiobjd: started implementing rich symbolic info parsing
| author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> | 
|---|---|
| date | Mon, 28 Apr 2014 08:04:39 +0000 | 
| parents | d19b4e20ff9f | 
| children | 
| rev | line source | 
|---|---|
| 25 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 1 /* | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 2 * This program is the logical culmination of the MysteryFFS reverse eng | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 3 * experiments: it walks the FFS directory tree from the root down, | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 4 * recreates a matching tree in the local Unix file system, and | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 5 * extracts the full content of all data files. | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 6 * | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 7 * All acquired understanding of the MysteryFFS structure is tested | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 8 * in the process. | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 9 */ | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 10 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 11 #include <sys/types.h> | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 12 #include <sys/file.h> | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 13 #include <sys/stat.h> | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 14 #include <endian.h> | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 15 #include <ctype.h> | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 16 #include <stdio.h> | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 17 #include <string.h> | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 18 #include <strings.h> | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 19 #include <stdlib.h> | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 20 #include <unistd.h> | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 21 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 22 typedef unsigned char u8; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 23 typedef unsigned short u16; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 24 typedef unsigned int u32; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 25 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 26 u8 mysteryffs_hdr[6] = {'F', 'f', 's', '#', 0x10, 0x02}; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 27 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 28 /* actual MysteryFFS on-media structure */ | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 29 struct mysteryffs_index { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 30 u16 len; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 31 u8 unknown_b1; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 32 u8 type; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 33 u16 descend; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 34 u16 sibling; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 35 u32 dataptr; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 36 u16 unknown_w1; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 37 u16 unknown_w2; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 38 }; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 39 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 40 /* our own struct for convenience */ | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 41 struct objinfo { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 42 u16 entryno; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 43 struct mysteryffs_index *idxrec; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 44 u8 *dataptr; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 45 u32 offset; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 46 u16 len; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 47 u8 type; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 48 u16 descend; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 49 u16 sibling; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 50 }; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 51 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 52 char *imgfile; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 53 u32 eraseblk_size; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 54 int total_blocks; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 55 u32 total_img_size; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 56 u8 *image, *indexblk; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 57 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 58 char workpath[512]; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 59 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 60 read_img_file() | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 61 { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 62 int fd; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 63 struct stat st; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 64 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 65 fd = open(imgfile, O_RDONLY); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 66 if (fd < 0) { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 67 perror(imgfile); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 68 exit(1); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 69 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 70 fstat(fd, &st); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 71 if (!S_ISREG(st.st_mode)) { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 72 fprintf(stderr, "%s is not a regular file\n", imgfile); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 73 exit(1); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 74 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 75 if (st.st_size < total_img_size) { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 76 fprintf(stderr, "%s has fewer than 0x%x bytes\n", imgfile, | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 77 total_img_size); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 78 exit(1); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 79 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 80 image = malloc(total_img_size); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 81 if (!image) { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 82 perror("malloc"); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 83 exit(1); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 84 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 85 read(fd, image, total_img_size); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 86 close(fd); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 87 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 88 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 89 find_index_block() | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 90 { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 91 int i; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 92 u8 *ptr; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 93 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 94 for (ptr = image, i = 0; i < total_blocks; i++, ptr += eraseblk_size) { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 95 if (bcmp(ptr, mysteryffs_hdr, 6)) | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 96 continue; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 97 if (ptr[8] != 0xAB) | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 98 continue; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 99 printf("Found index in erase block #%d (offset %x)\n", i, | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 100 ptr - image); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 101 indexblk = ptr; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 102 return(0); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 103 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 104 fprintf(stderr, "could not find a MysteryFFS index block in %s\n", | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 105 imgfile); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 106 exit(1); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 107 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 108 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 109 get_index_entry(oi) | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 110 struct objinfo *oi; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 111 { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 112 struct mysteryffs_index *le; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 113 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 114 if (oi->entryno >= (eraseblk_size >> 4)) { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 115 fprintf(stderr, | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 116 "error: index block pointer %x past the erase block size!\n", | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 117 oi->entryno); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 118 exit(1); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 119 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 120 le = (struct mysteryffs_index *) indexblk + oi->entryno; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 121 oi->idxrec = le; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 122 oi->len = le16toh(le->len); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 123 oi->type = le->type; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 124 oi->descend = le16toh(le->descend); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 125 oi->sibling = le16toh(le->sibling); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 126 return(0); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 127 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 128 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 129 validate_chunk(oi) | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 130 struct objinfo *oi; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 131 { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 132 u32 dptr; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 133 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 134 if (oi->len & 0xF || !oi->len) { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 135 fprintf(stderr, "index entry #%x: invalid chunk length\n", | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 136 oi->entryno); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 137 exit(1); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 138 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 139 dptr = le32toh(oi->idxrec->dataptr); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 140 if (dptr > 0x0FFFFFFF) { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 141 invdptr: fprintf(stderr, "index entry #%x: invalid data pointer\n", | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 142 oi->entryno); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 143 exit(1); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 144 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 145 dptr <<= 4; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 146 if (dptr >= total_img_size - oi->len) | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 147 goto invdptr; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 148 oi->offset = dptr; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 149 oi->dataptr = image + dptr; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 150 return(0); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 151 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 152 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 153 validate_obj_name(oi) | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 154 struct objinfo *oi; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 155 { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 156 u8 *cp; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 157 int cnt; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 158 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 159 for (cp = oi->dataptr, cnt = 0; ; cp++, cnt++) { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 160 if (cnt >= oi->len) { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 161 fprintf(stderr, | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 162 "object at index %x: name expected at %x: length overrun\n", | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 163 oi->entryno, oi->offset); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 164 exit(1); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 165 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 166 if (!*cp) | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 167 break; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 168 if (*cp < '!' || *cp > '~') { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 169 fprintf(stderr, | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 170 "object at index %x: name expected at %x: bad character\n", | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 171 oi->entryno, oi->offset); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 172 exit(1); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 173 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 174 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 175 if (!cnt) { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 176 fprintf(stderr, | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 177 "object at index %x: name expected at %x: null string\n", | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 178 oi->entryno, oi->offset); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 179 exit(1); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 180 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 181 return(0); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 182 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 183 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 184 name_safe_for_extract(oi) | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 185 struct objinfo *oi; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 186 { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 187 char *s; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 188 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 189 s = (char *)oi->dataptr; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 190 if (!isalnum(*s) && *s != '_') | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 191 return(0); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 192 for (s++; *s; s++) | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 193 if (!isalnum(*s) && *s != '_' && *s != '.') | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 194 return(0); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 195 return(1); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 196 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 197 | 
| 26 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 198 u8 * | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 199 find_end_of_chunk(ch) | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 200 struct objinfo *ch; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 201 { | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 202 u8 *p; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 203 int i; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 204 | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 205 p = ch->dataptr + ch->len; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 206 for (i = 1; i <= 16; i++) { | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 207 if (!p[-i]) | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 208 return(p - i); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 209 if (p[-1] != 0xFF) | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 210 break; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 211 } | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 212 fprintf(stderr, | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 213 "chunk starting at %x (index entry %x): no valid termination found\n", | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 214 ch->offset, ch->entryno); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 215 exit(1); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 216 } | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 217 | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 218 void | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 219 dump_head_chunk(fd, ch) | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 220 struct objinfo *ch; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 221 { | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 222 u8 *endname, *endchunk; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 223 | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 224 endname = (u8 *) index((char *)ch->dataptr, '\0') + 1; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 225 endchunk = find_end_of_chunk(ch); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 226 if (endchunk <= endname) | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 227 return; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 228 write(fd, endname, endchunk - endname); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 229 } | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 230 | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 231 void | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 232 dump_extra_chunk(fd, ch) | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 233 struct objinfo *ch; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 234 { | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 235 u8 *endchunk; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 236 | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 237 endchunk = find_end_of_chunk(ch); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 238 write(fd, ch->dataptr, endchunk - ch->dataptr); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 239 } | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 240 | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 241 extract_file(head) | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 242 struct objinfo *head; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 243 { | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 244 int fd; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 245 int ent; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 246 struct objinfo ch; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 247 | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 248 fd = open(workpath + 1, O_WRONLY|O_CREAT|O_TRUNC, 0666); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 249 if (fd < 0) { | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 250 perror(workpath + 1); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 251 exit(1); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 252 } | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 253 dump_head_chunk(fd, head); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 254 for (ent = head->descend; ent != 0xFFFF; ent = ch.descend) { | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 255 ch.entryno = ent; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 256 get_index_entry(&ch); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 257 if (ch.type != 0xF4) { | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 258 fprintf(stderr, | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 259 "file continuation object at index %x: type %02X != expected F4\n", | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 260 ent, ch.type); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 261 exit(1); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 262 } | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 263 validate_chunk(&ch); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 264 dump_extra_chunk(fd, &ch); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 265 if (ch.sibling != 0xFFFF) | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 266 printf("warning: file continuation object (index %x) has a non-nil sibling pointer\n", | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 267 ent); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 268 } | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 269 close(fd); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 270 } | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 271 | 
| 25 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 272 dump_dir(firstent, path_prefix) | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 273 { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 274 int ent; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 275 struct objinfo obj; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 276 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 277 for (ent = firstent; ent != 0xFFFF; ent = obj.sibling) { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 278 obj.entryno = ent; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 279 get_index_entry(&obj); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 280 if (!obj.type) /* skip deleted objects w/o further validation */ | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 281 continue; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 282 validate_chunk(&obj); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 283 validate_obj_name(&obj); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 284 if (path_prefix + strlen(obj.dataptr) + 2 > sizeof workpath) { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 285 fprintf(stderr, | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 286 "handling object at index %x, name \"%s\": path buffer overflow\n", | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 287 obj.entryno, (char *)obj.dataptr); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 288 exit(1); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 289 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 290 sprintf(workpath + path_prefix, "/%s", (char *)obj.dataptr); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 291 switch (obj.type) { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 292 case 0xF2: | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 293 /* directory */ | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 294 printf("dir: %s\n", workpath); | 
| 26 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 295 if (!name_safe_for_extract(&obj)) { | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 296 printf("name contains unsafe characters; subtree skipped\n"); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 297 continue; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 298 } | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 299 if (mkdir(workpath + 1, 0777) < 0) { | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 300 perror(workpath + 1); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 301 exit(1); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 302 } | 
| 25 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 303 dump_dir(obj.descend, strlen(workpath)); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 304 continue; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 305 case 0xF1: | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 306 /* regular file */ | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 307 printf("file: %s\n", workpath); | 
| 26 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 308 if (!name_safe_for_extract(&obj)) { | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 309 printf("name contains unsafe characters; file skipped\n"); | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 310 continue; | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 311 } | 
| 
d19b4e20ff9f
MysteryFFS: extract utility seems to work
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
25diff
changeset | 312 extract_file(&obj); | 
| 25 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 313 continue; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 314 case 0xE1: | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 315 /* special .journal file */ | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 316 if (path_prefix == 0 && | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 317 !strcmp((char *)obj.dataptr, ".journal")) | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 318 printf("skipping /.journal\n"); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 319 else | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 320 printf("skipping unexpected E1 file: %s\n", | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 321 workpath); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 322 continue; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 323 default: | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 324 printf("%s (index entry #%x): unexpected type %02X; skipping\n", | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 325 workpath, obj.entryno, obj.type); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 326 continue; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 327 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 328 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 329 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 330 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 331 dump_root() | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 332 { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 333 struct objinfo root; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 334 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 335 root.entryno = 1; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 336 get_index_entry(&root); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 337 validate_chunk(&root); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 338 validate_obj_name(&root); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 339 printf("Root node name: %s\n", (char *)root.dataptr); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 340 if (root.type != 0xF2) { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 341 fprintf(stderr, | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 342 "error: index entry #1 (expected root dir) is not a directory\n"); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 343 exit(1); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 344 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 345 if (root.sibling != 0xFFFF) | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 346 printf("warning: root entry has a non-nil sibling pointer\n"); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 347 dump_dir(root.descend, 0); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 348 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 349 | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 350 main(argc, argv) | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 351 char **argv; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 352 { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 353 if (argc != 4) { | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 354 fprintf(stderr, "usage: %s imgfile blksize nblocks\n", argv[0]); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 355 exit(1); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 356 } | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 357 imgfile = argv[1]; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 358 eraseblk_size = strtoul(argv[2], 0, 0); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 359 total_blocks = strtoul(argv[3], 0, 0); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 360 total_img_size = eraseblk_size * total_blocks; | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 361 read_img_file(); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 362 find_index_block(); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 363 dump_root(); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 364 exit(0); | 
| 
ae5337f881e3
MysteryFFS: beginning of the extract utility
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 365 } | 
