view loadtools/ltmain.c @ 777:0cffc53991f9

simagent: bugfix in hex string arg parsing function
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 12 Mar 2021 23:58:15 +0000
parents 752aef91cc95
children
line wrap: on
line source

/*
 * This module contains the main() function for fc-loadtool
 */

#include <sys/types.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include "srecreader.h"

char *target_ttydev;

extern struct srecreader iramimage;
extern char default_loadagent_image[];
extern char hw_init_script[];
extern void (*default_exit)();

extern struct baudrate *find_baudrate_by_name();

static struct baudrate *reattach, *batch_baud;

main(argc, argv)
	char **argv;
{
	extern char *optarg;
	extern int optind;
	int c;
	char command[512];
	char *batch_script;

	while ((c = getopt(argc, argv, "a:b:B:c:C:h:H:i:P:r:t:")) != EOF)
		switch (c) {
		case 'a':
			iramimage.filename = optarg;
			continue;
		case 'b':
			set_romload_baudrate(optarg);
			continue;
		case 'B':
			batch_baud = find_baudrate_by_name(optarg);
			if (!batch_baud)
				exit(1);	/* error msg already printed */
			continue;
		case 'c':
			set_compalstage_short(optarg);
			continue;
		case 'C':
			set_compalstage_fullpath(optarg);
			continue;
		case 'h':
			read_hwparam_file_shortname(optarg);
			continue;
		case 'H':
			read_hwparam_file_fullpath(optarg);
			continue;
		case 'i':
			set_beacon_interval(optarg);
			continue;
		case 'P':
			if (find_bootctrl_entry(optarg) < 0)
				exit(1);	/* error msg already printed */
			continue;
		case 'r':
			reattach = find_baudrate_by_name(optarg);
			if (!reattach)
				exit(1);	/* error msg already printed */
			continue;
		case 't':
			set_romload_timeout(optarg);
			continue;
		case '?':
		default:
usage:			fprintf(stderr,
		"usage: fc-loadtool [options] ttyport [batch command]\n");
			exit(1);
		}
	if (argc - optind < 1)
		goto usage;
	target_ttydev = argv[optind];
	if (!iramimage.filename)
		iramimage.filename = default_loadagent_image;
	if (argc - optind > 1) {
		if (reattach) {
			fprintf(stderr,
			"error: -r option and batch mode are incompatible\n");
			exit(1);
		}
		if (argc - optind == 2)
			batch_script = argv[optind+1];
		else if (!strcmp(argv[optind+1], "exec")) {
			if (argc - optind == 3)
				batch_script = argv[optind+2];
			else
				goto invalid_batch;
		} else if (!strcmp(argv[optind+1], "flash") ||
			   !strcmp(argv[optind+1], "flash2"))
			batch_script = 0;
		else {
invalid_batch:		fprintf(stderr,
				"error: non-understood batch mode command\n");
			exit(1);
		}
	}

	open_serial_port(target_ttydev);
	if (reattach)
		set_serial_baudrate(reattach);
	else {
		pwon_if_needed();
		perform_compal_stage();
		perform_romload();
		putchar('\n');
		if (tpinterf_pass_output(1) < 0)
			exit(1);
		putchar('\n');
		if (hw_init_script[0]) {
			printf("Executing init script %s\n", hw_init_script);
			c = loadtool_exec_script(hw_init_script, 1);
		} else
			c = 0;
		if (argc - optind > 1) {
			if (c)
				exit(1);
			if (batch_baud) {
				c = loadagent_switch_baud(batch_baud);
				if (c)
					exit(1);
			}
			if (batch_script) {
				printf("Executing command script %s\n",
					batch_script);
				c = loadtool_exec_script(batch_script, 0);
			} else {
				printf("Executing batch command\n");
				c = cmd_flash(argc - optind - 1,
					      argv + optind + 1);
			}
			if (c)
				exit(1);
			default_exit(0);
		}
	}
	for (;;) {
		if (isatty(0)) {
			fputs("loadtool> ", stdout);
			fflush(stdout);
		}
		if (!fgets(command, sizeof command, stdin))
			default_exit(0);
		loadtool_dispatch_cmd(command, 0);
	}
}