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

Reply via email to