xref: /openbsd-src/usr.sbin/ypldap/log.c (revision 9b2c1562932ce8ef5a9c88720f87a65f2e0ed290)
1*9b2c1562Sbluhm /*	$OpenBSD: log.c,v 1.4 2017/03/21 12:06:56 bluhm Exp $ */
2f6242408Spyr 
3f6242408Spyr /*
4f6242408Spyr  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
5f6242408Spyr  *
6f6242408Spyr  * Permission to use, copy, modify, and distribute this software for any
7f6242408Spyr  * purpose with or without fee is hereby granted, provided that the above
8f6242408Spyr  * copyright notice and this permission notice appear in all copies.
9f6242408Spyr  *
10f6242408Spyr  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11f6242408Spyr  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12f6242408Spyr  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13f6242408Spyr  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
140be9c890Sbenno  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
150be9c890Sbenno  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
160be9c890Sbenno  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17f6242408Spyr  */
18f6242408Spyr 
19f6242408Spyr #include <errno.h>
20f6242408Spyr #include <stdarg.h>
21f6242408Spyr #include <stdio.h>
22f6242408Spyr #include <stdlib.h>
23f6242408Spyr #include <string.h>
24f6242408Spyr #include <syslog.h>
25e83a889dSderaadt #include <time.h>
260be9c890Sbenno #include <unistd.h>
27f6242408Spyr 
280be9c890Sbenno #include "log.h"
29f6242408Spyr 
30f6242408Spyr int		 debug;
310be9c890Sbenno int		 verbose;
320be9c890Sbenno const char	*log_procname;
33f6242408Spyr 
34f6242408Spyr void
log_init(int n_debug)35f6242408Spyr log_init(int n_debug)
36f6242408Spyr {
37f6242408Spyr 	extern char	*__progname;
38f6242408Spyr 
39f6242408Spyr 	debug = n_debug;
40f6242408Spyr 
41f6242408Spyr 	if (!debug)
42f6242408Spyr 		openlog(__progname, LOG_PID | LOG_NDELAY, LOG_DAEMON);
43f6242408Spyr 
44f6242408Spyr 	tzset();
45f6242408Spyr }
46f6242408Spyr 
47f6242408Spyr void
log_verbose(int v)480be9c890Sbenno log_verbose(int v)
490be9c890Sbenno {
500be9c890Sbenno 	verbose = v;
510be9c890Sbenno }
520be9c890Sbenno 
530be9c890Sbenno void
logit(int pri,const char * fmt,...)54f6242408Spyr logit(int pri, const char *fmt, ...)
55f6242408Spyr {
56f6242408Spyr 	va_list	ap;
57f6242408Spyr 
58f6242408Spyr 	va_start(ap, fmt);
59f6242408Spyr 	vlog(pri, fmt, ap);
60f6242408Spyr 	va_end(ap);
61f6242408Spyr }
62f6242408Spyr 
63f6242408Spyr void
vlog(int pri,const char * fmt,va_list ap)64f6242408Spyr vlog(int pri, const char *fmt, va_list ap)
65f6242408Spyr {
66f6242408Spyr 	char	*nfmt;
67f6242408Spyr 
68f6242408Spyr 	if (debug) {
69f6242408Spyr 		/* best effort in out of mem situations */
70f6242408Spyr 		if (asprintf(&nfmt, "%s\n", fmt) == -1) {
71f6242408Spyr 			vfprintf(stderr, fmt, ap);
72f6242408Spyr 			fprintf(stderr, "\n");
73f6242408Spyr 		} else {
74f6242408Spyr 			vfprintf(stderr, nfmt, ap);
75f6242408Spyr 			free(nfmt);
76f6242408Spyr 		}
77f6242408Spyr 		fflush(stderr);
78f6242408Spyr 	} else
79f6242408Spyr 		vsyslog(pri, fmt, ap);
80f6242408Spyr }
81f6242408Spyr 
82f6242408Spyr void
log_warn(const char * emsg,...)83f6242408Spyr log_warn(const char *emsg, ...)
84f6242408Spyr {
85f6242408Spyr 	char	*nfmt;
86f6242408Spyr 	va_list	 ap;
87f6242408Spyr 
88f6242408Spyr 	/* best effort to even work in out of memory situations */
89f6242408Spyr 	if (emsg == NULL)
90*9b2c1562Sbluhm 		logit(LOG_ERR, "%s", strerror(errno));
91f6242408Spyr 	else {
92f6242408Spyr 		va_start(ap, emsg);
93f6242408Spyr 
94f6242408Spyr 		if (asprintf(&nfmt, "%s: %s", emsg, strerror(errno)) == -1) {
95f6242408Spyr 			/* we tried it... */
96*9b2c1562Sbluhm 			vlog(LOG_ERR, emsg, ap);
97*9b2c1562Sbluhm 			logit(LOG_ERR, "%s", strerror(errno));
98f6242408Spyr 		} else {
99*9b2c1562Sbluhm 			vlog(LOG_ERR, nfmt, ap);
100f6242408Spyr 			free(nfmt);
101f6242408Spyr 		}
102f6242408Spyr 		va_end(ap);
103f6242408Spyr 	}
104f6242408Spyr }
105f6242408Spyr 
106f6242408Spyr void
log_warnx(const char * emsg,...)107f6242408Spyr log_warnx(const char *emsg, ...)
108f6242408Spyr {
109f6242408Spyr 	va_list	 ap;
110f6242408Spyr 
111f6242408Spyr 	va_start(ap, emsg);
112*9b2c1562Sbluhm 	vlog(LOG_ERR, emsg, ap);
113f6242408Spyr 	va_end(ap);
114f6242408Spyr }
115f6242408Spyr 
116f6242408Spyr void
log_info(const char * emsg,...)117f6242408Spyr log_info(const char *emsg, ...)
118f6242408Spyr {
119f6242408Spyr 	va_list	 ap;
120f6242408Spyr 
121f6242408Spyr 	va_start(ap, emsg);
122f6242408Spyr 	vlog(LOG_INFO, emsg, ap);
123f6242408Spyr 	va_end(ap);
124f6242408Spyr }
125f6242408Spyr 
126f6242408Spyr void
log_debug(const char * emsg,...)127f6242408Spyr log_debug(const char *emsg, ...)
128f6242408Spyr {
129f6242408Spyr 	va_list	 ap;
130f6242408Spyr 
1310be9c890Sbenno 	if (verbose) {
132f6242408Spyr 		va_start(ap, emsg);
133f6242408Spyr 		vlog(LOG_DEBUG, emsg, ap);
134f6242408Spyr 		va_end(ap);
135f6242408Spyr 	}
136f6242408Spyr }
137f6242408Spyr 
138f6242408Spyr void
fatal(const char * emsg)139f6242408Spyr fatal(const char *emsg)
140f6242408Spyr {
141f6242408Spyr 	if (emsg == NULL)
1420be9c890Sbenno 		logit(LOG_CRIT, "fatal in %s: %s", log_procname,
1430be9c890Sbenno 		    strerror(errno));
144f6242408Spyr 	else
145f6242408Spyr 		if (errno)
1460be9c890Sbenno 			logit(LOG_CRIT, "fatal in %s: %s: %s",
1470be9c890Sbenno 			    log_procname, emsg, strerror(errno));
148f6242408Spyr 		else
1490be9c890Sbenno 			logit(LOG_CRIT, "fatal in %s: %s",
1500be9c890Sbenno 			    log_procname, emsg);
151f6242408Spyr 
152f6242408Spyr 	exit(1);
153f6242408Spyr }
154f6242408Spyr 
155f6242408Spyr void
fatalx(const char * emsg)156f6242408Spyr fatalx(const char *emsg)
157f6242408Spyr {
158f6242408Spyr 	errno = 0;
159f6242408Spyr 	fatal(emsg);
160f6242408Spyr }
161