105 lines
2.9 KiB
C
105 lines
2.9 KiB
C
/* Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */
|
|
/* Copyright (c) 1988 AT&T */
|
|
/* All Rights Reserved */
|
|
|
|
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF */
|
|
/* UNIX System Laboratories, Inc. */
|
|
/* The copyright notice above does not evidence any */
|
|
/* actual or intended publication of such source code. */
|
|
|
|
#ident "@(#)sccs:lib/mpwlib/fatal.c 6.5.1.1"
|
|
# include "sys/types.h"
|
|
# include "macros.h"
|
|
# include "fatal.h"
|
|
|
|
/*
|
|
General purpose error handler.
|
|
Typically, low level subroutines which detect error conditions
|
|
(an open or create routine, for example) return the
|
|
value of calling fatal with an appropriate error message string.
|
|
E.g., return(fatal("can't do it"));
|
|
Higher level routines control the execution of fatal
|
|
via the global word Fflags.
|
|
The macros FSAVE and FRSTR in <fatal.h> can be used by higher
|
|
level subroutines to save and restore the Fflags word.
|
|
|
|
The argument to fatal is a pointer to an error message string.
|
|
The action of this routine is driven completely from
|
|
the "Fflags" global word (see <fatal.h>).
|
|
The following discusses the interpretation of the various bits
|
|
of Fflags.
|
|
|
|
The FTLMSG bit controls the writing of the error
|
|
message on file descriptor 2. The message is preceded
|
|
by the string "ERROR: ", unless the global character pointer
|
|
"Ffile" is non-zero, in which case the message is preceded
|
|
by the string "ERROR [<Ffile>]: ". A newline is written
|
|
after the user supplied message.
|
|
|
|
If the FTLCLN bit is on, clean_up is called with an
|
|
argument of 0 (see clean.c).
|
|
|
|
If the FTLFUNC bit is on, the function pointed to by the global
|
|
function pointer "Ffunc" is called with the user supplied
|
|
error message pointer as argument.
|
|
(This feature can be used to log error messages).
|
|
|
|
The FTLACT bits determine how fatal should return.
|
|
If the FTLJMP bit is on longjmp(Fjmp, 1) is
|
|
called (Fjmp is a global vector of 10 words, see
|
|
setjmp, longjmp documentation).
|
|
|
|
If the FTLEXIT bit is on the value of userexit(1) is
|
|
passed as an argument to exit(II)
|
|
(see userexit.c).
|
|
|
|
If none of the FTLACT bits are on
|
|
(the default value for Fflags is 0), the global word
|
|
"Fvalue" (initialized to -1) is returned.
|
|
|
|
If all fatal globals have their default values, fatal simply
|
|
returns -1.
|
|
*/
|
|
|
|
int Fcnt;
|
|
int Fflags;
|
|
char *Ffile;
|
|
int Fvalue = -1;
|
|
int (*Ffunc)();
|
|
jmp_buf Fjmp;
|
|
|
|
int
|
|
fatal(msg)
|
|
char *msg;
|
|
{
|
|
void exit(), clean_up();
|
|
int userexit(), write();
|
|
unsigned strlen();
|
|
|
|
++Fcnt;
|
|
if (Fflags & FTLMSG) {
|
|
write(2,"ERROR",5);
|
|
if (Ffile) {
|
|
(void) write(2," [",2);
|
|
(void) write(2,Ffile,length(Ffile));
|
|
(void) write(2,"]",1);
|
|
}
|
|
(void) write(2,": ",2);
|
|
(void) write(2,msg,length(msg));
|
|
(void) write(2,"\n",1);
|
|
}
|
|
if (Fflags & FTLCLN)
|
|
clean_up(0);
|
|
if (Fflags & FTLFUNC)
|
|
(*Ffunc)(msg);
|
|
switch (Fflags & FTLACT) {
|
|
case FTLJMP:
|
|
longjmp(Fjmp, 1);
|
|
case FTLEXIT:
|
|
exit(userexit(1));
|
|
case FTLRET:
|
|
return(Fvalue);
|
|
}
|
|
return(-1);
|
|
}
|