~ubuntu-branches/ubuntu/dapper/postfix/dapper-security

« back to all changes in this revision

Viewing changes to src/util/msg.c

  • Committer: Bazaar Package Importer
  • Author(s): LaMont Jones
  • Date: 2005-02-27 09:33:07 UTC
  • Revision ID: james.westby@ubuntu.com-20050227093307-cn789t27ibnlh6tf
Tags: upstream-2.1.5
ImportĀ upstreamĀ versionĀ 2.1.5

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*++
 
2
/* NAME
 
3
/*      msg 3
 
4
/* SUMMARY
 
5
/*      diagnostic interface
 
6
/* SYNOPSIS
 
7
/*      #include <msg.h>
 
8
/*
 
9
/*      int     msg_verbose;
 
10
/*
 
11
/*      void    msg_info(format, ...)
 
12
/*      const char *format;
 
13
/*
 
14
/*      void    msg_warn(format, ...)
 
15
/*      const char *format;
 
16
/*
 
17
/*      void    msg_error(format, ...)
 
18
/*      const char *format;
 
19
/*
 
20
/*      NORETURN msg_fatal(format, ...)
 
21
/*      const char *format;
 
22
/*
 
23
/*      NORETURN msg_fatal_status(status, format, ...)
 
24
/*      int     status;
 
25
/*      const char *format;
 
26
/*
 
27
/*      NORETURN msg_panic(format, ...)
 
28
/*      const char *format;
 
29
/*
 
30
/*      MSG_CLEANUP_FN msg_cleanup(cleanup)
 
31
/*      void (*cleanup)(void);
 
32
/* AUXILIARY FUNCTIONS
 
33
/*      int     msg_error_limit(count)
 
34
/*      int     count;
 
35
/*
 
36
/*      void    msg_error_clear()
 
37
/* DESCRIPTION
 
38
/*      This module reports diagnostics. By default, diagnostics are sent
 
39
/*      to the standard error stream, but the disposition can be changed
 
40
/*      by the user. See the hints below in the SEE ALSO section.
 
41
/*
 
42
/*      msg_info(), msg_warn(), msg_error(), msg_fatal() and msg_panic()
 
43
/*      produce a one-line record with the program name, a severity code
 
44
/*      (except for msg_info()), and an informative message. The program
 
45
/*      name must have been set by calling one of the msg_XXX_init()
 
46
/*      functions (see the SEE ALSO section).
 
47
/*
 
48
/*      msg_error() reports a recoverable error and increments the error
 
49
/*      counter. When the error count exceeds a pre-set limit (default: 13)
 
50
/*      the program terminates by calling msg_fatal().
 
51
/*
 
52
/*      msg_fatal() reports an unrecoverable error and terminates the program
 
53
/*      with a non-zero exit status.
 
54
/*
 
55
/*      msg_fatal_status() reports an unrecoverable error and terminates the 
 
56
/*      program with the specified exit status.
 
57
/*
 
58
/*      msg_panic() reports an internal inconsistency, terminates the
 
59
/*      program immediately (i.e. without calling the optional user-specified
 
60
/*      cleanup routine), and forces a core dump when possible.
 
61
/*
 
62
/*      msg_cleanup() specifies a function that msg_fatal[_status]() should
 
63
/*      invoke before terminating the program, and returns the
 
64
/*      current function pointer. Specify a null argument to disable
 
65
/*      this feature.
 
66
/*
 
67
/*      msg_error_limit() sets the error message count limit, and returns.
 
68
/*      the old limit.
 
69
/*
 
70
/*      msg_error_clear() sets the error message count to zero.
 
71
/*
 
72
/*      msg_verbose is a global flag that can be set to make software
 
73
/*      more verbose about what it is doing. By default the flag is zero.
 
74
/*      By convention, a larger value means more noise.
 
75
/* SEE ALSO
 
76
/*      msg_output(3) specify diagnostics disposition
 
77
/*      msg_stdio(3) direct diagnostics to standard I/O stream
 
78
/*      msg_vstream(3) direct diagnostics to VSTREAM.
 
79
/*      msg_syslog(3) direct diagnostics to syslog daemon
 
80
/* BUGS
 
81
/*      Some output functions may suffer from intentional or accidental
 
82
/*      record length restrictions that are imposed by library routines
 
83
/*      and/or by the runtime environment.
 
84
/* LICENSE
 
85
/* .ad
 
86
/* .fi
 
87
/*      The Secure Mailer license must be distributed with this software.
 
88
/* AUTHOR(S)
 
89
/*      Wietse Venema
 
90
/*      IBM T.J. Watson Research
 
91
/*      P.O. Box 704
 
92
/*      Yorktown Heights, NY 10598, USA
 
93
/*--*/
 
