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);
+}