aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2020-05-15 17:09:23 +0300
committerSergey Poznyakoff <gray@gnu.org>2020-05-15 17:14:02 +0300
commit59e511923e1f7dab729f36c55d006c885f6b460b (patch)
tree8c58415ac6c79b304b46439c1a5c21b7f519c013
parent0ba7a1d81d68f1b1b6f183789c1bb3bcb13ad3d3 (diff)
downloadmicron-59e511923e1f7dab729f36c55d006c885f6b460b.tar.gz
micron-59e511923e1f7dab729f36c55d006c885f6b460b.tar.bz2
Build a better syslog tag
* src/micrond.c (crontab_parse): Build syslog tag from full crontab file name, line number and first word from the command. * src/micrond.h (struct cronjob): Remove line. Add syslog_facility and syslog_tag. (cronjob_unref): Free syslog_tag. * src/runner.c (runner_start): Use job->syslog_facility (struct logbuf): Remove facility and tag. Add job instead. All uses updated.
-rw-r--r--src/micrond.c51
-rw-r--r--src/micrond.h4
-rw-r--r--src/runner.c42
3 files changed, 60 insertions, 37 deletions
diff --git a/src/micrond.c b/src/micrond.c
index ba58849..f2fe4c3 100644
--- a/src/micrond.c
+++ b/src/micrond.c
@@ -1216,6 +1216,25 @@ copy_unquoted(char *dst, char const *src)
}
static int
+parse_syslog_facility(char const *str, int *pf)
+{
+ int n;
+
+ if (*str == 0 ||
+ strcasecmp(str, "off") == 0 ||
+ strcasecmp(str, "none") == 0)
+ return 0;
+ else if (strcasecmp(str, "default") == 0) {
+ *pf = syslog_facility;
+ return 1;
+ } else if ((n = micron_log_str_to_fac(str)) != -1) {
+ *pf = n;
+ return 1;
+ }
+ return -1;
+}
+
+static int
check_var(char const *def)
{
static char syslog_var[] = ENV_SYSLOG_EVENTS;
@@ -1223,14 +1242,10 @@ check_var(char const *def)
if (strncmp(def, syslog_var, syslog_var_len) == 0
&& def[syslog_var_len] == '=') {
+ int n;
+
def += syslog_var_len + 1;
- if (*def == 0
- || strcasecmp(def, "off") == 0
- || strcasecmp(def, "none") == 0
- || strcasecmp(def, "default") == 0
- || micron_log_str_to_fac(def) != -1)
- return 0;
- else
+ if (parse_syslog_facility(def, &n) == -1)
return 1;
}
return 0;
@@ -1281,6 +1296,7 @@ crontab_parse(struct crongroup *cgrp, char const *filename, int ifmod)
struct passwd *pwd;
int env_cont = 1;
struct micron_environ *env;
+ size_t filename_len = strlen(filename);
/* Do nothing if this crongroup is disabled */
if (cgrp->flags & (CGF_DISABLED | CGF_UNSAFE))
@@ -1538,6 +1554,27 @@ crontab_parse(struct crongroup *cgrp, char const *filename, int ifmod)
} else
job->allow_multiple = (int) n;
}
+
+ ep = micron_environ_get(env, &cp->env_head, ENV_SYSLOG_EVENTS);
+ if ((ep && parse_syslog_facility(ep, &job->syslog_facility) == 1) ||
+ (syslog_enable && (job->syslog_facility = LOG_CRON))) {
+ char *tag;
+ int cmdlen = strcspn(job->command, " \t");
+ size_t len = strlen(cp->crongroup->dirname) +
+ cmdlen +
+ filename_len + 80;
+
+ tag = malloc(len);
+ if (!tag) {
+ micron_log(LOG_ERR, PRsCRONTAB ":%u: can't allocate syslog tag",
+ ARGCRONTAB(cgrp, filename), line);
+ } else {
+ snprintf(tag, len, "%s/%s:%u(%*.*s)", cp->crongroup->dirname,
+ filename, line, cmdlen, cmdlen, job->command);
+ job->syslog_tag = tag;
+ }
+ }
+
cronjob_arm(job, ifmod & PARSE_APPLY_NOW);
}
fclose(fp);
diff --git a/src/micrond.h b/src/micrond.h
index db32045..dd71a47 100644
--- a/src/micrond.h
+++ b/src/micrond.h
@@ -42,7 +42,8 @@ struct cronjob {
struct list_head runq; /* Links to the next and prev runqueue
entries */
int fileid; /* Crontab identifier */
- unsigned line; /* Line in file where it is defined */
+ int syslog_facility;
+ char *syslog_tag;
unsigned refcnt; /* Number of times this entry is referenced */
};
@@ -58,6 +59,7 @@ cronjob_unref(struct cronjob *cp)
if (--cp->refcnt == 0) {
LIST_REMOVE(cp, list);
LIST_REMOVE(cp, runq);
+ free(cp->syslog_tag);
free(cp);
cp = NULL;
}
diff --git a/src/runner.c b/src/runner.c
index ee0293c..667146e 100644
--- a/src/runner.c
+++ b/src/runner.c
@@ -170,7 +170,6 @@ runner_start(struct cronjob *job)
int fd;
struct proctab *pt;
int p[2];
- int pt_syslog = 0;
char const *ep;
micron_log(LOG_DEBUG, "running \"%s\" on behalf of %lu.%lu",
@@ -201,20 +200,7 @@ runner_start(struct cronjob *job)
job->refcnt - 1);
}
- ep = env_get(ENV_SYSLOG_EVENTS, env);
- if (ep) {
- if (*ep == 0 ||
- strcasecmp(ep, "off") == 0 ||
- strcasecmp(ep, "none") == 0)
- pt_syslog = 0;
- else if (strcasecmp(ep, "default") == 0)
- pt_syslog = syslog_facility;
- else {
- pt_syslog = micron_log_str_to_fac(ep);
- }
- }
-
- if (pt_syslog) {
+ if (job->syslog_facility) {
if (pipe(p)) {
micron_log(LOG_ERR, "pipe: %s", strerror(errno));
env_free(env);
@@ -291,13 +277,13 @@ runner_start(struct cronjob *job)
pt->pid = pid;
pt->job = job;
pt->env = env;
- pt->syslog = pt_syslog;
- if (pt_syslog) {
+ pt->syslog = job->syslog_facility;
+ if (pt->syslog) {
close(p[1]);
fd = p[0];
}
pt->fd = fd;
- if (pt_syslog)
+ if (pt->syslog)
logger_enqueue(pt);
pthread_cond_broadcast(&proctab_cond);
pthread_mutex_unlock(&proctab_mutex);
@@ -462,8 +448,7 @@ static pthread_t logger_tid = 0;
struct logbuf {
int fd;
- int facility;
- char const *tag;
+ struct cronjob *job;
pid_t pid;
char *buffer;
size_t level;
@@ -489,9 +474,9 @@ logbuf_flush(struct logbuf *bp, int flushall)
} else
break;
- micron_log_enqueue(bp->facility|LOG_INFO,
+ micron_log_enqueue(bp->job->syslog_facility|LOG_INFO,
bp->buffer,
- bp->tag,
+ bp->job->syslog_tag,
bp->pid);
if (len > 0)
memmove(bp->buffer, p, len);
@@ -579,6 +564,7 @@ cron_thr_logger(void *arg)
logbuf_flush(bp, 1);
close(bp->fd);
LIST_REMOVE(bp, link);
+ cronjob_unref(bp->job);
free(bp->buffer);
free(bp);
reinit = 1;
@@ -609,16 +595,13 @@ logger_enqueue(struct proctab *pt)
pthread_create(&logger_tid, &attr, cron_thr_logger, NULL);
pthread_attr_destroy(&attr);
}
-
- taglen = strlen(pt->job->command);
- bp = calloc(1, sizeof(*bp) + taglen + 1);
+ cronjob_ref(pt->job);
+ bp = calloc(1, sizeof(*bp));
if (bp) {
int c;
bp->fd = pt->fd;
- bp->facility = pt->syslog;
- bp->tag = (char*)(bp + 1);
- strcpy((char*)bp->tag, pt->job->command);
+ bp->job = pt->job;
bp->pid = pt->pid;
pt->fd = -1;
@@ -630,5 +613,6 @@ logger_enqueue(struct proctab *pt)
micron_log(LOG_ERR, "error writing to control pipe: %s",
strerror(errno));
}
- }
+ } else
+ cronjob_unref(pt->job);
}

Return to:

Send suggestions and report system problems to the System administrator.