/*
 * The contents of this file are subject to the AOLserver Public License
 * Version 1.1 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://aolserver.com/.
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
 * the License for the specific language governing rights and limitations
 * under the License.
 *
 * The Original Code is AOLserver Code and related documentation
 * distributed by AOL.
 * 
 * The Initial Developer of the Original Code is America Online,
 * Inc. Portions created by AOL are Copyright (C) 1999 America Online,
 * Inc. All Rights Reserved.
 *
 * Alternatively, the contents of this file may be used under the terms
 * of the GNU General Public License (the "GPL"), in which case the
 * provisions of GPL are applicable instead of those above.  If you wish
 * to allow use of your version of this file only under the terms of the
 * GPL and not to allow others to use your version of this file under the
 * License, indicate your decision by deleting the provisions above and
 * replace them with the notice and other provisions required by the GPL.
 * If you do not delete the provisions above, a recipient may use your
 * version of this file under either the License or the GPL.
 */


/* 
 * error.c --
 *
 *	Routines for dealing with fatal errors.
 */

static const char *RCSID = "@(#) $Header: /cvsroot/aolserver/aolserver/thread/error.c,v 1.3 2000/08/02 23:38:25 kriston Exp $, compiled: " __DATE__ " " __TIME__;

#include "thread.h"

static void ErrorMsg(char *fmt, va_list *apPtr);


/*
 *----------------------------------------------------------------------
 *
 * NsThreadAbort --
 *
 *	Print an error message and abort the process, causing a core
 *	dump.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Process is aborted.
 *
 *----------------------------------------------------------------------
 */

void
NsThreadAbort(char *fmt, ...)
{
    va_list ap;

    va_start(ap, fmt);
    ErrorMsg(fmt, &ap);
    va_end(ap);
    abort();
}


/*
 *----------------------------------------------------------------------
 *
 * NsThreadError --
 *
 *	Print an error message.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Process is aborted.
 *
 *----------------------------------------------------------------------
 */

void
NsThreadError(char *fmt, ...)
{
    va_list ap;

    va_start(ap, fmt);
    ErrorMsg(fmt, &ap);
    va_end(ap);
}


/*
 *----------------------------------------------------------------------
 *
 * NsThreadFatal --
 *
 *	Call NsThreadAbort when an operating system function fails.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Process is aborted through NsThreadAbort.
 *
 *----------------------------------------------------------------------
 */

void
NsThreadFatal(char *nsName, char *osName, int errCode)
{
#ifdef WIN32
    NsThreadAbort("%s failed in %s: error code: %d", osName, nsName, errCode);
#else
    NsThreadAbort("%s failed in %s: %s", osName, nsName, strerror(errCode));
#endif
}


/*
 *----------------------------------------------------------------------
 *
 * ErrorMsg --
 *
 *	Helper routine for NsThreadAbort and NsThreadError.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

static void
ErrorMsg(char *fmt, va_list *apPtr)
{
    fflush(stdout);
    fprintf(stderr, "nsthread(%d) error: ", (int) getpid());
    vfprintf(stderr, fmt, *apPtr);
    fprintf(stderr, "\n");
    fflush(stderr);
}
