/*	@(#)error.c	1.1	1/26/85	*/

#include "kermit.h"
#include "errors.h"

/*
 *	Externals defined in library.
 */
 
extern int errno;			/* System error return code */
#ifdef unix
extern char *sys_errlist[];		/* Array of error messages */
extern int sys_nerr;			/* Size of sys_errlist[] */
#endif
extern VOID exit ();			/* Close files and exit */
extern int fprintf ();			/* Formatted print to stream */

/*
 *	Local functions.
 */
 
static VOID Perror ();


/*VARARGS1*/
VOID Error (error, arg1)
int error;
char *arg1;
{
    DBUG_ENTER ("Error");
    (VOID) fprintf (stderr, "kermit: ");
    switch (error) {
	case HOST_RAW: 
	    (VOID) fprintf (stderr, "can't set host tty to raw mode");
	    Perror ();
	    break;
	case REMOTE_RAW: 
	    (VOID) fprintf (stderr, "can't set remote tty to raw mode");
	    Perror ();
	    break;
	case HOST_COOKED: 
	    (VOID) fprintf (stderr, "can't restore host tty modes");
	    Perror ();
	    break;
	case REMOTE_COOKED: 
	    (VOID) fprintf (stderr, "can't restore remote tty modes");
	    Perror ();
	    break;
	case HOST_TCGETA: 
	    (VOID) fprintf (stderr, "can't get host tty modes");
	    Perror ();
	    break;
	case REMOTE_TCGETA: 
	    (VOID) fprintf (stderr, "can't get remote tty modes");
	    Perror ();
	    break;
	case REMTTY:
	    (VOID) fprintf (stderr, "can't open communication line %s", arg1);
	    Perror ();
	    break;
	case CONNECT:
	    (VOID) fprintf (stderr, "nothing to connect to.\n");
	    break;
	case PHOTO:
	    (VOID) fprintf (stderr, "can't open photo file %s", arg1);
	    Perror ();
	    break;
	case RCVFILE:
	    (VOID) fprintf (stderr, "can't create file %s", arg1);
	    Perror ();
	    break;
	case SPEED:
	    (VOID) fprintf (stderr, "bad line speed %d\n", arg1);
	    break;
	case MODE:
	    (VOID) fprintf (stderr, "must specify -c, -s, or -r\n");
	    break;
	case NOCONNECT:
	    (VOID) fprintf (stderr, "sorry, connect not implemented!\n");
	    break;
	default: 
	    (VOID) fprintf (stderr, "bug!, bad error code %d\n", error);
	    break;
    }
    (VOID) fflush (stderr);
    DBUG_VOID_RETURN;
}


VOID WrapUp (status)
int status;
{
    DBUG_ENTER ("Wrapup");
    exit (status);
    DBUG_VOID_RETURN;
}


static VOID Perror ()
{
#ifdef unix
    if (errno > sys_nerr) {
	(VOID) fprintf (stderr, ": !! bad errno %d !!\n", errno);
    } else {
	(VOID) fprintf (stderr, ": %s\n", sys_errlist[errno]);
    }
#else
    (VOID) fprintf (stderr, ": <unknown error %d>!\n", errno);
#endif	/* unix */
}
