Merge branch 'logger-fix-tcp-framing' of https://github.com/rgerhards/util-linux
* 'logger-fix-tcp-framing' of https://github.com/rgerhards/util-linux: logger: bugfix: tcp syslog framing is broken, -T unusable logger: refactor the way output is written
This commit is contained in:
commit
0d1f3a707d
1 changed files with 27 additions and 13 deletions
|
@ -332,6 +332,30 @@ rfc3164_current_time(void)
|
||||||
return time;
|
return time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* writes generated buffer to desired destination. For TCP syslog,
|
||||||
|
* we use RFC6587 octet-stuffing. This is not great, but doing
|
||||||
|
* full blown RFC5425 (TLS) looks like it is too much for the
|
||||||
|
* logger utility.
|
||||||
|
*/
|
||||||
|
static void write_output(const struct logger_ctl *ctl, const char *const buf,
|
||||||
|
const size_t len)
|
||||||
|
{
|
||||||
|
if (write_all(ctl->fd, buf, len) < 0)
|
||||||
|
warn(_("write failed"));
|
||||||
|
else
|
||||||
|
if (ctl->socket_type == TYPE_TCP)
|
||||||
|
/* using an additional write seems like the best compromise:
|
||||||
|
* - writev() is not yet supported by framework
|
||||||
|
* - adding the \n to the buffer in formatters violates layers
|
||||||
|
* - adding \n after the fact requires memory copy
|
||||||
|
* - logger is not a high-performance app
|
||||||
|
*/
|
||||||
|
if (write_all(ctl->fd, "\n", 1) < 0)
|
||||||
|
warn(_("write failed"));
|
||||||
|
if (ctl->stderr_printout)
|
||||||
|
fprintf(stderr, "%s\n", buf);
|
||||||
|
}
|
||||||
|
|
||||||
static void syslog_rfc3164(const struct logger_ctl *ctl, const char *msg)
|
static void syslog_rfc3164(const struct logger_ctl *ctl, const char *msg)
|
||||||
{
|
{
|
||||||
char *buf, pid[30], *cp, *hostname, *dot;
|
char *buf, pid[30], *cp, *hostname, *dot;
|
||||||
|
@ -353,10 +377,7 @@ static void syslog_rfc3164(const struct logger_ctl *ctl, const char *msg)
|
||||||
len = xasprintf(&buf, "<%d>%.15s %s %.200s%s: %.400s",
|
len = xasprintf(&buf, "<%d>%.15s %s %.200s%s: %.400s",
|
||||||
ctl->pri, rfc3164_current_time(), hostname, cp, pid, msg);
|
ctl->pri, rfc3164_current_time(), hostname, cp, pid, msg);
|
||||||
|
|
||||||
if (write_all(ctl->fd, buf, len) < 0)
|
write_output(ctl, buf, len);
|
||||||
warn(_("write failed"));
|
|
||||||
if (ctl->stderr_printout)
|
|
||||||
fprintf(stderr, "%s\n", buf);
|
|
||||||
|
|
||||||
free(hostname);
|
free(hostname);
|
||||||
free(buf);
|
free(buf);
|
||||||
|
@ -427,11 +448,7 @@ static void syslog_rfc5424(const struct logger_ctl *ctl, const char *msg)
|
||||||
hostname ? hostname : "",
|
hostname ? hostname : "",
|
||||||
tag, pid, timeq, msg);
|
tag, pid, timeq, msg);
|
||||||
|
|
||||||
if (write_all(ctl->fd, buf, len) < 0)
|
write_output(ctl, buf, len);
|
||||||
warn(_("write failed"));
|
|
||||||
|
|
||||||
if (ctl->stderr_printout)
|
|
||||||
fprintf(stderr, "%s\n", buf);
|
|
||||||
|
|
||||||
free(hostname);
|
free(hostname);
|
||||||
free(buf);
|
free(buf);
|
||||||
|
@ -483,10 +500,7 @@ static void syslog_local(const struct logger_ctl *ctl, const char *msg)
|
||||||
|
|
||||||
len = xasprintf(&buf, "<%d>%s %s%s: %s", ctl->pri, rfc3164_current_time(),
|
len = xasprintf(&buf, "<%d>%s %s%s: %s", ctl->pri, rfc3164_current_time(),
|
||||||
tag, pid, msg);
|
tag, pid, msg);
|
||||||
if (write_all(ctl->fd, buf, len) < 0)
|
write_output(ctl, buf, len);
|
||||||
warn(_("write failed"));
|
|
||||||
if (ctl->stderr_printout)
|
|
||||||
fprintf(stderr, "%s\n", buf);
|
|
||||||
free(buf);
|
free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue