/*	$OpenBSD: main.c,v 1.10 2007/12/30 13:35:27 sobrado Exp $ */

/*
 * Smartcard commander.
 * Written by Jim Rees and others at University of Michigan.
 */

/*
 * copyright 2001
 * the regents of the university of michigan
 * all rights reserved
 *
 * permission is granted to use, copy, create derivative works
 * and redistribute this software and such derivative works
 * for any purpose, so long as the name of the university of
 * michigan is not used in any advertising or publicity
 * pertaining to the use or distribution of this software
 * without specific, written prior authorization.  if the
 * above copyright notice or any other identification of the
 * university of michigan is included in any copy of any
 * portion of this software, then the disclaimer below must
 * also be included.
 *
 * this software is provided as is, without representation
 * from the university of michigan as to its fitness for any
 * purpose, and without warranty by the university of
 * michigan of any kind, either express or implied, including
 * without limitation the implied warranties of
 * merchantability and fitness for a particular purpose. the
 * regents of the university of michigan shall not be liable
 * for any damages, including special, indirect, incidental, or
 * consequential damages, with respect to any claim arising
 * out of or in connection with the use of the software, even
 * if it has been or is hereafter advised of the possibility of
 * such damages.
 */

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <limits.h>
#include <string.h>
#include <errno.h>
#include <sectok.h>

#include "sc.h"

#define MAXTOKENS 300
#define CARDIOSIZE 200

void    onintr(int sigraised);

int     port, fd = -1, cla, sleepytime;
volatile sig_atomic_t interrupted;
FILE   *cmdf;

static void
usage(void)
{
	fprintf(stderr,
	    "usage: sectok [-0123] [-f scriptfile] [-s sleeptime] [command [arg ...]]\n");
	exit(1);
}

int
main(int argc, char *argv[])
{
	char    buf[_POSIX2_LINE_MAX], *scriptfile = NULL, *tp, *tv[MAXTOKENS];
	int     i, tc;

	tp = getenv("SCPORT");
	if (tp)
		port = atoi(tp);

	while ((i = getopt(argc, argv, "0123f:s:h")) != -1) {
		switch (i) {
		case '0':
		case '1':
		case '2':
		case '3':
			port = i - '0';
			break;
		case 'f':
			scriptfile = optarg;
			break;
		case 's':
			sleepytime = atoi(optarg);
			break;
		case 'h':
		default:
			usage();
			break;
		}
	}

	if (optind != argc) {
		/* Dispatch from command line */
		dispatch(argc - optind, &argv[optind]);
		exit(0);
	}
	if (scriptfile != NULL) {
		cmdf = fopen(scriptfile, "r");
		if (cmdf == NULL) {
			perror(scriptfile);
			exit(2);
		}
	} else
		cmdf = stdin;

	/* Interactive mode, or script file */

	signal(SIGINT, onintr);
#ifdef __OpenBSD__
	siginterrupt(SIGINT, 1);
#endif

	/* The Main Loop */
	while (1) {
		fflush(stdout);
		interrupted = 0;
		if (sleepytime)
			usleep(sleepytime * 1000);
		if (cmdf == stdin) {
			fprintf(stderr, "sectok> ");
			fflush(stderr);
		}
		if (!fgets(buf, sizeof buf, cmdf)) {
			putchar('\n');
			if (interrupted)
				continue;
			else
				break;
		}
		if (cmdf != stdin)
			printf("sectok> %s", buf);

		for ((tp = strtok(buf, " \t\n\r")), tc = 0; tp;
		    (tp = strtok(NULL, " \t\n\r")), tc++) {
			if (tc < MAXTOKENS - 1)
				tv[tc] = tp;
		}
		tv[tc] = NULL;

		dispatch(tc, tv);
	}

	quit(0, NULL);
	return 0;
}

void
onintr(int sigraised)
{
	interrupted++;
}