4 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
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.
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 MIND, USE, DATA OR PROFITS, WHETHER
15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/types.h>
31 #define LOG_TYPE_OFF 0
32 #define LOG_TYPE_TTY 1
33 #define LOG_TYPE_FILE 2
34 int log_type
= LOG_TYPE_OFF
;
36 /* Log file, if needed. */
42 void log_event_cb(int, const char *);
43 void log_vwrite(int, const char *, va_list);
44 __dead
void log_vfatal(const char *, va_list);
46 /* Log callback for libevent. */
48 log_event_cb(unused
int severity
, const char *msg
)
53 /* Open logging to tty. */
55 log_open_tty(int level
)
57 log_type
= LOG_TYPE_TTY
;
62 event_set_log_callback(log_event_cb
);
67 /* Open logging to file. */
69 log_open_file(int level
, const char *path
)
71 log_file
= fopen(path
, "w");
75 log_type
= LOG_TYPE_FILE
;
79 event_set_log_callback(log_event_cb
);
88 if (log_type
== LOG_TYPE_FILE
)
91 event_set_log_callback(NULL
);
93 log_type
= LOG_TYPE_OFF
;
96 /* Write a log message. */
98 log_vwrite(int pri
, const char *msg
, va_list ap
)
111 if (asprintf(&fmt
, "%s\n", msg
) == -1)
113 if (vfprintf(f
, fmt
, ap
) == -1)
121 /* Log a warning with error string. */
123 log_warn(const char *msg
, ...)
129 if (asprintf(&fmt
, "%s: %s", msg
, strerror(errno
)) == -1)
131 log_vwrite(LOG_CRIT
, fmt
, ap
);
138 log_warnx(const char *msg
, ...)
143 log_vwrite(LOG_CRIT
, msg
, ap
);
147 /* Log an informational message. */
149 log_info(const char *msg
, ...)
153 if (log_level
> -1) {
155 log_vwrite(LOG_INFO
, msg
, ap
);
160 /* Log a debug message. */
162 log_debug(const char *msg
, ...)
168 log_vwrite(LOG_DEBUG
, msg
, ap
);
173 /* Log a debug message at level 2. */
175 log_debug2(const char *msg
, ...)
181 log_vwrite(LOG_DEBUG
, msg
, ap
);
186 /* Log a critical error, with error string if necessary, and die. */
188 log_vfatal(const char *msg
, va_list ap
)
193 if (asprintf(&fmt
, "fatal: %s: %s", msg
, strerror(errno
)) == -1)
195 log_vwrite(LOG_CRIT
, fmt
, ap
);
197 if (asprintf(&fmt
, "fatal: %s", msg
) == -1)
199 log_vwrite(LOG_CRIT
, fmt
, ap
);
206 /* Log a critical error, with error string, and die. */
207 __dead
void printflike1
208 log_fatal(const char *msg
, ...)
216 /* Log a critical error and die. */
217 __dead
void printflike1
218 log_fatalx(const char *msg
, ...)