diff options
-rw-r--r-- | jffs2reader.c | 77 |
1 files changed, 39 insertions, 38 deletions
diff --git a/jffs2reader.c b/jffs2reader.c index 11f841d..1a211db 100644 --- a/jffs2reader.c +++ b/jffs2reader.c @@ -88,9 +88,8 @@ BUGS: #define MINOR(dev) ((dev)&0xff) #endif - -#define DIRENT_INO(dirent) ((dirent)!=NULL?(dirent)->ino:0) -#define DIRENT_PINO(dirent) ((dirent)!=NULL?(dirent)->pino:0) +#define DIRENT_INO(dirent) ((dirent) !=NULL ? je32_to_cpu((dirent)->ino) : 0) +#define DIRENT_PINO(dirent) ((dirent) !=NULL ? je32_to_cpu((dirent)->pino) : 0) struct dir { struct dir *next; @@ -135,28 +134,28 @@ int main(int, char **); void putblock(char *b, size_t bsize, size_t * rsize, struct jffs2_raw_inode *n) { - uLongf dlen = n->dsize; + uLongf dlen = je32_to_cpu(n->dsize); - if (n->isize > bsize || (n->offset + dlen) > bsize) + if (je32_to_cpu(n->isize) > bsize || (je32_to_cpu(n->offset) + dlen) > bsize) errmsg_die("File does not fit into buffer!"); - if (*rsize < n->isize) - bzero(b + *rsize, n->isize - *rsize); + if (*rsize < je32_to_cpu(n->isize)) + bzero(b + *rsize, je32_to_cpu(n->isize) - *rsize); switch (n->compr) { case JFFS2_COMPR_ZLIB: - uncompress((Bytef *) b + n->offset, &dlen, + uncompress((Bytef *) b + je32_to_cpu(n->offset), &dlen, (Bytef *) ((char *) n) + sizeof(struct jffs2_raw_inode), - (uLongf) n->csize); + (uLongf) je32_to_cpu(n->csize)); break; case JFFS2_COMPR_NONE: - memcpy(b + n->offset, + memcpy(b + je32_to_cpu(n->offset), ((char *) n) + sizeof(struct jffs2_raw_inode), dlen); break; case JFFS2_COMPR_ZERO: - bzero(b + n->offset, dlen); + bzero(b + je32_to_cpu(n->offset), dlen); break; /* [DYN]RUBIN support required! */ @@ -165,7 +164,7 @@ void putblock(char *b, size_t bsize, size_t * rsize, errmsg_die("Unsupported compression method!"); } - *rsize = n->isize; + *rsize = je32_to_cpu(n->isize); } /* adds/removes directory node into dir struct. */ @@ -184,13 +183,13 @@ struct dir *putdir(struct dir *dd, struct jffs2_raw_dirent *n) o = dd; - if (n->ino) { + if (je32_to_cpu(n->ino)) { if (dd == NULL) { d = xmalloc(sizeof(struct dir)); d->type = n->type; memcpy(d->name, n->name, n->nsize); d->nsize = n->nsize; - d->ino = n->ino; + d->ino = je32_to_cpu(n->ino); d->next = NULL; return d; @@ -200,7 +199,7 @@ struct dir *putdir(struct dir *dd, struct jffs2_raw_dirent *n) if (n->nsize == dd->nsize && !memcmp(n->name, dd->name, n->nsize)) { dd->type = n->type; - dd->ino = n->ino; + dd->ino = je32_to_cpu(n->ino); return o; } @@ -210,7 +209,7 @@ struct dir *putdir(struct dir *dd, struct jffs2_raw_dirent *n) dd->next->type = n->type; memcpy(dd->next->name, n->name, n->nsize); dd->next->nsize = n->nsize; - dd->next->ino = n->ino; + dd->next->ino = je32_to_cpu(n->ino); dd->next->next = NULL; return o; @@ -301,6 +300,7 @@ void printdir(char *o, size_t size, struct dir *d, char *path, int recurse) char *filetime; time_t age; struct jffs2_raw_inode *ri; + jint32_t mode; if (!path) return; @@ -348,16 +348,17 @@ void printdir(char *o, size_t size, struct dir *d, char *path, int recurse) } filetime = ctime((const time_t *) &(ri->ctime)); - age = time(NULL) - ri->ctime; - printf("%s %-4d %-8d %-8d ", mode_string(ri->mode), - 1, ri->uid, ri->gid); + age = time(NULL) - je32_to_cpu(ri->ctime); + mode.v32 = ri->mode.m; + printf("%s %-4d %-8d %-8d ", mode_string(je32_to_cpu(mode)), + 1, je16_to_cpu(ri->uid), je16_to_cpu(ri->gid)); if ( d->type==DT_BLK || d->type==DT_CHR ) { dev_t rdev; size_t devsize; putblock((char*)&rdev, sizeof(rdev), &devsize, ri); printf("%4d, %3d ", (int)MAJOR(rdev), (int)MINOR(rdev)); } else { - printf("%9ld ", (long)ri->dsize); + printf("%9ld ", (long)je32_to_cpu(ri->dsize)); } d->name[d->nsize]='\0'; if (age < 3600L * 24 * 365 / 2 && age > -15 * 60) { @@ -439,12 +440,12 @@ struct jffs2_raw_inode *find_raw_inode(char *o, size_t size, uint32_t ino) lr = n; do { - while (n < e && n->u.magic != JFFS2_MAGIC_BITMASK) + while (n < e && je16_to_cpu(n->u.magic) != JFFS2_MAGIC_BITMASK) ((char *) n) += 4; - if (n < e && n->u.magic == JFFS2_MAGIC_BITMASK) { - if (n->u.nodetype == JFFS2_NODETYPE_INODE && - n->i.ino == ino && (v = n->i.version) > vcur) { + if (n < e && je16_to_cpu(n->u.magic) == JFFS2_MAGIC_BITMASK) { + if (je16_to_cpu(n->u.nodetype) == JFFS2_NODETYPE_INODE && + je32_to_cpu(n->i.ino) == ino && (v = je32_to_cpu(n->i.version)) > vcur) { /* XXX crc check */ if (vmaxt < v) @@ -458,7 +459,7 @@ struct jffs2_raw_inode *find_raw_inode(char *o, size_t size, uint32_t ino) return (&(n->i)); } - ((char *) n) += ((n->u.totlen + 3) & ~3); + ((char *) n) += ((je32_to_cpu(n->u.totlen) + 3) & ~3); } else n = (union jffs2_node_union *) o; /* we're at the end, rewind to the beginning */ @@ -507,12 +508,12 @@ struct dir *collectdir(char *o, size_t size, uint32_t ino, struct dir *d) lr = n; do { - while (n < e && n->u.magic != JFFS2_MAGIC_BITMASK) + while (n < e && je16_to_cpu(n->u.magic) != JFFS2_MAGIC_BITMASK) ((char *) n) += 4; - if (n < e && n->u.magic == JFFS2_MAGIC_BITMASK) { - if (n->u.nodetype == JFFS2_NODETYPE_DIRENT && - n->d.pino == ino && (v = n->d.version) > vcur) { + if (n < e && je16_to_cpu(n->u.magic) == JFFS2_MAGIC_BITMASK) { + if (je16_to_cpu(n->u.nodetype) == JFFS2_NODETYPE_DIRENT && + je32_to_cpu(n->d.pino) == ino && (v = je32_to_cpu(n->d.version)) > vcur) { /* XXX crc check */ if (vmaxt < v) @@ -531,7 +532,7 @@ struct dir *collectdir(char *o, size_t size, uint32_t ino, struct dir *d) } } - ((char *) n) += ((n->u.totlen + 3) & ~3); + ((char *) n) += ((je32_to_cpu(n->u.totlen) + 3) & ~3); } else n = (union jffs2_node_union *) o; /* we're at the end, rewind to the beginning */ @@ -545,7 +546,7 @@ struct dir *collectdir(char *o, size_t size, uint32_t ino, struct dir *d) lr = n = (union jffs2_node_union *) (((char *) mp) + - ((mp->u.totlen + 3) & ~3)); + ((je32_to_cpu(mp->u.totlen) + 3) & ~3)); vcur = vmin; } @@ -594,14 +595,14 @@ struct jffs2_raw_dirent *resolvedirent(char *o, size_t size, n = (union jffs2_node_union *) o; do { - while (n < e && n->u.magic != JFFS2_MAGIC_BITMASK) + while (n < e && je16_to_cpu(n->u.magic) != JFFS2_MAGIC_BITMASK) ((char *) n) += 4; - if (n < e && n->u.magic == JFFS2_MAGIC_BITMASK) { - if (n->u.nodetype == JFFS2_NODETYPE_DIRENT && - (!ino || n->d.ino == ino) && - (v = n->d.version) > vmax && - (!pino || (n->d.pino == pino && + if (n < e && je16_to_cpu(n->u.magic) == JFFS2_MAGIC_BITMASK) { + if (je16_to_cpu(n->u.nodetype) == JFFS2_NODETYPE_DIRENT && + (!ino || je32_to_cpu(n->d.ino) == ino) && + (v = je32_to_cpu(n->d.version)) > vmax && + (!pino || (je32_to_cpu(n->d.pino) == pino && nsize == n->d.nsize && !memcmp(name, n->d.name, nsize)))) { /* XXX crc check */ @@ -612,7 +613,7 @@ struct jffs2_raw_dirent *resolvedirent(char *o, size_t size, } } - ((char *) n) += ((n->u.totlen + 3) & ~3); + ((char *) n) += ((je32_to_cpu(n->u.totlen) + 3) & ~3); } else return dd; } while (1); |