FreeCalypso > hg > freecalypso-tools
diff ffstools/tiffs-rd/main.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 | d68275d47a32 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ffstools/tiffs-rd/main.c Sat Jun 11 00:13:35 2016 +0000 @@ -0,0 +1,128 @@ +/* + * This C module contains the main() function for the tiffs utility, + * dispatching control to different operation commands. + */ + +#include <sys/types.h> +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include "types.h" +#include "globals.h" + +parse_org_arg(arg) + char *arg; +{ + char *cp; + + cp = index(arg, 'x'); + if (!cp || !isdigit(cp[1]) || !isdigit(arg[0])) { + fprintf(stderr, + "error: TIFFS organization argument \"%s\" is invalid\n", arg); + exit(1); + } + *cp++ = '\0'; + if (!strcmp(arg, "8")) + eraseblk_size = 0x2000; + else if (!strcmp(arg, "16")) + eraseblk_size = 0x4000; + else if (!strcmp(arg, "32")) + eraseblk_size = 0x8000; + else if (!strcmp(arg, "64")) + eraseblk_size = 0x10000; + else if (!strcmp(arg, "128")) + eraseblk_size = 0x20000; + else if (!strcmp(arg, "256")) + eraseblk_size = 0x40000; + else { + fprintf(stderr, + "error: \"%s\" is not a recognized flash sector size\n", + arg); + exit(1); + } + total_blocks = atoi(cp); + if (total_blocks < 1 || total_blocks > 128) { + fprintf(stderr, + "error: \"%s\" is not a reasonable number of FFS sectors\n", + cp); + exit(1); + } + total_ffs_size = eraseblk_size * total_blocks; + inode_limit = eraseblk_size >> 4; +} + +extern int cmd_blkhdr(); +extern int cmd_cat(); +extern int cmd_catino(); +extern int cmd_fsinfo(); +extern int cmd_ls(); +extern int cmd_lsino(); +extern int cmd_xtr(); + +static struct cmdtab { + char *cmd; + int (*func)(); +} cmdtab[] = { + {"blkhdr", cmd_blkhdr}, + {"cat", cmd_cat}, + {"catino", cmd_catino}, + {"fsck", NULL}, + {"fsinfo", cmd_fsinfo}, + {"ls", cmd_ls}, + {"lsino", cmd_lsino}, + {"xtr", cmd_xtr}, + {NULL, NULL} +}; + +main(argc, argv) + char **argv; +{ + extern int optind; + extern char *optarg; + int c; + char *cmd; + struct cmdtab *tp; + + while ((c = getopt(argc, argv, "+a:o:Or:v")) != EOF) + switch (c) { + case 'a': + index_blk_num = atoi(optarg); + continue; + case 'o': + imgfile_offset = strtoul(optarg, 0, 0); + continue; + case 'O': + old_16bit_location = 1; + continue; + case 'r': + root_inode = strtoul(optarg, 0, 16); + continue; + case 'v': + verbose++; + continue; + default: +usage: fprintf(stderr, + "usage: %s [global-options] <imgfile> <org> <op> ...\n", + argv[0]); + exit(1); + } + if (argc - optind < 3) + goto usage; + imgfile = argv[optind]; + parse_org_arg(argv[optind+1]); + cmd = argv[optind+2]; + + for (tp = cmdtab; tp->cmd; tp++) + if (!strcmp(tp->cmd, cmd)) + break; + if (!tp->func) { + fprintf(stderr, + "%s: operation \"%s\" is unknown or unimplemented\n", + argv[0], cmd); + exit(1); + } + optind += 2; + return tp->func(argc - optind, argv + optind); +}