1 /* 2 * Copyright 1987, 1988 by MIT Student Information Processing Board. 3 * 4 * Permission to use, copy, modify, and distribute this software and 5 * its documentation for any purpose is hereby granted, provided that 6 * the names of M.I.T. and the M.I.T. S.I.P.B. not be used in 7 * advertising or publicity pertaining to distribution of the software 8 * without specific, written prior permission. M.I.T. and the 9 * M.I.T. S.I.P.B. make no representations about the suitability of 10 * this software for any purpose. It is provided "as is" without 11 * express or implied warranty. 12 */ 13 14 #include "config.h" 15 #include <stdio.h> 16 #ifdef HAVE_TERMIOS_H 17 #include <termios.h> 18 #endif 19 #ifdef HAVE_UNISTD_H 20 #include <unistd.h> 21 #endif 22 #include "com_err.h" 23 #include "error_table.h" 24 #include "internal.h" 25 26 static void 27 default_com_err_proc (const char *whoami, errcode_t code, const 28 char *fmt, va_list args) 29 COM_ERR_ATTR((format(printf, 3, 0))); 30 31 static void 32 default_com_err_proc (const char *whoami, errcode_t code, const 33 char *fmt, va_list args) 34 { 35 int do_cr = 1, fd = fileno(stderr); 36 37 if (whoami) { 38 fputs(whoami, stderr); 39 fputs(": ", stderr); 40 } 41 if (code) { 42 fputs(error_message(code), stderr); 43 fputs(" ", stderr); 44 } 45 if (fmt) { 46 vfprintf (stderr, fmt, args); 47 } 48 if (!isatty(fd)) 49 do_cr = 0; 50 #ifdef HAVE_TERMIOS_H 51 else { 52 struct termios t; 53 54 if ((tcgetattr(fd, &t)) == 0 && 55 (t.c_oflag & OPOST) && (t.c_oflag & ONLCR)) 56 do_cr = 0; 57 } 58 #endif 59 if (do_cr) 60 fputc('\r', stderr); 61 fputc('\n', stderr); 62 fflush(stderr); 63 } 64 65 typedef void (*errf) (const char *, errcode_t, const char *, va_list); 66 67 errf com_err_hook = default_com_err_proc; 68 69 void com_err_va (const char *whoami, errcode_t code, const char *fmt, 70 va_list args) 71 { 72 (*com_err_hook) (whoami, code, fmt, args); 73 } 74 75 void com_err (const char *whoami, 76 errcode_t code, 77 const char *fmt, ...) 78 { 79 va_list pvar; 80 81 if (!com_err_hook) 82 com_err_hook = default_com_err_proc; 83 va_start(pvar, fmt); 84 com_err_va (whoami, code, fmt, pvar); 85 va_end(pvar); 86 } 87 88 errf set_com_err_hook(errf new_proc) 89 { 90 errf x = com_err_hook; 91 92 if (new_proc) 93 com_err_hook = new_proc; 94 else 95 com_err_hook = default_com_err_proc; 96 97 return x; 98 } 99 100 errf reset_com_err_hook(void) { 101 errf x = com_err_hook; 102 com_err_hook = default_com_err_proc; 103 return x; 104 }