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
extern char *__progname;
038
2022-02-16
op
debug = n_debug;
039
2022-02-16
op
verbose = n_debug;
040
2022-02-16
op
log_procinit(__progname);
042
2022-02-16
op
if (!debug)
043
2022-02-16
op
openlog(__progname, LOG_PID | LOG_NDELAY, facility);
049
2022-02-16
op
log_procinit(const char *procname)
051
2022-02-16
op
if (procname != NULL)
052
2022-02-16
op
log_procname = procname;
056
2022-02-16
op
log_setverbose(int v)
058
2022-02-16
op
verbose = v;
062
2022-02-16
op
log_getverbose(void)
064
2022-02-16
op
return (verbose);
068
2022-02-16
op
logit(int pri, const char *fmt, ...)
070
2022-02-16
op
va_list ap;
072
2022-02-16
op
va_start(ap, fmt);
073
2022-02-16
op
vlog(pri, fmt, ap);
074
2022-02-16
op
va_end(ap);
078
2022-02-16
op
vlog(int pri, const char *fmt, va_list ap)
080
2022-02-16
op
char *nfmt;
081
2022-02-16
op
int saved_errno = errno;
083
2022-02-16
op
if (debug) {
084
2022-02-16
op
/* best effort in out of mem situations */
085
2022-02-16
op
if (asprintf(&nfmt, "%s\n", fmt) == -1) {
086
2022-02-16
op
vfprintf(stderr, fmt, ap);
087
2022-02-16
op
fprintf(stderr, "\n");
089
2022-02-16
op
vfprintf(stderr, nfmt, ap);
090
2022-02-16
op
free(nfmt);
092
2022-02-16
op
fflush(stderr);
094
2022-02-16
op
vsyslog(pri, fmt, ap);
096
2022-02-16
op
errno = saved_errno;
100
2022-02-16
op
log_warn(const char *emsg, ...)
102
2022-02-16
op
char *nfmt;
103
2022-02-16
op
va_list ap;
104
2022-02-16
op
int saved_errno = errno;
106
2022-02-16
op
/* best effort to even work in out of memory situations */
107
2022-02-16
op
if (emsg == NULL)
108
2022-02-16
op
logit(LOG_ERR, "%s", strerror(saved_errno));
110
2022-02-16
op
va_start(ap, emsg);
112
2022-02-16
op
if (asprintf(&nfmt, "%s: %s", emsg,
113
2022-02-16
op
strerror(saved_errno)) == -1) {
114
2022-02-16
op
/* we tried it... */
115
2022-02-16
op
vlog(LOG_ERR, emsg, ap);
116
2022-02-16
op
logit(LOG_ERR, "%s", strerror(saved_errno));
118
2022-02-16
op
vlog(LOG_ERR, nfmt, ap);
119
2022-02-16
op
free(nfmt);
121
2022-02-16
op
va_end(ap);
124
2022-02-16
op
errno = saved_errno;
128
2022-02-16
op
log_warnx(const char *emsg, ...)
130
2022-02-16
op
va_list ap;
132
2022-02-16
op
va_start(ap, emsg);
133
2022-02-16
op
vlog(LOG_ERR, emsg, ap);
134
2022-02-16
op
va_end(ap);
138
2022-02-16
op
log_info(const char *emsg, ...)
140
2022-02-16
op
va_list ap;
142
2022-02-16
op
va_start(ap, emsg);
143
2022-02-16
op
vlog(LOG_INFO, emsg, ap);
144
2022-02-16
op
va_end(ap);
148
2022-02-16
op
log_debug(const char *emsg, ...)
150
2022-02-16
op
va_list ap;
152
2022-02-16
op
if (verbose) {
153
2022-02-16
op
va_start(ap, emsg);
154
2022-02-16
op
vlog(LOG_DEBUG, emsg, ap);
155
2022-02-16
op
va_end(ap);
159
2022-02-16
op
static void
160
2022-02-16
op
vfatalc(int code, const char *emsg, va_list ap)
162
2022-02-16
op
static char s[BUFSIZ];
163
2022-02-16
op
const char *sep;
165
2022-02-16
op
if (emsg != NULL) {
166
2022-02-16
op
(void)vsnprintf(s, sizeof(s), emsg, ap);
167
2022-02-16
op
sep = ": ";
169
2022-02-16
op
s[0] = '\0';
170
2022-02-16
op
sep = "";
172
2022-02-16
op
if (code)
173
2022-02-16
op
logit(LOG_CRIT, "fatal in %s: %s%s%s",
174
2022-02-16
op
log_procname, s, sep, strerror(code));
176
2022-02-16
op
logit(LOG_CRIT, "fatal in %s%s%s", log_procname, sep, s);
180
2022-02-16
op
fatal(const char *emsg, ...)
182
2022-02-16
op
va_list ap;
184
2022-02-16
op
va_start(ap, emsg);
185
2022-02-16
op
vfatalc(errno, emsg, ap);
186
2022-02-16
op
va_end(ap);
191
2022-02-16
op
fatalx(const char *emsg, ...)
193
2022-02-16
op
va_list ap;
195
2022-02-16
op
va_start(ap, emsg);
196
2022-02-16
op
vfatalc(0, emsg, ap);
197
2022-02-16
op
va_end(ap);