view ffstools/tiffs-wrappers/pirffs.c @ 461:10e168596dfd

doc/SIM-hardware-debugging: article written
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 10 Feb 2019 20:40:56 +0000
parents e7502631a0f9
children
line wrap: on
line source

/*
 * pirffs is a wrapper around tiffs: we pass the user's command along,
 * together with any options, but insert the 256x18 FFS organization argument
 * automatically.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>

extern char tiffs_prog_pathname[];

char *imgfile;
char *aopt, *ropt;
char **passon_argv;
int passon_argc;
int output_argc;
char **output_argv;

main(argc, argv)
	char **argv;
{
	extern int optind;
	extern char *optarg;
	int c;
	char **sp, **dp;

	while ((c = getopt(argc, argv, "+a:r:")) != EOF)
		switch (c) {
		case 'a':
			aopt = optarg;
			continue;
		case 'r':
			ropt = optarg;
			continue;
		default:
usage:			fprintf(stderr,
			"usage: %s [global-options] <imgfile> <op> ...\n",
				argv[0]);
			exit(1);
		}
	if (argc - optind < 2)
		goto usage;
	imgfile = argv[optind++];
	passon_argv = argv + optind;
	passon_argc = argc - optind;

	output_argc = passon_argc + 3;
	if (aopt)
		output_argc += 2;
	if (ropt)
		output_argc += 2;
	output_argv = malloc(sizeof(char *) * (output_argc + 1));
	if (!output_argv) {
		perror("malloc for tiffs argument list");
		exit(1);
	}
	dp = output_argv;
	*dp++ = "tiffs";
	if (aopt) {
		*dp++ = "-a";
		*dp++ = aopt;
	}
	if (ropt) {
		*dp++ = "-r";
		*dp++ = ropt;
	}
	*dp++ = imgfile;
	*dp++ = "256x18";
	for (sp = passon_argv; *sp; sp++)
		*dp++ = *sp;
	*dp = 0;
	execvp(tiffs_prog_pathname, output_argv);
	perror(tiffs_prog_pathname);
	exit(1);
}