| /* |
| ** |
| ** halt.c |
| ** |
| ** src/tools/entab/halt.c |
| ** |
| ** This is used to print out error messages and exit |
| */ |
| |
| #include <stdarg.h> |
| #include <signal.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <errno.h> |
| |
| |
| /*------------------------------------------------------------------------- |
| ** |
| ** halt - print error message, and call clean up routine or exit |
| ** |
| **------------------------------------------------------------------------*/ |
| |
| /*VARARGS*/ |
| void |
| halt(const char *format,...) |
| { |
| va_list arg_ptr; |
| const char *pstr; |
| void (*sig_func) (); |
| |
| va_start(arg_ptr, format); |
| if (strncmp(format, "PERROR", 6) != 0) |
| vfprintf(stderr, format, arg_ptr); |
| else |
| { |
| for (pstr = format + 6; *pstr == ' ' || *pstr == ':'; pstr++) |
| ; |
| vfprintf(stderr, pstr, arg_ptr); |
| perror(""); |
| } |
| va_end(arg_ptr); |
| fflush(stderr); |
| |
| /* call one clean up function if defined */ |
| if ((sig_func = signal(SIGTERM, SIG_DFL)) != SIG_DFL && |
| sig_func != SIG_IGN) |
| (*sig_func) (0); |
| else if ((sig_func = signal(SIGHUP, SIG_DFL)) != SIG_DFL && |
| sig_func != SIG_IGN) |
| (*sig_func) (0); |
| else if ((sig_func = signal(SIGINT, SIG_DFL)) != SIG_DFL && |
| sig_func != SIG_IGN) |
| (*sig_func) (0); |
| else if ((sig_func = signal(SIGQUIT, SIG_DFL)) != SIG_DFL && |
| sig_func != SIG_IGN) |
| (*sig_func) (0); |
| exit(1); |
| } |