1 /*	$OpenBSD$ */
2 
3 /*
4  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include <zebra.h>
20 
21 #include "ldpd.h"
22 #include "ldpe.h"
23 #include "lde.h"
24 #include "log.h"
25 
26 #include <lib/log.h>
27 
28 const char	*log_procname;
29 
30 void
logit(int pri,const char * fmt,...)31 logit(int pri, const char *fmt, ...)
32 {
33 	va_list	ap;
34 
35 	va_start(ap, fmt);
36 	vlog(pri, fmt, ap);
37 	va_end(ap);
38 }
39 
40 void
vlog(int pri,const char * fmt,va_list ap)41 vlog(int pri, const char *fmt, va_list ap)
42 {
43 	char	 buf[1024];
44 
45 	switch (ldpd_process) {
46 	case PROC_LDE_ENGINE:
47 		vsnprintf(buf, sizeof(buf), fmt, ap);
48 		lde_imsg_compose_parent_sync(IMSG_LOG, pri, buf,
49 		    strlen(buf) + 1);
50 		break;
51 	case PROC_LDP_ENGINE:
52 		vsnprintf(buf, sizeof(buf), fmt, ap);
53 		ldpe_imsg_compose_parent_sync(IMSG_LOG, pri, buf,
54 		    strlen(buf) + 1);
55 		break;
56 	case PROC_MAIN:
57 		vzlog(pri, fmt, ap);
58 		break;
59 	}
60 }
61 
62 void
log_warn(const char * emsg,...)63 log_warn(const char *emsg, ...)
64 {
65 	char	*nfmt;
66 	va_list	 ap;
67 
68 	/* best effort to even work in out of memory situations */
69 	if (emsg == NULL)
70 		logit(LOG_ERR, "%s", strerror(errno));
71 	else {
72 		va_start(ap, emsg);
73 
74 		if (asprintf(&nfmt, "%s: %s", emsg, strerror(errno)) == -1) {
75 			/* we tried it... */
76 			vlog(LOG_ERR, emsg, ap);
77 			logit(LOG_ERR, "%s", strerror(errno));
78 		} else {
79 			vlog(LOG_ERR, nfmt, ap);
80 			free(nfmt);
81 		}
82 		va_end(ap);
83 	}
84 }
85 
86 void
log_warnx(const char * emsg,...)87 log_warnx(const char *emsg, ...)
88 {
89 	va_list	 ap;
90 
91 	va_start(ap, emsg);
92 	vlog(LOG_ERR, emsg, ap);
93 	va_end(ap);
94 }
95 
96 void
log_info(const char * emsg,...)97 log_info(const char *emsg, ...)
98 {
99 	va_list	 ap;
100 
101 	va_start(ap, emsg);
102 	vlog(LOG_INFO, emsg, ap);
103 	va_end(ap);
104 }
105 
106 void
log_notice(const char * emsg,...)107 log_notice(const char *emsg, ...)
108 {
109 	va_list	 ap;
110 
111 	va_start(ap, emsg);
112 	vlog(LOG_NOTICE, emsg, ap);
113 	va_end(ap);
114 }
115 
116 void
log_debug(const char * emsg,...)117 log_debug(const char *emsg, ...)
118 {
119 	va_list	 ap;
120 
121 	va_start(ap, emsg);
122 	vlog(LOG_DEBUG, emsg, ap);
123 	va_end(ap);
124 }
125 
126 void
fatal(const char * emsg)127 fatal(const char *emsg)
128 {
129 	if (emsg == NULL)
130 		logit(LOG_CRIT, "fatal in %s: %s", log_procname,
131 		    strerror(errno));
132 	else
133 		if (errno)
134 			logit(LOG_CRIT, "fatal in %s: %s: %s",
135 			    log_procname, emsg, strerror(errno));
136 		else
137 			logit(LOG_CRIT, "fatal in %s: %s",
138 			    log_procname, emsg);
139 
140 	exit(1);
141 }
142 
143 void
fatalx(const char * emsg)144 fatalx(const char *emsg)
145 {
146 	errno = 0;
147 	fatal(emsg);
148 }
149