001
2022-02-16
op
/* $OpenBSD: log.c,v 1.1 2018/07/10 16:39:54 florian Exp $ */
004
2022-02-16
op
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
006
2022-02-16
op
* Permission to use, copy, modify, and distribute this software for any
007
2022-02-16
op
* purpose with or without fee is hereby granted, provided that the above
008
2022-02-16
op
* copyright notice and this permission notice appear in all copies.
010
2022-02-16
op
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
011
2022-02-16
op
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
012
2022-02-16
op
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
013
2022-02-16
op
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
014
2022-02-16
op
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
015
2022-02-16
op
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
016
2022-02-16
op
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
019
2022-02-16
op
#include <stdio.h>
020
2022-02-16
op
#include <stdlib.h>
021
2022-02-16
op
#include <stdarg.h>
022
2022-02-16
op
#include <string.h>
023
2022-02-16
op
#include <syslog.h>
024
2022-02-16
op
#include <errno.h>
025
2022-02-16
op
#include <time.h>
027
2022-02-16
op
#include "log.h"
029
2022-02-16
op
static int debug;
030
2022-02-16
op
static int verbose;
031
2022-02-16
op
static const char *log_procname;
034
2022-02-16
op
log_init(int n_debug, int facility)
036
2022-02-16
op
debug = n_debug;
037
2022-02-16
op
verbose = n_debug;
038
2022-06-09
op
log_procinit(getprogname());
040
2022-02-16
op
if (!debug)
041
2022-06-09
op
openlog(getprogname(), LOG_PID | LOG_NDELAY, facility);
047
2022-02-16
op
log_procinit(const char *procname)
049
2022-02-16
op
if (procname != NULL)
050
2022-02-16
op
log_procname = procname;
054
2022-02-16
op
log_setverbose(int v)
056
2022-02-16
op
verbose = v;
060
2022-02-16
op
log_getverbose(void)
062
2022-02-16
op
return (verbose);
066
2022-02-16
op
logit(int pri, const char *fmt, ...)
068
2022-02-16
op
va_list ap;
070
2022-02-16
op
va_start(ap, fmt);
071
2022-02-16
op
vlog(pri, fmt, ap);
072
2022-02-16
op
va_end(ap);
076
2022-02-16
op
vlog(int pri, const char *fmt, va_list ap)
078
2022-02-16
op
char *nfmt;
079
2022-02-16
op
int saved_errno = errno;
081
2022-02-16
op
if (debug) {
082
2022-02-16
op
/* best effort in out of mem situations */
083
2022-02-16
op
if (asprintf(&nfmt, "%s\n", fmt) == -1) {
084
2022-02-16
op
vfprintf(stderr, fmt, ap);
085
2022-02-16
op
fprintf(stderr, "\n");
087
2022-02-16
op
vfprintf(stderr, nfmt, ap);
088
2022-02-16
op
free(nfmt);
090
2022-02-16
op
fflush(stderr);
092
2022-02-16
op
vsyslog(pri, fmt, ap);
094
2022-02-16
op
errno = saved_errno;
098
2022-02-16
op
log_warn(const char *emsg, ...)
100
2022-02-16
op
char *nfmt;
101
2022-02-16
op
va_list ap;
102
2022-02-16
op
int saved_errno = errno;
104
2022-02-16
op
/* best effort to even work in out of memory situations */
105
2022-02-16
op
if (emsg == NULL)
106
2022-02-16
op
logit(LOG_ERR, "%s", strerror(saved_errno));
108
2022-02-16
op
va_start(ap, emsg);
110
2022-02-16
op
if (asprintf(&nfmt, "%s: %s", emsg,
111
2022-02-16
op
strerror(saved_errno)) == -1) {
112
2022-02-16
op
/* we tried it... */
113
2022-02-16
op
vlog(LOG_ERR, emsg, ap);
114
2022-02-16
op
logit(LOG_ERR, "%s", strerror(saved_errno));
116
2022-02-16
op
vlog(LOG_ERR, nfmt, ap);
117
2022-02-16
op
free(nfmt);
119
2022-02-16
op
va_end(ap);
122
2022-02-16
op
errno = saved_errno;
126
2022-02-16
op
log_warnx(const char *emsg, ...)
128
2022-02-16
op
va_list ap;
130
2022-02-16
op
va_start(ap, emsg);
131
2022-02-16
op
vlog(LOG_ERR, emsg, ap);
132
2022-02-16
op
va_end(ap);
136
2022-02-16
op
log_info(const char *emsg, ...)
138
2022-02-16
op
va_list ap;
140
2022-02-16
op
va_start(ap, emsg);
141
2022-02-16
op
vlog(LOG_INFO, emsg, ap);
142
2022-02-16
op
va_end(ap);
146
2022-02-16
op
log_debug(const char *emsg, ...)
148
2022-02-16
op
va_list ap;
150
2022-02-16
op
if (verbose) {
151
2022-02-16
op
va_start(ap, emsg);
152
2022-02-16
op
vlog(LOG_DEBUG, emsg, ap);
153
2022-02-16
op
va_end(ap);
157
2022-02-16
op
static void
158
2022-02-16
op
vfatalc(int code, const char *emsg, va_list ap)
160
2022-02-16
op
static char s[BUFSIZ];
161
2022-02-16
op
const char *sep;
163
2022-02-16
op
if (emsg != NULL) {
164
2022-02-16
op
(void)vsnprintf(s, sizeof(s), emsg, ap);
165
2022-02-16
op
sep = ": ";
167
2022-02-16
op
s[0] = '\0';
168
2022-02-16
op
sep = "";
170
2022-02-16
op
if (code)
171
2022-02-16
op
logit(LOG_CRIT, "fatal in %s: %s%s%s",
172
2022-02-16
op
log_procname, s, sep, strerror(code));
174
2022-02-16
op
logit(LOG_CRIT, "fatal in %s%s%s", log_procname, sep, s);
178
2022-02-16
op
fatal(const char *emsg, ...)
180
2022-02-16
op
va_list ap;
182
2022-02-16
op
va_start(ap, emsg);
183
2022-02-16
op
vfatalc(errno, emsg, ap);
184
2022-02-16
op
va_end(ap);
189
2022-02-16
op
fatalx(const char *emsg, ...)
191
2022-02-16
op
va_list ap;
193
2022-02-16
op
va_start(ap, emsg);
194
2022-02-16
op
vfatalc(0, emsg, ap);
195
2022-02-16
op
va_end(ap);