view ffstools/tiffs-rd/main.c @ 726:d68275d47a32

tiffs IVA: decode command implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 28 Aug 2020 03:11:16 +0000
parents e7502631a0f9
children
line wrap: on
line source

/*
 * 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_decode();
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},
	{"decode", cmd_decode},
	{"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);
}