| From 9e42c405f30d2b52d019598436ea346ef8586f43 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?No=C3=A9=20Rubinstein?= <nrubinstein@aldebaran.com> |
| Date: Wed, 24 Aug 2016 18:55:25 +0200 |
| Subject: [PATCH] Check that getpwent_r is available before using it |
| |
| This fixes building trousers with musl |
| |
| Signed-off-by: Noé Rubinstein <nrubinstein@aldebaran.com> |
| [Bernd: Rebased for version 0.3.14] |
| Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de> |
| --- |
| configure.ac | 4 ++++ |
| src/tspi/ps/tspps.c | 10 +++++----- |
| 2 files changed, 9 insertions(+), 5 deletions(-) |
| |
| diff --git a/configure.in b/configure.in |
| index fd3f5f1..e3d7acf 100644 |
| --- a/configure.ac |
| +++ b/configure.ac |
| @@ -145,6 +145,10 @@ else |
| AC_MSG_ERROR(["gtk", "openssl" and "none" are the only supported gui options for trousers]) |
| fi |
| |
| +# Look for getpwent_r. If it is not found, getpwent will be used instead, with |
| +# an additional mutex. |
| +AC_CHECK_FUNC(getpwent_r, [AC_DEFINE(HAVE_GETPWENT_R)]) |
| + |
| # |
| # The default port that the TCS daemon listens on |
| # |
| diff --git a/src/tspi/ps/tspps.c b/src/tspi/ps/tspps.c |
| index c6f9c3d..9d00d2a 100644 |
| --- a/src/tspi/ps/tspps.c |
| +++ b/src/tspi/ps/tspps.c |
| @@ -45,7 +45,7 @@ |
| |
| static int user_ps_fd = -1; |
| static MUTEX_DECLARE_INIT(user_ps_lock); |
| -#if (defined (__FreeBSD__) || defined (__OpenBSD__)) |
| +#ifndef HAVE_GETPWENT_R |
| static MUTEX_DECLARE_INIT(user_ps_path); |
| #endif |
| static struct flock fl; |
| @@ -60,7 +60,7 @@ get_user_ps_path(char **file) |
| TSS_RESULT result; |
| char *file_name = NULL, *home_dir = NULL; |
| struct passwd *pwp; |
| -#if (defined (__linux) || defined (linux) || defined(__GLIBC__)) |
| +#ifdef HAVE_GETPWENT_R |
| struct passwd pw; |
| #endif |
| struct stat stat_buf; |
| @@ -72,7 +72,7 @@ get_user_ps_path(char **file) |
| *file = strdup(file_name); |
| return (*file) ? TSS_SUCCESS : TSPERR(TSS_E_OUTOFMEMORY); |
| } |
| -#if (defined (__FreeBSD__) || defined (__OpenBSD__)) |
| +#ifndef HAVE_GETPWENT_R |
| MUTEX_LOCK(user_ps_path); |
| #endif |
| |
| @@ -90,7 +90,7 @@ get_user_ps_path(char **file) |
| #else |
| setpwent(); |
| while (1) { |
| -#if (defined (__linux) || defined (linux) || defined(__GLIBC__)) |
| +#ifdef HAVE_GETPWENT_R |
| rc = getpwent_r(&pw, buf, PASSWD_BUFSIZE, &pwp); |
| if (rc) { |
| LogDebugFn("USER PS: Error getting path to home directory: getpwent_r: %s", |
| @@ -99,7 +99,7 @@ get_user_ps_path(char **file) |
| return TSPERR(TSS_E_INTERNAL_ERROR); |
| } |
| |
| -#elif (defined (__FreeBSD__) || defined (__OpenBSD__)) |
| +#else |
| if ((pwp = getpwent()) == NULL) { |
| LogDebugFn("USER PS: Error getting path to home directory: getpwent: %s", |
| strerror(rc)); |
| -- |
| 2.1.4 |
| |