version 1.6, 2012/03/17 18:38:58 |
version 1.7, 2012/05/25 08:28:10 |
|
|
|
|
#include "tmux.h" |
#include "tmux.h" |
|
|
/* Logging type. */ |
|
#define LOG_TYPE_OFF 0 |
|
#define LOG_TYPE_TTY 1 |
|
#define LOG_TYPE_FILE 2 |
|
int log_type = LOG_TYPE_OFF; |
|
|
|
/* Log file, if needed. */ |
/* Log file, if needed. */ |
FILE *log_file; |
FILE *log_file = stderr; |
|
|
/* Debug level. */ |
/* Debug level. */ |
int log_level; |
int log_level = 0; |
|
|
void log_event_cb(int, const char *); |
void log_event_cb(int, const char *); |
void log_vwrite(int, const char *, va_list); |
void log_vwrite(const char *, va_list); |
__dead void log_vfatal(const char *, va_list); |
__dead void log_vfatal(const char *, va_list); |
|
|
/* Log callback for libevent. */ |
/* Log callback for libevent. */ |
|
|
log_warnx("%s", msg); |
log_warnx("%s", msg); |
} |
} |
|
|
/* Open logging to tty. */ |
|
void |
|
log_open_tty(int level) |
|
{ |
|
log_type = LOG_TYPE_TTY; |
|
log_level = level; |
|
|
|
setlinebuf(stderr); |
|
setlinebuf(stdout); |
|
event_set_log_callback(log_event_cb); |
|
|
|
tzset(); |
|
} |
|
|
|
/* Open logging to file. */ |
/* Open logging to file. */ |
void |
void |
log_open_file(int level, const char *path) |
log_open(int level, const char *path) |
{ |
{ |
log_file = fopen(path, "w"); |
log_file = fopen(path, "w"); |
if (log_file == NULL) |
if (log_file == NULL) |
return; |
return; |
|
|
log_type = LOG_TYPE_FILE; |
|
log_level = level; |
log_level = level; |
|
|
setlinebuf(log_file); |
setlinebuf(log_file); |
|
|
void |
void |
log_close(void) |
log_close(void) |
{ |
{ |
if (log_type == LOG_TYPE_FILE) |
if (log_file != stderr) |
fclose(log_file); |
fclose(log_file); |
|
|
event_set_log_callback(NULL); |
event_set_log_callback(NULL); |
|
|
log_type = LOG_TYPE_OFF; |
|
} |
} |
|
|
/* Write a log message. */ |
/* Write a log message. */ |
void |
void |
log_vwrite(int pri, const char *msg, va_list ap) |
log_vwrite(const char *msg, va_list ap) |
{ |
{ |
char *fmt; |
char *fmt; |
FILE *f = log_file; |
|
|
|
switch (log_type) { |
if (asprintf(&fmt, "%s\n", msg) == -1) |
case LOG_TYPE_TTY: |
exit(1); |
if (pri == LOG_INFO) |
if (vfprintf(log_file, fmt, ap) == -1) |
f = stdout; |
exit(1); |
else |
fflush(log_file); |
f = stderr; |
free(fmt); |
/* FALLTHROUGH */ |
|
case LOG_TYPE_FILE: |
|
if (asprintf(&fmt, "%s\n", msg) == -1) |
|
exit(1); |
|
if (vfprintf(f, fmt, ap) == -1) |
|
exit(1); |
|
fflush(f); |
|
free(fmt); |
|
break; |
|
} |
|
} |
} |
|
|
/* Log a warning with error string. */ |
/* Log a warning with error string. */ |
|
|
va_start(ap, msg); |
va_start(ap, msg); |
if (asprintf(&fmt, "%s: %s", msg, strerror(errno)) == -1) |
if (asprintf(&fmt, "%s: %s", msg, strerror(errno)) == -1) |
exit(1); |
exit(1); |
log_vwrite(LOG_CRIT, fmt, ap); |
log_vwrite(fmt, ap); |
free(fmt); |
free(fmt); |
va_end(ap); |
va_end(ap); |
} |
} |
|
|
va_list ap; |
va_list ap; |
|
|
va_start(ap, msg); |
va_start(ap, msg); |
log_vwrite(LOG_CRIT, msg, ap); |
log_vwrite(msg, ap); |
va_end(ap); |
va_end(ap); |
} |
} |
|
|
|
|
|
|
if (log_level > -1) { |
if (log_level > -1) { |
va_start(ap, msg); |
va_start(ap, msg); |
log_vwrite(LOG_INFO, msg, ap); |
log_vwrite(msg, ap); |
va_end(ap); |
va_end(ap); |
} |
} |
} |
} |
|
|
|
|
if (log_level > 0) { |
if (log_level > 0) { |
va_start(ap, msg); |
va_start(ap, msg); |
log_vwrite(LOG_DEBUG, msg, ap); |
log_vwrite(msg, ap); |
va_end(ap); |
va_end(ap); |
} |
} |
} |
} |
|
|
|
|
if (log_level > 1) { |
if (log_level > 1) { |
va_start(ap, msg); |
va_start(ap, msg); |
log_vwrite(LOG_DEBUG, msg, ap); |
log_vwrite(msg, ap); |
va_end(ap); |
va_end(ap); |
} |
} |
} |
} |
|
|
if (errno != 0) { |
if (errno != 0) { |
if (asprintf(&fmt, "fatal: %s: %s", msg, strerror(errno)) == -1) |
if (asprintf(&fmt, "fatal: %s: %s", msg, strerror(errno)) == -1) |
exit(1); |
exit(1); |
log_vwrite(LOG_CRIT, fmt, ap); |
log_vwrite(fmt, ap); |
} else { |
} else { |
if (asprintf(&fmt, "fatal: %s", msg) == -1) |
if (asprintf(&fmt, "fatal: %s", msg) == -1) |
exit(1); |
exit(1); |
log_vwrite(LOG_CRIT, fmt, ap); |
log_vwrite(fmt, ap); |
} |
} |
free(fmt); |
free(fmt); |
|
|