1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
/*++
/* NAME
/* msg_vstream 3
/* SUMMARY
/* report diagnostics to VSTREAM
/* SYNOPSIS
/* #include <msg_vstream.h>
/*
/* void msg_vstream_init(progname, stream)
/* const char *progname;
/* VSTREAM *stream;
/* DESCRIPTION
/* This module implements support to report msg(3) diagnostics
/* to a VSTREAM.
/*
/* msg_vstream_init() sets the program name that appears in each output
/* record, and directs diagnostics (see msg(3)) to the specified
/* VSTREAM. The \fIprogname\fR argument is not copied.
/* SEE ALSO
/* msg(3)
/* BUGS
/* No guarantee that long records are written atomically.
/* Only the last msg_vstream_init() call takes effect.
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
/* System libraries. */
#include <sys_defs.h>
#include <errno.h>
#include <stdlib.h> /* 44BSD stdarg.h uses abort() */
#include <stdarg.h>
/* Utility library. */
#include "vstream.h"
#include "msg.h"
#include "msg_output.h"
#include "msg_vstream.h"
/*
* Private state.
*/
static const char *msg_tag;
static VSTREAM *msg_stream;
/* msg_vstream_print - log diagnostic to VSTREAM */
static void msg_vstream_print(int level, const char *text)
{
static const char *level_text[] = {
"info", "warning", "error", "fatal", "panic",
};
if (level < 0 || level >= (int) (sizeof(level_text) / sizeof(level_text[0])))
msg_panic("invalid severity level: %d", level);
if (level == MSG_INFO) {
vstream_fprintf(msg_stream, "%s: %s\n",
msg_tag, text);
} else {
vstream_fprintf(msg_stream, "%s: %s: %s\n",
msg_tag, level_text[level], text);
}
vstream_fflush(msg_stream);
}
/* msg_vstream_init - initialize */
void msg_vstream_init(const char *name, VSTREAM *vp)
{
static int first_call = 1;
msg_tag = name;
msg_stream = vp;
if (first_call) {
first_call = 0;
msg_output(msg_vstream_print);
}
}
|