aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/gen/syslog.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/gen/syslog.c')
-rw-r--r--lib/libc/gen/syslog.c61
1 files changed, 54 insertions, 7 deletions
diff --git a/lib/libc/gen/syslog.c b/lib/libc/gen/syslog.c
index a466b4cbc49e..a6290ee81a29 100644
--- a/lib/libc/gen/syslog.c
+++ b/lib/libc/gen/syslog.c
@@ -29,10 +29,6 @@
* SUCH DAMAGE.
*/
-#include <sys/cdefs.h>
-__SCCSID("@(#)syslog.c 8.5 (Berkeley) 4/29/95");
-__FBSDID("$FreeBSD$");
-
#include "namespace.h"
#include <sys/param.h>
#include <sys/socket.h>
@@ -65,7 +61,9 @@ static int LogFile = -1; /* fd for log */
static bool connected; /* have done connect */
static int opened; /* have done openlog() */
static int LogStat = 0; /* status bits, set by openlog() */
+static pid_t LogPid = -1; /* process id to tag the entry with */
static const char *LogTag = NULL; /* string to tag the entry with */
+static int LogTagLength = -1; /* usable part of LogTag */
static int LogFacility = LOG_USER; /* default facility code */
static int LogMask = 0xff; /* mask of priorities to be logged */
static pthread_mutex_t syslog_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -85,6 +83,7 @@ static pthread_mutex_t syslog_mutex = PTHREAD_MUTEX_INITIALIZER;
static void disconnectlog(void); /* disconnect from syslogd */
static void connectlog(void); /* (re)connect to syslogd */
static void openlog_unlocked(const char *, int, int);
+static void parse_tag(void); /* parse ident[NNN] if needed */
/*
* Format of the magic cookie passed through the stdio hook
@@ -204,13 +203,20 @@ vsyslog1(int pri, const char *fmt, va_list ap)
/* Application name. */
if (LogTag == NULL)
LogTag = _getprogname();
- (void)fprintf(fp, "%s ", LogTag == NULL ? NILVALUE : LogTag);
+ else if (LogTagLength == -1)
+ parse_tag();
+ if (LogTagLength > 0)
+ (void)fprintf(fp, "%.*s ", LogTagLength, LogTag);
+ else
+ (void)fprintf(fp, "%s ", LogTag == NULL ? NILVALUE : LogTag);
/*
* Provide the process ID regardless of whether LOG_PID has been
* specified, as it provides valuable information. Many
* applications tend not to use this, even though they should.
*/
- (void)fprintf(fp, "%d ", getpid());
+ if (LogTagLength <= 0)
+ LogPid = getpid();
+ (void)fprintf(fp, "%d ", (int)LogPid);
/* Message ID. */
(void)fputs(NILVALUE " ", fp);
/* Structured data. */
@@ -398,9 +404,12 @@ connectlog(void)
static void
openlog_unlocked(const char *ident, int logstat, int logfac)
{
- if (ident != NULL)
+ if (ident != NULL) {
LogTag = ident;
+ LogTagLength = -1;
+ }
LogStat = logstat;
+ parse_tag();
if (logfac != 0 && (logfac &~ LOG_FACMASK) == 0)
LogFacility = logfac;
@@ -430,6 +439,7 @@ closelog(void)
LogFile = -1;
}
LogTag = NULL;
+ LogTagLength = -1;
connected = false;
THREAD_UNLOCK();
}
@@ -447,3 +457,40 @@ setlogmask(int pmask)
THREAD_UNLOCK();
return (omask);
}
+
+/*
+ * Obtain LogPid from LogTag formatted as per RFC 3164,
+ * Section 5.3 Originating Process Information:
+ *
+ * ident[NNN]
+ */
+static void
+parse_tag(void)
+{
+ char *begin, *end, *p;
+ pid_t pid;
+
+ if (LogTag == NULL || (LogStat & LOG_PID) != 0)
+ return;
+ /*
+ * LogTagLength is -1 if LogTag was not parsed yet.
+ * Avoid multiple passes over same LogTag.
+ */
+ LogTagLength = 0;
+
+ /* Check for presence of opening [ and non-empty ident. */
+ if ((begin = strchr(LogTag, '[')) == NULL || begin == LogTag)
+ return;
+ /* Check for presence of closing ] at the very end and non-empty pid. */
+ if ((end = strchr(begin + 1, ']')) == NULL || end[1] != 0 ||
+ (end - begin) < 2)
+ return;
+
+ /* Check for pid to contain digits only. */
+ pid = (pid_t)strtol(begin + 1, &p, 10);
+ if (p != end)
+ return;
+
+ LogPid = pid;
+ LogTagLength = begin - LogTag;
+}