view ffstools/tiffs-wrappers/tiffs-8m.c @ 784:839bf41e7be0

simagent: X command parsing bugfix
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 13 Mar 2021 22:08:48 +0000
parents 8e7f6cca385b
children
line wrap: on
line source

/*
 * tiffs-8m is a wrapper around tiffs similar to mokoffs: we pass the user's
 * command along, together with any options, but insert the 64x15 FFS
 * organization argument automatically, and translate -f into -o0x700000.
 */

#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;
int fflag, Oflag;
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:fOr:")) != EOF)
		switch (c) {
		case 'a':
			aopt = optarg;
			continue;
		case 'f':
			fflag++;
			continue;
		case 'O':
			Oflag++;
			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 (fflag)
		output_argc++;
	if (Oflag)
		output_argc++;
	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 (fflag)
		*dp++ = "-o0x700000";
	if (Oflag)
		*dp++ = "-O";
	if (aopt) {
		*dp++ = "-a";
		*dp++ = aopt;
	}
	if (ropt) {
		*dp++ = "-r";
		*dp++ = ropt;
	}
	*dp++ = imgfile;
	*dp++ = "64x15";
	for (sp = passon_argv; *sp; sp++)
		*dp++ = *sp;
	*dp = 0;
	execvp(tiffs_prog_pathname, output_argv);
	perror(tiffs_prog_pathname);
	exit(1);
}