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 "com_err.h"
9 #include "mit-sipb-copyright.h"
10 #include "error_table.h"
11 #include "internal.h"
12
13 #if !defined(__STDC__) && !defined(STDARG_PROTOTYPES)
14 #include <varargs.h>
15 #define VARARGS
16 #endif
17
18 static void
19 #ifdef __STDC__
20     default_com_err_proc (const char *whoami, errcode_t code, const
21                           char *fmt, va_list args)
22 #else
23     default_com_err_proc (whoami, code, fmt, args)
24     const char *whoami;
25     errcode_t code;
26     const char *fmt;
27     va_list args;
28 #endif
29 {
30     if (whoami) {
31         fputs(whoami, stderr);
32         fputs(": ", stderr);
33     }
34     if (code) {
35         fputs(error_message(code), stderr);
36         fputs(" ", stderr);
37     }
38     if (fmt) {
39         vfprintf (stderr, fmt, args);
40     }
41     /* should do this only on a tty in raw mode */
42     putc('\r', stderr);
43     putc('\n', stderr);
44     fflush(stderr);
45 }
46
47 #ifdef __STDC__
48 typedef void (*errf) (const char *, errcode_t, const char *, va_list);
49 #else
50 typedef void (*errf) ();
51 #endif
52
53 errf com_err_hook = default_com_err_proc;
54
55 #ifdef __STDC__
56 void com_err_va (const char *whoami, errcode_t code, const char *fmt,
57                  va_list args)
58 #else
59 void com_err_va (whoami, code, fmt, args)
60     const char *whoami;
61     errcode_t code;
62     const char *fmt;
63     va_list args;
64 #endif
65 {
66     (*com_err_hook) (whoami, code, fmt, args);
67 }
68
69 #ifndef VARARGS
70 void com_err (const char *whoami,
71               errcode_t code,
72               const char *fmt, ...)
73 {
74 #else
75 void com_err (va_alist)
76     va_dcl
77 {
78     const char *whoami, *fmt;
79     errcode_t code;
80 #endif
81     va_list pvar;
82
83     if (!com_err_hook)
84         com_err_hook = default_com_err_proc;
85 #ifdef VARARGS
86     va_start (pvar);
87     whoami = va_arg (pvar, const char *);
88     code = va_arg (pvar, errcode_t);
89     fmt = va_arg (pvar, const char *);
90 #else
91     va_start(pvar, fmt);
92 #endif
93     com_err_va (whoami, code, fmt, pvar);
94     va_end(pvar);
95 }
96
97 errf set_com_err_hook (new_proc)
98     errf new_proc;
99 {
100     errf x = com_err_hook;
101
102     if (new_proc)
103         com_err_hook = new_proc;
104     else
105         com_err_hook = default_com_err_proc;
106
107     return x;
108 }
109
110 errf reset_com_err_hook () {
111     errf x = com_err_hook;
112     com_err_hook = default_com_err_proc;
113     return x;
114 }