Whamcloud - gitweb
Many files:
[tools/e2fsprogs.git] / lib / et / com_err.c
1 /*
2  * Copyright 1987, 1988 by MIT Student Information Processing Board.
3  *
4  * For copyright info, see mit-sipb-copyright.h.
5  */
6
7 #include <stdio.h>
8 #include "mit-sipb-copyright.h"
9
10 #if __STDC__ || defined(STDARG_PROTOTYPES)
11 #include <stdarg.h>
12 #else
13 #include <varargs.h>
14 #define VARARGS
15 #endif
16
17 #include "error_table.h"
18 #include "internal.h"
19
20 #ifdef notdef
21 /*
22  * Protect us from header version (externally visible) of com_err, so
23  * we can survive in a <varargs.h> environment.  I think.
24  */
25 #define com_err com_err_external
26 #include "com_err.h"
27 #undef com_err
28 #else
29 #include "com_err.h"
30 #endif
31
32 #if ! lint
33 static const char rcsid[] =
34     "$Header$";
35 #endif  /* ! lint */
36
37 static void
38 #ifdef __STDC__
39     default_com_err_proc (const char *whoami, long code, const char *fmt, va_list args)
40 #else
41     default_com_err_proc (whoami, code, fmt, args)
42     const char *whoami;
43     long code;
44     const char *fmt;
45     va_list args;
46 #endif
47 {
48     if (whoami) {
49         fputs(whoami, stderr);
50         fputs(": ", stderr);
51     }
52     if (code) {
53         fputs(error_message(code), stderr);
54         fputs(" ", stderr);
55     }
56     if (fmt) {
57         vfprintf (stderr, fmt, args);
58     }
59     putc('\n', stderr);
60     /* should do this only on a tty in raw mode */
61     putc('\r', stderr);
62     fflush(stderr);
63 }
64
65 #ifdef __STDC__
66 typedef void (*errf) (const char *, long, const char *, va_list);
67 #else
68 typedef void (*errf) ();
69 #endif
70
71 errf com_err_hook = default_com_err_proc;
72
73 void com_err_va (whoami, code, fmt, args)
74     const char *whoami;
75     long code;
76     const char *fmt;
77     va_list args;
78 {
79     (*com_err_hook) (whoami, code, fmt, args);
80 }
81
82 #ifndef VARARGS
83 void com_err (const char *whoami,
84               long code,
85               const char *fmt, ...)
86 {
87 #else
88 void com_err (va_alist)
89     va_dcl
90 {
91     const char *whoami, *fmt;
92     long code;
93 #endif
94     va_list pvar;
95
96     if (!com_err_hook)
97         com_err_hook = default_com_err_proc;
98 #ifdef VARARGS
99     va_start (pvar);
100     whoami = va_arg (pvar, const char *);
101     code = va_arg (pvar, long);
102     fmt = va_arg (pvar, const char *);
103 #else
104     va_start(pvar, fmt);
105 #endif
106     com_err_va (whoami, code, fmt, pvar);
107     va_end(pvar);
108 }
109
110 errf set_com_err_hook (new_proc)
111     errf new_proc;
112 {
113     errf x = com_err_hook;
114
115     if (new_proc)
116         com_err_hook = new_proc;
117     else
118         com_err_hook = default_com_err_proc;
119
120     return x;
121 }
122
123 errf reset_com_err_hook () {
124     errf x = com_err_hook;
125     com_err_hook = default_com_err_proc;
126     return x;
127 }