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