summaryrefslogtreecommitdiffstats
path: root/log.c
diff options
context:
space:
mode:
authorNicolas Viennot <nicolas@viennot.biz>2019-11-03 05:11:37 -0500
committerNicolas Viennot <nicolas@viennot.biz>2019-11-04 18:36:10 -0500
commit6e84bab68ca80f90023d4336467a44098d17a06f (patch)
tree14473dbd2146129d91432efe9cc086891a6757e0 /log.c
parent7f693a97aede385aad30db1412c48f0093b72509 (diff)
Add foreground mode with -F
Diffstat (limited to 'log.c')
-rw-r--r--log.c49
1 files changed, 35 insertions, 14 deletions
diff --git a/log.c b/log.c
index 018348cf..bc798778 100644
--- a/log.c
+++ b/log.c
@@ -32,6 +32,11 @@ static int log_level;
static void log_event_cb(int, const char *);
static void log_vwrite(const char *, va_list);
+static int is_log_stdout(void)
+{
+ return fileno(log_file) <= 2;
+}
+
/* Log callback for libevent. */
static void
log_event_cb(__unused int severity, const char *msg)
@@ -53,6 +58,18 @@ log_get_level(void)
return (log_level);
}
+void
+log_open_fp(FILE *f)
+{
+ if (log_file != NULL && !is_log_stdout())
+ fclose(log_file);
+
+ log_file = f;
+
+ setvbuf(log_file, NULL, _IOLBF, 0);
+ event_set_log_callback(log_event_cb);
+}
+
/* Open logging to file. */
void
log_open(const char *name)
@@ -62,24 +79,18 @@ log_open(const char *name)
if (log_level == 0)
return;
- if (log_file != NULL)
- fclose(log_file);
-
xasprintf(&path, "tmate-%s-%ld.log", name, (long)getpid());
- log_file = fopen(path, "w");
+ FILE *f = fopen(path, "w");
free(path);
- if (log_file == NULL)
- return;
-
- setvbuf(log_file, NULL, _IOLBF, 0);
- event_set_log_callback(log_event_cb);
+ if (f)
+ log_open_fp(f);
}
/* Close logging. */
void
log_close(void)
{
- if (log_file != NULL)
+ if (log_file != NULL && !is_log_stdout())
fclose(log_file);
log_file = NULL;
@@ -102,9 +113,16 @@ log_vwrite(const char *msg, va_list ap)
exit(1);
gettimeofday(&tv, NULL);
- if (fprintf(log_file, "%lld.%06d %s\n", (long long)tv.tv_sec,
- (int)tv.tv_usec, out) == -1)
- exit(1);
+
+ if (is_log_stdout()) {
+ if (fprintf(log_file, "%s\n", out) == -1)
+ exit(1);
+ } else {
+ if (fprintf(log_file, "%lld.%06d %s\n", (long long)tv.tv_sec,
+ (int)tv.tv_usec, out) == -1)
+ exit(1);
+ }
+
fflush(log_file);
free(out);
@@ -113,10 +131,13 @@ log_vwrite(const char *msg, va_list ap)
/* Log a debug message. */
void
-log_debug(const char *msg, ...)
+log_emit(int level, const char *msg, ...)
{
va_list ap;
+ if (log_level < level)
+ return;
+
va_start(ap, msg);
log_vwrite(msg, ap);
va_end(ap);