Page MenuHomeFreeBSD

D36005.id108760.diff
No OneTemporary

D36005.id108760.diff

diff --git a/lib/libc/gen/syslog.c b/libc/gen/syslog.c
--- a/lib/libc/gen/syslog.c
+++ b/libc/gen/syslog.c
@@ -65,7 +65,9 @@
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 +87,7 @@
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);
/*
* Format of the magic cookie passed through the stdio hook
@@ -204,13 +207,20 @@
/* 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 (LogPid == -1)
+ LogPid = getpid();
+ (void)fprintf(fp, "%d ", (int)LogPid);
/* Message ID. */
(void)fputs(NILVALUE " ", fp);
/* Structured data. */
@@ -398,9 +408,12 @@
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 +443,7 @@
LogFile = -1;
}
LogTag = NULL;
+ LogTagLength = -1;
connected = false;
THREAD_UNLOCK();
}
@@ -447,3 +461,34 @@
THREAD_UNLOCK();
return (omask);
}
+
+/*
+ * Obtain LogPid from LogTag formatted as following: 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;
+
+ if ((begin = strchr(LogTag, '[')) == NULL)
+ return;
+ if ((end = strchr(begin + 1, ']')) == NULL || end[1] != 0 ||
+ (end - begin) < 2)
+ return;
+
+ pid = (pid_t)strtol(begin + 1, &p, 10);
+ if (p != end)
+ return;
+
+ LogPid = pid;
+ LogTagLength = begin - LogTag;
+}

File Metadata

Mime Type
text/plain
Expires
Mon, Oct 13, 1:42 AM (7 h, 12 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
23650482
Default Alt Text
D36005.id108760.diff (2 KB)

Event Timeline