Import Upstream version 1.8.5
[hcoop/debian/openafs.git] / src / comerr / com_err.c
1 /*
2 * Copyright 1987, 1988 by MIT Student Information Processing Board.
3 *
4 * For copyright info, see mit-sipb-cr.h.
5 */
6
7 #include <afsconfig.h>
8 #include <afs/param.h>
9
10 #include <roken.h>
11
12 #include "internal.h"
13 #include "error_table.h"
14 #include "com_err.h"
15
16 static void
17 default_com_err_proc(const char *whoami, afs_int32 code, const char *fmt,
18 va_list args)
19 {
20 if (whoami) {
21 fputs(whoami, stderr);
22 fputs(": ", stderr);
23 }
24 if (code) {
25 fputs(afs_error_message(code), stderr);
26 fputs(" ", stderr);
27 }
28 if (fmt) {
29 vfprintf(stderr, fmt, args);
30 }
31 putc('\n', stderr);
32 /* should do this only on a tty in raw mode */
33 putc('\r', stderr);
34 fflush(stderr);
35 }
36
37 typedef void (*errf) (const char *, afs_int32, const char *, va_list);
38
39 static errf com_err_hook = default_com_err_proc;
40
41 void
42 afs_com_err_va(const char *whoami, afs_int32 code, const char *fmt, va_list args)
43 {
44 (*com_err_hook) (whoami, code, fmt, args);
45 }
46
47 void
48 afs_com_err(const char *whoami, afs_int32 code, const char *fmt, ...)
49 {
50 va_list pvar;
51
52 if (!com_err_hook)
53 com_err_hook = default_com_err_proc;
54 va_start(pvar, fmt);
55 afs_com_err_va(whoami, code, fmt, pvar);
56 va_end(pvar);
57 }
58
59 errf
60 afs_set_com_err_hook(errf new_proc)
61 {
62 errf x = com_err_hook;
63 if (new_proc)
64 com_err_hook = new_proc;
65 else
66 com_err_hook = default_com_err_proc;
67 return x;
68 }
69
70 errf
71 afs_reset_com_err_hook(void)
72 {
73 errf x = com_err_hook;
74 com_err_hook = default_com_err_proc;
75 return x;
76 }