94
 
 
95
/* System libraries. */
 
96
 
 
97
#include <sys_defs.h>
 
98
#include <stdlib.h>
 
99
#include <stdarg.h>
 
100
#include <unistd.h>
 
101
 
 
102
/* Application-specific. */
 
103
 
 
104
#include "msg.h"
 
105
#include "msg_output.h"
 
106
 
 
107
 /*
 
108
  * Default is verbose logging off.
 
109
  */
 
110
int     msg_verbose = 0;
 
111
 
 
112
 /*
 
113
  * Private state. The msg_exiting flag prevents us from recursively
 
114
  * reporting an error.
 
115
  */
 
116
static MSG_CLEANUP_FN msg_cleanup_fn = 0;
 
117
static int msg_exiting = 0;
 
118
static int msg_error_count = 0;
 
119
static int msg_error_bound = 13;
 
120
 
 
121
/* msg_info - report informative message */
 
122
 
 
123
void    msg_info(const char *fmt,...)
 
124
{
 
125
    va_list ap;
 
126
 
 
127
    va_start(ap, fmt);
 
128
    msg_vprintf(MSG_INFO, fmt, ap);
 
129
    va_end(ap);
 
130
}
 
131
 
 
132
/* msg_warn - report warning message */
 
133
 
 
134
void    msg_warn(const char *fmt,...)
 
135
{
 
136
    va_list ap;
 
137
 
 
138
    va_start(ap, fmt);
 
139
    msg_vprintf(MSG_WARN, fmt, ap);
 
140
    va_end(ap);
 
141
}
 
142
 
 
143
/* msg_error - report recoverable error */
 
144
 
 
145
void    msg_error(const char *fmt,...)
 
146
{
 
147
    va_list ap;
 
148
 
 
149
    va_start(ap, fmt);
 
150
    msg_vprintf(MSG_ERROR, fmt, ap);
 
151
    va_end(ap);
 
152
    if (++msg_error_count >= msg_error_bound)
 
153
        msg_fatal("too many errors - program terminated");
 
154
}
 
155
 
 
156
/* msg_fatal - report error and terminate gracefully */
 
157
 
 
158
NORETURN msg_fatal(const char *fmt,...)
 
159
{
 
160
    va_list ap;
 
161
 
 
162
    if (msg_exiting++ == 0) {
 
163
        va_start(ap, fmt);
 
164
        msg_vprintf(MSG_FATAL, fmt, ap);
 
165
        va_end(ap);
 
166
        if (msg_cleanup_fn)
 
167
            msg_cleanup_fn();
 
168
    }
 
169
    sleep(1);
 
170
    exit(1);
 
171
}
 
172
 
 
173
/* msg_fatal_status - report error and terminate gracefully */
 
174
 
 
175
NORETURN msg_fatal_status(int status, const char *fmt,...)
 
176
{
 
177
    va_list ap;
 
178
 
 
179
    if (msg_exiting++ == 0) {
 
180
        va_start(ap, fmt);
 
181
        msg_vprintf(MSG_FATAL, fmt, ap);
 
182
        va_end(ap);
 
183
        if (msg_cleanup_fn)
 
184
            msg_cleanup_fn();
 
185
    }
 
186
    sleep(1);
 
187
    exit(status);
 
188
}
 
189
 
 
190
/* msg_panic - report error and dump core */
 
191
 
 
192
NORETURN msg_panic(const char *fmt,...)
 
193
{
 
194
    va_list ap;
 
195
 
 
196
    if (msg_exiting++ == 0) {
 
197
        va_start(ap, fmt);
 
198
        msg_vprintf(MSG_PANIC, fmt, ap);
 
199
        va_end(ap);
 
200
    }
 
201
    sleep(1);
 
202
    abort();                                    /* Die! */
 
203
    exit(1);                                    /* DIE!! */
 
204
}
 
205
 
 
206
/* msg_cleanup - specify cleanup routine */
 
207
 
 
208
MSG_CLEANUP_FN msg_cleanup(MSG_CLEANUP_FN cleanup_fn)
 
209
{
 
210
    MSG_CLEANUP_FN old_fn = msg_cleanup_fn;
 
211
 
 
212
    msg_cleanup_fn = cleanup_fn;
 
213
    return (old_fn);
 
214
}
 
215
 
 
216
/* msg_error_limit - set error message counter limit */
 
217
 
 
218
int     msg_error_limit(int limit)
 
219
{
 
220
    int     old = msg_error_bound;
 
221
 
 
222
    msg_error_bound = limit;
 
223
    return (old);
 
224
}
 
225
 
 
226
/* msg_error_clear - reset error message counter */
 
227
 
 
228
void    msg_error_clear(void)
 
229
{
 
230
    msg_error_count = 0;
 
231
}