Home | History | Annotate | Download | only in et
      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 }
    105