Module Name: src
Committed By: christos
Date: Thu Jan 12 01:58:39 UTC 2017
Modified Files:
src/lib/libc/gen: syslog.c syslog_private.h syslog_ss.c xsyslog.c
Log Message:
A little more restructuring so that we don't need mutex stuff in syslog_ss.
To generate a diff of this commit:
cvs rdiff -u -r1.56 -r1.57 src/lib/libc/gen/syslog.c
cvs rdiff -u -r1.1 -r1.2 src/lib/libc/gen/syslog_private.h \
src/lib/libc/gen/syslog_ss.c src/lib/libc/gen/xsyslog.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libc/gen/syslog.c
diff -u src/lib/libc/gen/syslog.c:1.56 src/lib/libc/gen/syslog.c:1.57
--- src/lib/libc/gen/syslog.c:1.56 Wed Jan 11 19:38:01 2017
+++ src/lib/libc/gen/syslog.c Wed Jan 11 20:58:39 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: syslog.c,v 1.56 2017/01/12 00:38:01 christos Exp $ */
+/* $NetBSD: syslog.c,v 1.57 2017/01/12 01:58:39 christos Exp $ */
/*
* Copyright (c) 1983, 1988, 1993
@@ -34,7 +34,7 @@
#if 0
static char sccsid[] = "@(#)syslog.c 8.5 (Berkeley) 4/29/95";
#else
-__RCSID("$NetBSD: syslog.c,v 1.56 2017/01/12 00:38:01 christos Exp $");
+__RCSID("$NetBSD: syslog.c,v 1.57 2017/01/12 01:58:39 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@@ -67,6 +67,15 @@ __weak_alias(syslog,_syslog)
__weak_alias(vsyslog,_vsyslog)
__weak_alias(syslogp,_syslogp)
__weak_alias(vsyslogp,_vsyslogp)
+__weak_alias(closelog,_closelog)
+__weak_alias(openlog,_openlog)
+__weak_alias(setlogmask,_setlogmask)
+#endif
+
+static struct syslog_data _syslog_data = SYSLOG_DATA_INIT;
+
+#ifdef _REENTRANT
+static mutex_t syslog_mutex = MUTEX_INITIALIZER;
#endif
static size_t
@@ -103,6 +112,24 @@ timefun(char *p, size_t tbuf_left)
return (size_t)(p - op);
}
+static int
+lock(const struct syslog_data *data)
+{
+ int rv = data == &_syslog_data;
+ if (rv)
+ mutex_lock(&syslog_mutex);
+ return rv;
+}
+
+static int
+unlock(const struct syslog_data *data)
+{
+ int rv = data == &_syslog_data;
+ if (rv)
+ mutex_unlock(&syslog_mutex);
+ return rv;
+}
+
static struct syslog_fun _syslog_fun = {
timefun,
strerror_r,
@@ -111,8 +138,46 @@ static struct syslog_fun _syslog_fun = {
#else
vsnprintf,
#endif
+ lock,
+ unlock,
};
+void
+openlog(const char *ident, int logstat, int logfac)
+{
+ openlog_r(ident, logstat, logfac, &_syslog_data);
+}
+
+void
+closelog(void)
+{
+ closelog_r(&_syslog_data);
+}
+
+/* setlogmask -- set the log mask level */
+int
+setlogmask(int pmask)
+{
+ return setlogmask_r(pmask, &_syslog_data);
+}
+
+void
+openlog_r(const char *ident, int logstat, int logfac, struct syslog_data *data)
+{
+ lock(data);
+ _openlog_unlocked_r(ident, logstat, logfac, data);
+ unlock(data);
+}
+
+void
+closelog_r(struct syslog_data *data)
+{
+ lock(data);
+ _closelog_unlocked_r(data);
+ data->log_tag = NULL;
+ unlock(data);
+}
+
/*
* syslog, vsyslog --
* print message on log file; output is intended for syslogd(8).
Index: src/lib/libc/gen/syslog_private.h
diff -u src/lib/libc/gen/syslog_private.h:1.1 src/lib/libc/gen/syslog_private.h:1.2
--- src/lib/libc/gen/syslog_private.h:1.1 Wed Jan 11 19:38:01 2017
+++ src/lib/libc/gen/syslog_private.h Wed Jan 11 20:58:39 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: syslog_private.h,v 1.1 2017/01/12 00:38:01 christos Exp $ */
+/* $NetBSD: syslog_private.h,v 1.2 2017/01/12 01:58:39 christos Exp $ */
/*-
* Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -41,10 +41,13 @@ struct syslog_fun {
size_t (*timefun)(char *, size_t);
int (*errfun)(int, char *, size_t);
int __printflike(3, 0) (*prfun)(char *, size_t, const char *, va_list);
+ int (*lock)(const struct syslog_data *);
+ int (*unlock)(const struct syslog_data *);
};
void _vxsyslogp_r(int , struct syslog_fun *, struct syslog_data *,
const char *, const char *, const char *, va_list);
+void _openlog_unlocked_r(const char *, int, int, struct syslog_data *);
+void _closelog_unlocked_r(struct syslog_data *);
-extern struct syslog_data _syslog_data;
extern struct syslog_fun _syslog_ss_fun;
Index: src/lib/libc/gen/syslog_ss.c
diff -u src/lib/libc/gen/syslog_ss.c:1.1 src/lib/libc/gen/syslog_ss.c:1.2
--- src/lib/libc/gen/syslog_ss.c:1.1 Wed Jan 11 19:38:01 2017
+++ src/lib/libc/gen/syslog_ss.c Wed Jan 11 20:58:39 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: syslog_ss.c,v 1.1 2017/01/12 00:38:01 christos Exp $ */
+/* $NetBSD: syslog_ss.c,v 1.2 2017/01/12 01:58:39 christos Exp $ */
/*-
* Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: syslog_ss.c,v 1.1 2017/01/12 00:38:01 christos Exp $");
+__RCSID("$NetBSD: syslog_ss.c,v 1.2 2017/01/12 01:58:39 christos Exp $");
#endif /* LIBC_SCCS and not lint */
#include "namespace.h"
@@ -54,10 +54,24 @@ timefun_ss(char *p, size_t tbuf_left)
#endif
}
+static int
+lock_ss(const struct syslog_data *data __unused)
+{
+ return 0;
+}
+
+static int
+unlock_ss(const struct syslog_data *data __unused)
+{
+ return 0;
+}
+
struct syslog_fun _syslog_ss_fun = {
timefun_ss,
strerror_r_ss,
vsnprintf_ss,
+ lock_ss,
+ unlock_ss,
};
void
Index: src/lib/libc/gen/xsyslog.c
diff -u src/lib/libc/gen/xsyslog.c:1.1 src/lib/libc/gen/xsyslog.c:1.2
--- src/lib/libc/gen/xsyslog.c:1.1 Wed Jan 11 19:38:01 2017
+++ src/lib/libc/gen/xsyslog.c Wed Jan 11 20:58:39 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: xsyslog.c,v 1.1 2017/01/12 00:38:01 christos Exp $ */
+/* $NetBSD: xsyslog.c,v 1.2 2017/01/12 01:58:39 christos Exp $ */
/*
* Copyright (c) 1983, 1988, 1993
@@ -34,7 +34,7 @@
#if 0
static char sccsid[] = "@(#)syslog.c 8.5 (Berkeley) 4/29/95";
#else
-__RCSID("$NetBSD: xsyslog.c,v 1.1 2017/01/12 00:38:01 christos Exp $");
+__RCSID("$NetBSD: xsyslog.c,v 1.2 2017/01/12 01:58:39 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@@ -58,40 +58,70 @@ __RCSID("$NetBSD: xsyslog.c,v 1.1 2017/0
#include "reentrant.h"
#include "extern.h"
-#ifdef __weak_alias
-__weak_alias(closelog,_closelog)
-__weak_alias(openlog,_openlog)
-__weak_alias(setlogmask,_setlogmask)
-#endif
-
-struct syslog_data _syslog_data = SYSLOG_DATA_INIT;
-
-static void openlog_unlocked_r(const char *, int, int,
- struct syslog_data *);
-static void disconnectlog_r(struct syslog_data *);
-static void connectlog_r(struct syslog_data *);
-
-#ifdef _REENTRANT
-static mutex_t syslog_mutex = MUTEX_INITIALIZER;
-#endif
+static void
+disconnectlog_r(struct syslog_data *data)
+{
+ /*
+ * If the user closed the FD and opened another in the same slot,
+ * that's their problem. They should close it before calling on
+ * system services.
+ */
+ if (data->log_file != -1) {
+ (void)close(data->log_file);
+ data->log_file = -1;
+ }
+ data->log_connected = 0; /* retry connect */
+}
-void
-openlog(const char *ident, int logstat, int logfac)
+static void
+connectlog_r(struct syslog_data *data)
{
- openlog_r(ident, logstat, logfac, &_syslog_data);
+ /* AF_UNIX address of local logger */
+ static const struct sockaddr_un sun = {
+ .sun_family = AF_LOCAL,
+ .sun_len = sizeof(sun),
+ .sun_path = _PATH_LOG,
+ };
+
+ if (data->log_file == -1 || fcntl(data->log_file, F_GETFL, 0) == -1) {
+ if ((data->log_file = socket(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC,
+ 0)) == -1)
+ return;
+ data->log_connected = 0;
+ }
+ if (!data->log_connected) {
+ if (connect(data->log_file,
+ (const struct sockaddr *)(const void *)&sun,
+ (socklen_t)sizeof(sun)) == -1) {
+ (void)close(data->log_file);
+ data->log_file = -1;
+ } else
+ data->log_connected = 1;
+ }
}
void
-closelog(void)
+_openlog_unlocked_r(const char *ident, int logstat, int logfac,
+ struct syslog_data *data)
{
- closelog_r(&_syslog_data);
+ if (ident != NULL)
+ data->log_tag = ident;
+ data->log_stat = logstat;
+ if (logfac != 0 && (logfac &~ LOG_FACMASK) == 0)
+ data->log_fac = logfac;
+
+ if (data->log_stat & LOG_NDELAY) /* open immediately */
+ connectlog_r(data);
+
+ data->log_opened = 1;
}
-/* setlogmask -- set the log mask level */
-int
-setlogmask(int pmask)
+void
+_closelog_unlocked_r(struct syslog_data *data)
{
- return setlogmask_r(pmask, &_syslog_data);
+ (void)close(data->log_file);
+ data->log_file = -1;
+ data->log_connected = 0;
}
static void
@@ -151,8 +181,7 @@ _vxsyslogp_r(int pri, struct syslog_fun
prlen = (*fun->timefun)(p, tbuf_left);
- if (data == &_syslog_data)
- mutex_lock(&syslog_mutex);
+ (*fun->lock)(data);
if (data->log_hostname[0] == '\0' && gethostname(data->log_hostname,
sizeof(data->log_hostname)) == -1) {
@@ -171,8 +200,7 @@ _vxsyslogp_r(int pri, struct syslog_fun
prlen = snprintf_ss(p, tbuf_left, "%s ",
data->log_tag ? data->log_tag : "-");
- if (data == &_syslog_data)
- mutex_unlock(&syslog_mutex);
+ (*fun->unlock)(data);
if (data->log_stat & (LOG_PERROR|LOG_CONS)) {
iovcnt = 0;
@@ -279,11 +307,10 @@ _vxsyslogp_r(int pri, struct syslog_fun
}
/* Get connected, output the message to the local logger. */
- if (data == &_syslog_data)
- mutex_lock(&syslog_mutex);
+ (*fun->lock)(data);
opened = !data->log_opened;
if (opened)
- openlog_unlocked_r(data->log_tag, data->log_stat, 0, data);
+ _openlog_unlocked_r(data->log_tag, data->log_stat, 0, data);
connectlog_r(data);
/*
@@ -318,96 +345,8 @@ _vxsyslogp_r(int pri, struct syslog_fun
(void)close(fd);
}
- if (data == &_syslog_data)
- mutex_unlock(&syslog_mutex);
-
- if (data != &_syslog_data && opened) {
- /* preserve log tag */
- const char *ident = data->log_tag;
- closelog_r(data);
- data->log_tag = ident;
- }
-}
-
-static void
-disconnectlog_r(struct syslog_data *data)
-{
- /*
- * If the user closed the FD and opened another in the same slot,
- * that's their problem. They should close it before calling on
- * system services.
- */
- if (data->log_file != -1) {
- (void)close(data->log_file);
- data->log_file = -1;
- }
- data->log_connected = 0; /* retry connect */
-}
-
-static void
-connectlog_r(struct syslog_data *data)
-{
- /* AF_UNIX address of local logger */
- static const struct sockaddr_un sun = {
- .sun_family = AF_LOCAL,
- .sun_len = sizeof(sun),
- .sun_path = _PATH_LOG,
- };
-
- if (data->log_file == -1 || fcntl(data->log_file, F_GETFL, 0) == -1) {
- if ((data->log_file = socket(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC,
- 0)) == -1)
- return;
- data->log_connected = 0;
- }
- if (!data->log_connected) {
- if (connect(data->log_file,
- (const struct sockaddr *)(const void *)&sun,
- (socklen_t)sizeof(sun)) == -1) {
- (void)close(data->log_file);
- data->log_file = -1;
- } else
- data->log_connected = 1;
- }
-}
-
-static void
-openlog_unlocked_r(const char *ident, int logstat, int logfac,
- struct syslog_data *data)
-{
- if (ident != NULL)
- data->log_tag = ident;
- data->log_stat = logstat;
- if (logfac != 0 && (logfac &~ LOG_FACMASK) == 0)
- data->log_fac = logfac;
-
- if (data->log_stat & LOG_NDELAY) /* open immediately */
- connectlog_r(data);
-
- data->log_opened = 1;
-}
-
-void
-openlog_r(const char *ident, int logstat, int logfac, struct syslog_data *data)
-{
- if (data == &_syslog_data)
- mutex_lock(&syslog_mutex);
- openlog_unlocked_r(ident, logstat, logfac, data);
- if (data == &_syslog_data)
- mutex_unlock(&syslog_mutex);
-}
-
-void
-closelog_r(struct syslog_data *data)
-{
- if (data == &_syslog_data)
- mutex_lock(&syslog_mutex);
- (void)close(data->log_file);
- data->log_file = -1;
- data->log_connected = 0;
- data->log_tag = NULL;
- if (data == &_syslog_data)
- mutex_unlock(&syslog_mutex);
+ if (!(*fun->unlock)(data) && opened)
+ _closelog_unlocked_r(data);
}
int