BBN-Vax-TCP/src/libbbn/cmderr.c

#include "stdio.h"
/* -------------------------- _ C M D E R R ------------------------- */
/*
 * _cmderr(func, errno, progname, printargs) writes an error message
 * of the form
 *	progname: user_info errmsg.
 * on file descriptor 2. "errmsg" is obtained from the "errno"
 * argument; if "errno" is zero, it is null. "user_info" is printed by passing
 * the vector "printargs" on to printf. Whatever terminates the
 * user_info string (\r\n or \n) is moved to the end of the entire message.
 */
_cmderr(progname, eno, printargs)
    int eno;
    char * printargs[];
{
    register char * term;
    char * format;
    register char * fmt_end;
    char *errmsg();

    if (progname != 0)
	fprintf(stderr, "%s: ", progname);

    if (eno != 0)
    {
	format = printargs[0];
	fmt_end = &format[slength(format)-1];
	if (fmt_end[0] == '\n' && fmt_end[-1] == '\r')
	{
	    fmt_end[-1] = '\0';
	    term = "\r\n";
	}
	else if (fmt_end[0]  == '\n')
	{
	    fmt_end[0] = '\0';
	    term = "\n";
	}
	else
	    term = "";
    }
    fprintf(stderr, "%r", printargs);
    if (eno != 0)
    {
	fprintf(stderr, " %s.%s", errmsg(eno), term);
	if (seq(term, "\n"))
	    fmt_end[0] = '\n';
	else if (seq(term, "\r\n"))
	{
	    fmt_end[-1] = '\r';
	    fmt_end[0] = '\n';
	}
    }
}

/* -------------------------- C M D E R R --------------------------- */
/*
 * Call _cmderr.
 */

/* VARARGS2 */
cmderr(eno, pfargs)
    int eno;
    char * pfargs;
{
    extern char * progname;

    _cmderr(progname, eno, &pfargs);
}

/* -------------------------- E C M D E R R ------------------------- */
/*
 * Like cmderr, but exit afterwards.
 */

/* VARARGS2 */
ecmderr(eno, pfargs)
    int eno;
    char *pfargs;
{
    extern char * progname;

    _cmderr(progname, eno, &pfargs);
    if (eno == 0)
	exit(-1);
    else
	exit(eno);
}

/* -------------------------- R C M D E R R ------------------------- */
/*
 * Like cmderr, but reset afterwards.
 */

/* VARARGS2 */
rcmderr(eno, pfargs)
    int eno;
    char * pfargs;
{
    extern char * progname;

    _cmderr(progname, eno, &pfargs);
    reset(1);	/* The argument is required by VAX version of reset (arrgh!) */
}

/* -------------------------- A C M D E R R ------------------------- */
/*
 * Like cmderr, but aborts afterwards.  This routine calls
 * '_cleanup()' to flush buffers before the abort.
 */

/* VARARGS2 */
acmderr(eno, pfargs)
int   eno;
char *pfargs;
{
    extern char * progname;

    _cmderr(progname, eno, &pfargs);
    _cleanup();
    abort();
}


/* ------------------------ _ A C M D E R R ------------------------- */
/*
 * Like cmderr, but aborts afterwards.  This routine has a companion
 * function 'acmderr()' in a file of that name.  That function is 
 * is similar, but does a '_cleanup()' to flush buffers before the
 * abort.  It is not included here because some people are not using
 * stdio.
 */

/* VARARGS2 */
_acmderr(eno, pfargs)
int   eno;
char *pfargs;
{
    extern char * progname;

    _cmderr(progname, eno, &pfargs);
    fflush(stderr);                     /* Make sure the error gets printed */
    abort();
}


char * progname;    /* Simplifies its use in programs */