view rvinterf/g23sh/main.c @ 635:658a83ff7221

gsm-fw/sysglue/flashboot.S: buglet in the previous change
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Mon, 01 Sep 2014 18:45:37 +0000
parents 922efdd65dce
children
line wrap: on
line source

/*
 * This module contains the main() function for g23sh.
 */

#include <sys/types.h>
#include <sys/errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

char *socket_pathname = "/tmp/rvinterf_socket";
int ttyhacks, dflag;

int sock;

extern char *rvinterf_Bopt, *rvinterf_lopt, *rvinterf_wopt;

main(argc, argv)
	char **argv;
{
	extern int optind;
	extern char *optarg;
	int c;
	fd_set fds;

	while ((c = getopt(argc, argv, "B:dl:s:w:")) != EOF)
		switch (c) {
		case 'B':
			rvinterf_Bopt = optarg;
			continue;
		case 'd':
			dflag++;
			continue;
		case 'l':
			rvinterf_lopt = optarg;
			continue;
		case 's':
			socket_pathname = optarg;
			continue;
		case 'w':
			rvinterf_wopt = optarg;
			continue;
		case '?':
		default:
usage:			fprintf(stderr,
				"usage: %s [options] [ttyport]\n", argv[0]);
			exit(1);
		}
	switch (argc - optind) {
	case 0:
		if (rvinterf_Bopt || rvinterf_lopt || rvinterf_wopt) {
			fprintf(stderr,
      "%s: -B, -l and -w options are meaningful only when launching rvinterf\n",
				argv[0]);
			exit(1);
		}
		break;
	case 1:
		launch_rvinterf(argv[optind]);
		break;
	default:
		goto usage;
	}

	ttyhacks = isatty(0) && !dflag;
	init();
	tty_init();
	for (;;) {
		FD_ZERO(&fds);
		FD_SET(0, &fds);
		FD_SET(sock, &fds);
		c = select(sock+1, &fds, 0, 0, 0);
		if (c < 0) {
			if (errno == EINTR)
				continue;
			tty_cleanup();
			perror("select");
			exit(1);
		}
		if (FD_ISSET(0, &fds))
			handle_tty_input();
		if (FD_ISSET(sock, &fds))
			handle_rvinterf_input();
		fflush(stdout);
	}
}