#include "kermit.h"

/*
 *      K e r m i t
 *
 *      Main routine - parse command and options, set up the
 *      tty lines, and dispatch to the appropriate routine.
 */

main(argc,argv)
int argc;
char **argv;
{
  char *remtty,*cp;
  int speed, cflg, rflg, sflg;

  if (argc < 2) usage();

  cp = *++argv; argv++; argc -= 2;		/* set up pointers to args */

  eol = CR;					/* other kermit expects this */
  quote = MYQUOTE;				/* standard quote char "#" */
  pad = 0;					/* no padding */
  padchar = NULL;				/* use null if some wanted */

  speed = cflg = sflg = rflg = 0;               /* turn off all flags */
  remtty = 0;                                   /* default is host mode */
  image = FALSE;				/* default to 8-bit mode */
  escchr = BRKCHR;                              /* default esc char */
 
  while ((*cp) != NULL)
    switch (*cp++)
     {
      case '-': break;
      case 'c': cflg++; break;                  /* connect command */
      case 's': sflg++; break;                  /* send command */
      case 'r': rflg++; break;                  /* receive command */
      case 'e': if (argc--)                     /* specify escape char */
                  escchr = atoi(*argv++);       /*  as ascii decimal number */
                else usage();
                if (debug) fprintf(stderr,"escape char is ascii %d\n",escchr);
                break;
      case 'l': if (argc--)                     /* specify tty line to use */
                  remtty = *argv++;
                else usage(); 
                if (debug) fprintf(stderr,"line %s\n",remtty); 
                break;
      case 'b': if (argc--)                     /* specify baud rate */
                  speed = atoi(*argv++);
                else usage(); 
                if (debug) fprintf(stderr,"speed %d\n",speed);
                break;
      case 'i': image = TRUE; break;		/* image (8-bit) mode */
      case 'd': debug = TRUE; break;            /* debug mode */
     }

  /* only one command allowed, for now */

  if ((cflg+sflg+rflg) != 1) usage();

  if (remtty) 
   {
    remfd = open(remtty,2);                     /* we're a remote kermit, so */
    if (remfd < 0)                              /*  set up the tty line */ 
     {
      fprintf(stderr,"Kermit: cannot open %s\n",remtty);
      exit(-1);
     }
    host = FALSE;
   }
  else
   {
     remfd = 0;                                 /* we're a host kermit */
     host = TRUE;
   }

  gtty(0,&cookedmode);  /* save tty mode so we can restore it later */
  gtty(0,&rawmode);     /* rawmode is used during connect, send, receive */

  rawmode.sg_flags |= (RAW|TANDEM);
  rawmode.sg_flags &= ~(ECHO|CRMOD);

  gtty(remfd,&remttymode);      /* if remote kermit, get remote tty mode */

  remttymode.sg_flags |= (RAW|TANDEM);
  remttymode.sg_flags &= ~(ECHO|CRMOD);

  if (speed)                    /* user specified a speed? */
   {
    switch(speed)               /* get internal system code */
     {
        case 110: speed = B110; break;
        case 150: speed = B150; break;
        case 300: speed = B300; break;
        case 1200: speed = B1200; break;
        case 2400: speed = B2400; break;
        case 4800: speed = B4800; break;
        case 9600: speed = B9600; break; 
        default: fprintf(stderr,"bad line speed\n");
     }
    remttymode.sg_ispeed = speed;
    remttymode.sg_ospeed = speed;
   }
  if (remfd) stty(remfd,&remttymode);

  if (cflg) connect();                  /* connect command */

  if (sflg)                             /* send command */ 
   {
    if (argc--) filnam = *argv++;
      else usage();
    filelist = argv;
    if (host) stty(0,&rawmode);
    if (sendsw() == FALSE)
      printf("Send failed.\n");
    else
      printf("OK\n");
    if (host) stty(0,&cookedmode);
   }

  if (rflg)                             /* receive command */
   {
    if (host) stty(0,&rawmode);
    if (recsw() == FALSE)
      printf("Receive failed.\n");
    else
      printf("OK\n");
    if (host) stty(0,&cookedmode);
   }
 }

usage()
{
  fprintf(stderr,
     "usage: kermit [csr][di][lbe] [line] [baud] [esc char] [f1 f2 ...]\n");
  exit();
}
