#include <mLib/daemonize.h>
#include <mLib/darray.h>
#include <mLib/dstr.h>
+#include <mLib/macros.h>
#include <mLib/mdup.h>
#include <mLib/mdwopt.h>
#include <mLib/quis.h>
#include "util.h"
#undef sun
-#define IGNORE(x) do if (x); while (0)
/*----- Data structures ---------------------------------------------------*/
#define f_warn 128u
#define f_uclose 256u
#define f_losing 512u
+#define f_nostamp 1024u
/*----- Main code ---------------------------------------------------------*/
char buf[256];
time_t t = time(0);
struct tm *tm = localtime(&t);
- strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm);
- fprintf(logfp, "%s %s: %s\n", buf, cat, msg);
+ if (f & f_nostamp) buf[0] = 0;
+ else strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S ", tm);
+ fprintf(logfp, "%s%s: %s\n", buf, cat, msg);
}
static void checkbg(char **p)
die(EXIT_FAILURE, "unexpected background tag `%s'", q);
}
-static void dolog(int prio, const char *msg, ...)
+static void PRINTF_LIKE(2, 3) dolog(int prio, const char *msg, ...)
{
va_list ap;
dstr d = DSTR_INIT;
if (!q)
return;
if (strcmp(q, "WARN") == 0)
- dolog(LOG_WARNING, p);
+ dolog(LOG_WARNING, "%s", p);
else if (strcmp(q, "TRACE") == 0)
- dolog(LOG_DEBUG, p);
+ dolog(LOG_DEBUG, "%s", p);
else if (!(f & f_command))
dolog(LOG_ERR, "unexpected output `%s %s'", q, p);
else if (strcmp(q, "FAIL") == 0) {
{
FILE *fp;
- if ((fp = fopen(name, "a")) != 0) {
+ if (strcmp(name, "-") == 0)
+ logfp = stdout;
+ else if (strcmp(name, "!") == 0)
+ logfp = stderr;
+ else if ((fp = fopen(name, "a")) != 0) {
if (logfp)
fclose(logfp);
logfp = fp;
if (logfp)
writelog("error", d.buf);
else if (logname)
- die(EXIT_FAILURE, d.buf);
+ die(EXIT_FAILURE, "%s", d.buf);
if (f & f_syslog)
syslog(LOG_ERR, "%s", d.buf);
dstr_destroy(&d);
static void sigdie(int sig)
{ cleanup(); signal(sig, SIG_DFL); raise(sig); }
-static void putarg(string_v *av, const char *fmt, ...)
+static void PRINTF_LIKE(2, 3) putarg(string_v *av, const char *fmt, ...)
{
va_list ap;
dstr d = DSTR_INIT;
\n\
-l, --syslog Log messages to system log.\n\
-f, --logfile=FILE Log messages to FILE.\n\
+-t, --no-timestamp When logging to a file, don't emit timestamps.\n\
-w, --warnings Show warnings when running commands.\n\
", fp);
}
{ "spawn-args", OPTF_ARGREQ, 0, 'S' },
{ "syslog", 0, 0, 'l' },
{ "logfile", OPTF_ARGREQ, 0, 'f' },
+ { "no-timestamp", 0, 0, 't' },
{ "warnings", 0, 0, 'w' },
{ "pidfile", OPTF_ARGREQ, 0, 'P' },
{ 0, 0, 0, 0 }
};
- i = mdwopt(argc, argv, "+hvuDU:G:d:a:sp:S:lwf:nP:", opts, 0, 0, 0);
+ i = mdwopt(argc, argv, "+hvuDU:G:d:a:sp:S:lwf:nP:t", opts, 0, 0, 0);
if (i < 0)
break;
switch (i) {
logname = optarg;
f |= f_noinput;
break;
+ case 't':
+ f |= f_nostamp;
+ break;
case 'P':
pidfile = optarg;
break;
die(EXIT_FAILURE, "fork failed: %s", strerror(errno));
if (!kid) {
close(pfd[0]); close(efd[0]);
+ sigprocmask(SIG_SETMASK, &oldmask, 0);
md[0].cur = pfd[1]; md[0].want = STDIN_FILENO;
md[1].cur = pfd[1]; md[1].want = STDOUT_FILENO;
md[2].cur = efd[1]; md[2].want = STDERR_FILENO;