FreeCalypso > hg > freecalypso-tools
diff target-utils/libtiffs/findfile.c @ 0:e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 11 Jun 2016 00:13:35 +0000 |
parents | |
children | 87cb03b35f77 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/target-utils/libtiffs/findfile.c Sat Jun 11 00:13:35 2016 +0000 @@ -0,0 +1,106 @@ +#include <sys/types.h> +#include "types.h" +#include "struct.h" +#include "globals.h" +#include "macros.h" + +static u8 * +find_endofchunk(ino) +{ + struct inode *irec = mpffs_active_index + ino; + u8 *p; + int i; + + p = inode_to_dataptr(irec) + irec->len; + for (i = 0; i < 16; i++) { + p--; + if (!*p) + return(p); + if (*p != 0xFF) + break; + } + printf("Error: inode #%x has no valid termination\n", ino); + return(p); /* XXX */ +} + +mpffs_find_file(pathname, startret, sizeret, continue_ret) + char *pathname; + u8 **startret; + size_t *sizeret; + int *continue_ret; +{ + int ino, cont; + struct inode *irec; + u8 *start, *end; + int size; + + ino = mpffs_pathname_to_inode(pathname); + if (ino <= 0) + return(-1); + irec = mpffs_active_index + ino; + if (irec->type != OBJTYPE_FILE) { + printf("Error: %s is not a regular file\n", pathname); + return(-1); + } + start = inode_to_dataptr(irec); + start += strlen(start) + 1; + end = find_endofchunk(ino); + size = end - start; + if (size < 0) + size = 0; + cont = irec->descend; + if (cont == 0xFFFF) + cont = 0; + if (startret) + *startret = start; + if (sizeret) + *sizeret = size; + if (continue_ret) + *continue_ret = cont; + return(0); +} + +mpffs_get_segment(ino, startret, sizeret, continue_ret) + int ino; + u8 **startret; + size_t *sizeret; + int *continue_ret; +{ + int cont; + struct inode *irec; + u8 *start, *end; + int size; + + for (;;) { + irec = mpffs_active_index + ino; + if (irec->type) + break; + if (irec->sibling == 0xFFFF) { + printf("Error: segment inode #%d: deleted and no sibling\n", + ino); + return(-1); + } + ino = irec->sibling; + } + if (irec->type != OBJTYPE_SEGMENT) { + printf("Error: inode #%x is not a segment\n", ino); + return(-1); + } + start = inode_to_dataptr(irec); + end = find_endofchunk(ino); + size = end - start; + if (size <= 0) { + printf("Error: segment inode #%x: bad length\n", ino); + return(-1); + } + cont = irec->descend; + if (cont == 0xFFFF) + cont = 0; + if (startret) + *startret = start; + if (sizeret) + *sizeret = size; + if (continue_ret) + *continue_ret = cont; + return(0); +}