1*6bae335dSjsg /* $OpenBSD: log.c,v 1.10 2023/04/19 12:58:16 jsg Exp $ */
243509a12Srenato
343509a12Srenato /*
443509a12Srenato * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
543509a12Srenato *
643509a12Srenato * Permission to use, copy, modify, and distribute this software for any
743509a12Srenato * purpose with or without fee is hereby granted, provided that the above
843509a12Srenato * copyright notice and this permission notice appear in all copies.
943509a12Srenato *
1043509a12Srenato * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1143509a12Srenato * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1243509a12Srenato * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1343509a12Srenato * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1443509a12Srenato * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1543509a12Srenato * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1643509a12Srenato * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1743509a12Srenato */
1843509a12Srenato
198072de9bSrenato #include <sys/types.h>
208072de9bSrenato
218072de9bSrenato #include <arpa/inet.h>
2243509a12Srenato #include <errno.h>
238072de9bSrenato #include <netdb.h>
2443509a12Srenato #include <stdarg.h>
2543509a12Srenato #include <stdio.h>
2643509a12Srenato #include <stdlib.h>
2743509a12Srenato #include <string.h>
2843509a12Srenato #include <syslog.h>
29fcdf914bSbenno #include <time.h>
3043509a12Srenato #include <unistd.h>
3143509a12Srenato
3243509a12Srenato #include "eigrpd.h"
3343509a12Srenato #include "log.h"
3443509a12Srenato
3543509a12Srenato int debug;
3643509a12Srenato int verbose;
37fcdf914bSbenno const char *log_procname;
3843509a12Srenato
3943509a12Srenato void
log_init(int n_debug)4043509a12Srenato log_init(int n_debug)
4143509a12Srenato {
4243509a12Srenato extern char *__progname;
4343509a12Srenato
4443509a12Srenato debug = n_debug;
4543509a12Srenato
4643509a12Srenato if (!debug)
4743509a12Srenato openlog(__progname, LOG_PID | LOG_NDELAY, LOG_DAEMON);
4843509a12Srenato
4943509a12Srenato tzset();
5043509a12Srenato }
5143509a12Srenato
5243509a12Srenato void
log_verbose(int v)5343509a12Srenato log_verbose(int v)
5443509a12Srenato {
5543509a12Srenato verbose = v;
5643509a12Srenato }
5743509a12Srenato
5843509a12Srenato void
logit(int pri,const char * fmt,...)5943509a12Srenato logit(int pri, const char *fmt, ...)
6043509a12Srenato {
6143509a12Srenato va_list ap;
6243509a12Srenato
6343509a12Srenato va_start(ap, fmt);
6443509a12Srenato vlog(pri, fmt, ap);
6543509a12Srenato va_end(ap);
6643509a12Srenato }
6743509a12Srenato
6843509a12Srenato void
vlog(int pri,const char * fmt,va_list ap)6943509a12Srenato vlog(int pri, const char *fmt, va_list ap)
7043509a12Srenato {
7143509a12Srenato char *nfmt;
7243509a12Srenato
7343509a12Srenato if (debug) {
7443509a12Srenato /* best effort in out of mem situations */
7543509a12Srenato if (asprintf(&nfmt, "%s\n", fmt) == -1) {
7643509a12Srenato vfprintf(stderr, fmt, ap);
7743509a12Srenato fprintf(stderr, "\n");
7843509a12Srenato } else {
7943509a12Srenato vfprintf(stderr, nfmt, ap);
8043509a12Srenato free(nfmt);
8143509a12Srenato }
8243509a12Srenato fflush(stderr);
8343509a12Srenato } else
8443509a12Srenato vsyslog(pri, fmt, ap);
8543509a12Srenato }
8643509a12Srenato
8743509a12Srenato void
log_warn(const char * emsg,...)8843509a12Srenato log_warn(const char *emsg, ...)
8943509a12Srenato {
9043509a12Srenato char *nfmt;
9143509a12Srenato va_list ap;
9243509a12Srenato
9343509a12Srenato /* best effort to even work in out of memory situations */
9443509a12Srenato if (emsg == NULL)
959b2c1562Sbluhm logit(LOG_ERR, "%s", strerror(errno));
9643509a12Srenato else {
9743509a12Srenato va_start(ap, emsg);
9843509a12Srenato
9943509a12Srenato if (asprintf(&nfmt, "%s: %s", emsg, strerror(errno)) == -1) {
10043509a12Srenato /* we tried it... */
1019b2c1562Sbluhm vlog(LOG_ERR, emsg, ap);
1029b2c1562Sbluhm logit(LOG_ERR, "%s", strerror(errno));
10343509a12Srenato } else {
1049b2c1562Sbluhm vlog(LOG_ERR, nfmt, ap);
10543509a12Srenato free(nfmt);
10643509a12Srenato }
10743509a12Srenato va_end(ap);
10843509a12Srenato }
10943509a12Srenato }
11043509a12Srenato
11143509a12Srenato void
log_warnx(const char * emsg,...)11243509a12Srenato log_warnx(const char *emsg, ...)
11343509a12Srenato {
11443509a12Srenato va_list ap;
11543509a12Srenato
11643509a12Srenato va_start(ap, emsg);
1179b2c1562Sbluhm vlog(LOG_ERR, emsg, ap);
11843509a12Srenato va_end(ap);
11943509a12Srenato }
12043509a12Srenato
12143509a12Srenato void
log_info(const char * emsg,...)12243509a12Srenato log_info(const char *emsg, ...)
12343509a12Srenato {
12443509a12Srenato va_list ap;
12543509a12Srenato
12643509a12Srenato va_start(ap, emsg);
12743509a12Srenato vlog(LOG_INFO, emsg, ap);
12843509a12Srenato va_end(ap);
12943509a12Srenato }
13043509a12Srenato
13143509a12Srenato void
log_debug(const char * emsg,...)13243509a12Srenato log_debug(const char *emsg, ...)
13343509a12Srenato {
13443509a12Srenato va_list ap;
13543509a12Srenato
13643509a12Srenato if (verbose) {
13743509a12Srenato va_start(ap, emsg);
13843509a12Srenato vlog(LOG_DEBUG, emsg, ap);
13943509a12Srenato va_end(ap);
14043509a12Srenato }
14143509a12Srenato }
14243509a12Srenato
14343509a12Srenato void
fatal(const char * emsg)14443509a12Srenato fatal(const char *emsg)
14543509a12Srenato {
14643509a12Srenato if (emsg == NULL)
1474aa216a1Sclaudio logit(LOG_CRIT, "fatal in %s: %s", log_procname,
14843509a12Srenato strerror(errno));
14943509a12Srenato else
15043509a12Srenato if (errno)
15143509a12Srenato logit(LOG_CRIT, "fatal in %s: %s: %s",
1524aa216a1Sclaudio log_procname, emsg, strerror(errno));
15343509a12Srenato else
15443509a12Srenato logit(LOG_CRIT, "fatal in %s: %s",
1554aa216a1Sclaudio log_procname, emsg);
15643509a12Srenato
15743509a12Srenato exit(1);
15843509a12Srenato }
15943509a12Srenato
16043509a12Srenato void
fatalx(const char * emsg)16143509a12Srenato fatalx(const char *emsg)
16243509a12Srenato {
16343509a12Srenato errno = 0;
16443509a12Srenato fatal(emsg);
16543509a12Srenato }
166