summaryrefslogtreecommitdiff
path: root/syslogd/main.c
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@tele2.at>2018-08-13 22:06:34 +0200
committerDavid Oberhollenzer <david.oberhollenzer@tele2.at>2018-08-13 22:06:34 +0200
commit0624f95de639a41e8a47c264cdb7387a386a4dcd (patch)
treee2385f329e659eace10c91af28bad30c31c16627 /syslogd/main.c
parente15208097cf3e97c8165536c2005e53961227621 (diff)
usyslogd: cleanup log file filename handling
Signed-off-by: David Oberhollenzer <david.oberhollenzer@tele2.at>
Diffstat (limited to 'syslogd/main.c')
-rw-r--r--syslogd/main.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/syslogd/main.c b/syslogd/main.c
index 263c87d..b98c414 100644
--- a/syslogd/main.c
+++ b/syslogd/main.c
@@ -121,9 +121,10 @@ static void signal_setup(void)
static int print_to_log(const syslog_msg_t *msg)
{
const char *fac_name, *lvl_str;
- char timebuf[32];
+ char timebuf[32], *filename;
logfile_t *log;
struct tm tm;
+ size_t len;
fac_name = enum_to_name(facilities, msg->facility);
if (fac_name == NULL)
@@ -133,17 +134,29 @@ static int print_to_log(const syslog_msg_t *msg)
if (lvl_str == NULL)
return -1;
+ if (msg->ident) {
+ len = strlen(msg->ident) + 1 + strlen(fac_name) + 1;
+ filename = alloca(len);
+ sprintf(filename, "%s/%s", msg->ident, fac_name);
+ } else {
+ filename = (char *)fac_name;
+ }
+
for (log = logfiles; log != NULL; log = log->next) {
if (log->facility != msg->facility)
continue;
- if (msg->ident == NULL && log->ident[0] == '\0')
- break;
- if (msg->ident != NULL && strcmp(msg->ident, log->ident) == 0)
+ if (strcmp(filename, log->filename) == 0)
break;
}
if (log == NULL) {
- log = logfile_create(msg->ident, fac_name, msg->facility);
+ if (msg->ident != NULL && mkdir(msg->ident, 0750) != 0 &&
+ errno != EEXIST) {
+ perror(msg->ident);
+ return -1;
+ }
+
+ log = logfile_create(filename, msg->facility);
if (log == NULL)
return -1;
log->next = logfiles;