aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/syslogd/syslogd.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/syslogd/syslogd.c')
-rw-r--r--usr.sbin/syslogd/syslogd.c120
1 files changed, 53 insertions, 67 deletions
diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c
index e06464c0e749..59cb56fd5970 100644
--- a/usr.sbin/syslogd/syslogd.c
+++ b/usr.sbin/syslogd/syslogd.c
@@ -370,43 +370,19 @@ static void increase_rcvbuf(int);
static void
close_filed(struct filed *f)
{
- switch (f->f_type) {
- case F_FORW:
- if (f->f_addr_fds != NULL) {
- free(f->f_addrs);
- for (size_t i = 0; i < f->f_num_addr_fds; ++i)
- close(f->f_addr_fds[i]);
- free(f->f_addr_fds);
- f->f_addr_fds = NULL;
- f->f_num_addr_fds = 0;
- }
- /* FALLTHROUGH */
- case F_FILE:
- case F_TTY:
- case F_CONSOLE:
- f->f_type = F_UNUSED;
- break;
- case F_PIPE:
- if (f->f_procdesc != -1) {
- /*
- * Close the procdesc, killing the underlying
- * process (if it is still alive).
- */
- (void)close(f->f_procdesc);
- f->f_procdesc = -1;
- /*
- * The pipe process is guaranteed to be dead now,
- * so remove it from the deadq.
- */
- if (f->f_dq != NULL) {
- deadq_remove(f->f_dq);
- f->f_dq = NULL;
- }
- }
- break;
- default:
- break;
+ if (f->f_type == F_FORW && f->f_addr_fds != NULL) {
+ free(f->f_addrs);
+ for (size_t i = 0; i < f->f_num_addr_fds; ++i)
+ close(f->f_addr_fds[i]);
+ free(f->f_addr_fds);
+ f->f_addr_fds = NULL;
+ f->f_num_addr_fds = 0;
+ } else if (f->f_type == F_PIPE && f->f_procdesc != -1) {
+ f->f_dq = deadq_enter(f->f_procdesc);
}
+
+ f->f_type = F_UNUSED;
+
if (f->f_file != -1)
(void)close(f->f_file);
f->f_file = -1;
@@ -805,23 +781,44 @@ main(int argc, char *argv[])
case EVFILT_SIGNAL:
switch (ev.ident) {
case SIGHUP:
+ /* Reload */
init(true);
break;
case SIGINT:
case SIGQUIT:
+ /* Ignore these unless -F and / or -d */
+ if (!Foreground && !Debug)
+ break;
+ /* FALLTHROUGH */
case SIGTERM:
- if (ev.ident == SIGTERM || Debug)
- die(ev.ident);
+ /* Terminate */
+ die(ev.ident);
break;
case SIGALRM:
+ /* Mark and flush */
markit();
break;
}
break;
case EVFILT_PROCDESC:
if ((ev.fflags & NOTE_EXIT) != 0) {
- log_deadchild(ev.ident, ev.data, ev.udata);
- close_filed(ev.udata);
+ struct filed *f = ev.udata;
+
+ log_deadchild(f->f_procdesc, ev.data, f);
+ (void)close(f->f_procdesc);
+
+ f->f_procdesc = -1;
+ if (f->f_dq != NULL) {
+ deadq_remove(f->f_dq);
+ f->f_dq = NULL;
+ }
+
+ /*
+ * If it is unused, then it was already closed.
+ * Free the file data in this case.
+ */
+ if (f->f_type == F_UNUSED)
+ free(f);
}
break;
}
@@ -2272,9 +2269,6 @@ die(int signo)
/* flush any pending output */
if (f->f_prevcount)
fprintlog_successive(f, 0);
- /* terminate existing pipe processes */
- if (f->f_type == F_PIPE)
- close_filed(f);
}
if (signo) {
dprintf("syslogd: exiting on signal %d\n", signo);
@@ -2517,23 +2511,7 @@ closelogfiles(void)
case F_FORW:
case F_CONSOLE:
case F_TTY:
- close_filed(f);
- break;
case F_PIPE:
- if (f->f_procdesc != -1) {
- struct kevent ev;
- /*
- * This filed is going to be freed.
- * Delete procdesc kevents that reference it.
- */
- EV_SET(&ev, f->f_procdesc, EVFILT_PROCDESC,
- EV_DELETE, NOTE_EXIT, 0, f);
- if (kevent(kq, &ev, 1, NULL, 0, NULL) == -1) {
- logerror("failed to delete procdesc"
- "kevent");
- exit(1);
- }
- }
close_filed(f);
break;
default:
@@ -2554,7 +2532,13 @@ closelogfiles(void)
}
free(f->f_prop_filter);
}
- free(f);
+
+ /*
+ * If a piped process is running, then defer the filed
+ * cleanup until it exits.
+ */
+ if (f->f_type != F_PIPE || f->f_procdesc == -1)
+ free(f);
}
}
@@ -2836,7 +2820,7 @@ prop_filter_compile(const char *cfilter)
pfilter.cmp_type = FILT_CMP_REGEX;
else if (strcasecmp(argv[1], "ereregex") == 0) {
pfilter.cmp_type = FILT_CMP_REGEX;
- pfilter.cmp_flags |= REG_EXTENDED;
+ pfilter.cmp_flags |= FILT_FLAG_EXTENDED;
} else {
dprintf("unknown cmp function");
goto error;
@@ -2954,8 +2938,9 @@ parse_selector(const char *p, struct filed *f)
pri = decode(buf, prioritynames);
if (pri < 0) {
- dprintf("unknown priority name \"%s\"", buf);
- return (NULL);
+ warnx("unknown priority name \"%s\", setting to 'info'",
+ buf);
+ pri = LOG_INFO;
}
}
if (!pri_cmp)
@@ -2977,11 +2962,12 @@ parse_selector(const char *p, struct filed *f)
} else {
i = decode(buf, facilitynames);
if (i < 0) {
- dprintf("unknown facility name \"%s\"", buf);
- return (NULL);
+ warnx("unknown facility name \"%s\", ignoring",
+ buf);
+ } else {
+ f->f_pmask[i >> 3] = pri;
+ f->f_pcmp[i >> 3] = pri_cmp;
}
- f->f_pmask[i >> 3] = pri;
- f->f_pcmp[i >> 3] = pri_cmp;
}
while (*p == ',' || *p == ' ')
p++;