Module Name: src Committed By: snj Date: Mon Sep 11 04:58:45 UTC 2017
Modified Files: src/crypto/external/bsd/heimdal/dist [netbsd-8]: configure.ac src/crypto/external/bsd/heimdal/dist/kcm [netbsd-8]: client.c config.c src/crypto/external/bsd/heimdal/dist/lib/gssapi/mech [netbsd-8]: gss_pname_to_uid.c src/crypto/external/bsd/heimdal/dist/lib/hx509 [netbsd-8]: softp11.c src/crypto/external/bsd/heimdal/dist/lib/krb5 [netbsd-8]: config_file.c get_default_principal.c kuserok.c src/crypto/external/bsd/heimdal/dist/lib/roken [netbsd-8]: getxxyyy.c roken.h.in src/crypto/external/bsd/heimdal/include [netbsd-8]: config.h roken.h Added Files: src/crypto/external/bsd/heimdal/dist/cf [netbsd-8]: check-getpwuid_r-posix.m4 Log Message: Pull up following revision(s) (requested by mlelstv in ticket #277): crypto/external/bsd/heimdal/include/config.h: revision 1.9 crypto/external/bsd/heimdal/dist/lib/gssapi/mech/gss_pname_to_uid.c: revision 1.3 crypto/external/bsd/heimdal/dist/lib/roken/getxxyyy.c: revision 1.3 crypto/external/bsd/heimdal/dist/configure.ac: revision 1.3 crypto/external/bsd/heimdal/dist/kcm/config.c: revision 1.3 crypto/external/bsd/heimdal/dist/lib/krb5/kuserok.c: revision 1.3 crypto/external/bsd/heimdal/dist/cf/check-getpwuid_r-posix.m4: revision 1.1 crypto/external/bsd/heimdal/include/roken.h: revision 1.8 crypto/external/bsd/heimdal/dist/lib/krb5/get_default_principal.c: revision 1.3 crypto/external/bsd/heimdal/dist/lib/hx509/softp11.c: revision 1.3 crypto/external/bsd/heimdal/dist/kcm/client.c: revision 1.3 crypto/external/bsd/heimdal/dist/lib/krb5/config_file.c: revision 1.3 crypto/external/bsd/heimdal/dist/lib/roken/roken.h.in: revision 1.5 always use rk_getpwnam_r... -- This is why we have libroken... -- Use getpwuid_r instead of getpwuid, so that we don't trash getpw*() internal buffers. kde does (kdm/client/backend.c): p = getpwnam(); pam_setcred() (which calls getpwuid in pam_afslog); setusercontext(...,p,p->pw_uid,...) (now with trashed p data...) To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.2.4.1 \ src/crypto/external/bsd/heimdal/dist/configure.ac cvs rdiff -u -r0 -r1.1.14.2 \ src/crypto/external/bsd/heimdal/dist/cf/check-getpwuid_r-posix.m4 cvs rdiff -u -r1.2 -r1.2.4.1 \ src/crypto/external/bsd/heimdal/dist/kcm/client.c \ src/crypto/external/bsd/heimdal/dist/kcm/config.c cvs rdiff -u -r1.2 -r1.2.4.1 \ src/crypto/external/bsd/heimdal/dist/lib/gssapi/mech/gss_pname_to_uid.c cvs rdiff -u -r1.2 -r1.2.4.1 \ src/crypto/external/bsd/heimdal/dist/lib/hx509/softp11.c cvs rdiff -u -r1.2 -r1.2.4.1 \ src/crypto/external/bsd/heimdal/dist/lib/krb5/config_file.c \ src/crypto/external/bsd/heimdal/dist/lib/krb5/get_default_principal.c \ src/crypto/external/bsd/heimdal/dist/lib/krb5/kuserok.c cvs rdiff -u -r1.2 -r1.2.8.1 \ src/crypto/external/bsd/heimdal/dist/lib/roken/getxxyyy.c cvs rdiff -u -r1.4 -r1.4.4.1 \ src/crypto/external/bsd/heimdal/dist/lib/roken/roken.h.in cvs rdiff -u -r1.8 -r1.8.4.1 src/crypto/external/bsd/heimdal/include/config.h cvs rdiff -u -r1.7 -r1.7.4.1 src/crypto/external/bsd/heimdal/include/roken.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/crypto/external/bsd/heimdal/dist/configure.ac diff -u src/crypto/external/bsd/heimdal/dist/configure.ac:1.2 src/crypto/external/bsd/heimdal/dist/configure.ac:1.2.4.1 --- src/crypto/external/bsd/heimdal/dist/configure.ac:1.2 Sat Jan 28 21:31:43 2017 +++ src/crypto/external/bsd/heimdal/dist/configure.ac Mon Sep 11 04:58:44 2017 @@ -1,5 +1,5 @@ dnl Process this file with autoconf to produce a configure script. -AC_REVISION($Revision: 1.2 $) +AC_REVISION($Revision: 1.2.4.1 $) AC_PREREQ(2.62) test -z "$CFLAGS" && CFLAGS="-g" AC_INIT([Heimdal],[7.99.1],[https://github.com/heimdal/heimdal/issues]) @@ -514,6 +514,7 @@ KRB_CAPABILITIES rk_DLADDR AC_CHECK_GETPWNAM_R_POSIX +AC_CHECK_GETPWUID_R_POSIX dnl detect doors on solaris if test "$enable_pthread_support" != no; then Index: src/crypto/external/bsd/heimdal/dist/kcm/client.c diff -u src/crypto/external/bsd/heimdal/dist/kcm/client.c:1.2 src/crypto/external/bsd/heimdal/dist/kcm/client.c:1.2.4.1 --- src/crypto/external/bsd/heimdal/dist/kcm/client.c:1.2 Sat Jan 28 21:31:44 2017 +++ src/crypto/external/bsd/heimdal/dist/kcm/client.c Mon Sep 11 04:58:44 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: client.c,v 1.2 2017/01/28 21:31:44 christos Exp $ */ +/* $NetBSD: client.c,v 1.2.4.1 2017/09/11 04:58:44 snj Exp $ */ /* * Copyright (c) 2005, PADL Software Pty Ltd. @@ -174,8 +174,10 @@ kcm_ccache_new_client(krb5_context conte if (matches == 0) matches = sscanf(name,"%ld",&uid); if (matches == 1) { - struct passwd *pwd = getpwuid(uid); - if (pwd != NULL) { + struct passwd pw, *pwd = NULL; + char pwbuf[2048]; + + if (rk_getpwuid_r(getuid(), &pw, pwbuf, sizeof(pwbuf), &pwd) == 0) { gid_t gid = pwd->pw_gid; kcm_chown(context, client, ccache, uid, gid); } Index: src/crypto/external/bsd/heimdal/dist/kcm/config.c diff -u src/crypto/external/bsd/heimdal/dist/kcm/config.c:1.2 src/crypto/external/bsd/heimdal/dist/kcm/config.c:1.2.4.1 --- src/crypto/external/bsd/heimdal/dist/kcm/config.c:1.2 Sat Jan 28 21:31:44 2017 +++ src/crypto/external/bsd/heimdal/dist/kcm/config.c Mon Sep 11 04:58:44 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: config.c,v 1.2 2017/01/28 21:31:44 christos Exp $ */ +/* $NetBSD: config.c,v 1.2.4.1 2017/09/11 04:58:44 snj Exp $ */ /* * Copyright (c) 2005, PADL Software Pty Ltd. @@ -159,28 +159,33 @@ static int parse_owners(kcm_ccache ccach { uid_t uid = 0; gid_t gid = 0; - struct passwd *pw; struct group *gr; int uid_p = 0; int gid_p = 0; + struct passwd pw, *pwd = NULL; + char pwbuf[2048]; if (system_user != NULL) { if (isdigit((unsigned char)system_user[0])) { - pw = getpwuid(atoi(system_user)); + if (rk_getpwuid_r(atoi(system_user), &pw, pwbuf, sizeof(pwbuf), + &pwd) != 0) + pwd = NULL; } else { - pw = getpwnam(system_user); + if (rk_getpwnam_r(system_user, &pw, pwbuf, sizeof(pwbuf), + &pwd) != 0) + pwd = NULL; } - if (pw == NULL) { + if (pwd == NULL) { return errno; } - system_user = strdup(pw->pw_name); + system_user = strdup(pwd->pw_name); if (system_user == NULL) { return ENOMEM; } - uid = pw->pw_uid; uid_p = 1; - gid = pw->pw_gid; gid_p = 1; + uid = pwd->pw_uid; uid_p = 1; + gid = pwd->pw_gid; gid_p = 1; } if (system_group != NULL) { Index: src/crypto/external/bsd/heimdal/dist/lib/gssapi/mech/gss_pname_to_uid.c diff -u src/crypto/external/bsd/heimdal/dist/lib/gssapi/mech/gss_pname_to_uid.c:1.2 src/crypto/external/bsd/heimdal/dist/lib/gssapi/mech/gss_pname_to_uid.c:1.2.4.1 --- src/crypto/external/bsd/heimdal/dist/lib/gssapi/mech/gss_pname_to_uid.c:1.2 Sat Jan 28 21:31:46 2017 +++ src/crypto/external/bsd/heimdal/dist/lib/gssapi/mech/gss_pname_to_uid.c Mon Sep 11 04:58:44 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: gss_pname_to_uid.c,v 1.2 2017/01/28 21:31:46 christos Exp $ */ +/* $NetBSD: gss_pname_to_uid.c,v 1.2.4.1 2017/09/11 04:58:44 snj Exp $ */ /* * Copyright (c) 2011, PADL Software Pty Ltd. @@ -150,12 +150,8 @@ gss_pname_to_uid(OM_uint32 *minor_status OM_uint32 major, tmpMinor; gss_buffer_desc localname = GSS_C_EMPTY_BUFFER; char *szLocalname; -#ifdef POSIX_GETPWNAM_R char pwbuf[2048]; struct passwd pw, *pwd; -#else - struct passwd *pwd; -#endif major = gss_localname(minor_status, pname, mech_type, &localname); if (GSS_ERROR(major)) @@ -171,12 +167,8 @@ gss_pname_to_uid(OM_uint32 *minor_status memcpy(szLocalname, localname.value, localname.length); szLocalname[localname.length] = '\0'; -#ifdef POSIX_GETPWNAM_R - if (getpwnam_r(szLocalname, &pw, pwbuf, sizeof(pwbuf), &pwd) != 0) + if (rk_getpwnam_r(szLocalname, &pw, pwbuf, sizeof(pwbuf), &pwd) != 0) pwd = NULL; -#else - pwd = getpwnam(szLocalname); -#endif gss_release_buffer(&tmpMinor, &localname); free(szLocalname); Index: src/crypto/external/bsd/heimdal/dist/lib/hx509/softp11.c diff -u src/crypto/external/bsd/heimdal/dist/lib/hx509/softp11.c:1.2 src/crypto/external/bsd/heimdal/dist/lib/hx509/softp11.c:1.2.4.1 --- src/crypto/external/bsd/heimdal/dist/lib/hx509/softp11.c:1.2 Sat Jan 28 21:31:48 2017 +++ src/crypto/external/bsd/heimdal/dist/lib/hx509/softp11.c Mon Sep 11 04:58:44 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: softp11.c,v 1.2 2017/01/28 21:31:48 christos Exp $ */ +/* $NetBSD: softp11.c,v 1.2.4.1 2017/09/11 04:58:44 snj Exp $ */ /* * Copyright (c) 2004 - 2008 Kungliga Tekniska Högskolan @@ -833,9 +833,11 @@ get_config_file_for_user(void) home = getenv("HOME"); } if (fn == NULL && home == NULL) { - struct passwd *pw = getpwuid(getuid()); - if(pw != NULL) - home = pw->pw_dir; + struct passwd pw, *pwd = NULL; + char pwbuf[2048]; + + if (rk_getpwuid_r(getuid(), &pw, pwbuf, sizeof(pwbuf), &pwd) == 0) + home = pwd->pw_dir; } if (fn == NULL) { if (home) { Index: src/crypto/external/bsd/heimdal/dist/lib/krb5/config_file.c diff -u src/crypto/external/bsd/heimdal/dist/lib/krb5/config_file.c:1.2 src/crypto/external/bsd/heimdal/dist/lib/krb5/config_file.c:1.2.4.1 --- src/crypto/external/bsd/heimdal/dist/lib/krb5/config_file.c:1.2 Sat Jan 28 21:31:49 2017 +++ src/crypto/external/bsd/heimdal/dist/lib/krb5/config_file.c Mon Sep 11 04:58:44 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: config_file.c,v 1.2 2017/01/28 21:31:49 christos Exp $ */ +/* $NetBSD: config_file.c,v 1.2.4.1 2017/09/11 04:58:44 snj Exp $ */ /* * Copyright (c) 1997 - 2004 Kungliga Tekniska Högskolan @@ -441,9 +441,11 @@ krb5_config_parse_file_multi (krb5_conte home = getenv("HOME"); if (home == NULL) { - struct passwd *pw = getpwuid(getuid()); - if(pw != NULL) - home = pw->pw_dir; + struct passwd pw, *pwd = NULL; + char pwbuf[2048]; + + if (rk_getpwuid_r(getuid(), &pw, pwbuf, sizeof(pwbuf), &pwd) == 0) + home = pwd->pw_dir; } if (home) { int aret; Index: src/crypto/external/bsd/heimdal/dist/lib/krb5/get_default_principal.c diff -u src/crypto/external/bsd/heimdal/dist/lib/krb5/get_default_principal.c:1.2 src/crypto/external/bsd/heimdal/dist/lib/krb5/get_default_principal.c:1.2.4.1 --- src/crypto/external/bsd/heimdal/dist/lib/krb5/get_default_principal.c:1.2 Sat Jan 28 21:31:49 2017 +++ src/crypto/external/bsd/heimdal/dist/lib/krb5/get_default_principal.c Mon Sep 11 04:58:44 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: get_default_principal.c,v 1.2 2017/01/28 21:31:49 christos Exp $ */ +/* $NetBSD: get_default_principal.c,v 1.2.4.1 2017/09/11 04:58:44 snj Exp $ */ /* * Copyright (c) 1997 - 2001 Kungliga Tekniska Högskolan @@ -78,9 +78,11 @@ _krb5_get_default_principal_local (krb5_ else ret = krb5_make_principal(context, princ, NULL, "root", NULL); } else { - struct passwd *pw = getpwuid(uid); - if(pw != NULL) - user = pw->pw_name; + struct passwd pw, *pwd = NULL; + char pwbuf[2048]; + + if (rk_getpwuid_r(uid, &pw, pwbuf, sizeof(pwbuf), &pwd) == 0) + user = pwd->pw_name; else { user = get_env_user(); if(user == NULL) Index: src/crypto/external/bsd/heimdal/dist/lib/krb5/kuserok.c diff -u src/crypto/external/bsd/heimdal/dist/lib/krb5/kuserok.c:1.2 src/crypto/external/bsd/heimdal/dist/lib/krb5/kuserok.c:1.2.4.1 --- src/crypto/external/bsd/heimdal/dist/lib/krb5/kuserok.c:1.2 Sat Jan 28 21:31:49 2017 +++ src/crypto/external/bsd/heimdal/dist/lib/krb5/kuserok.c Mon Sep 11 04:58:44 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: kuserok.c,v 1.2 2017/01/28 21:31:49 christos Exp $ */ +/* $NetBSD: kuserok.c,v 1.2.4.1 2017/09/11 04:58:44 snj Exp $ */ /* * Copyright (c) 1997 - 2005 Kungliga Tekniska Högskolan @@ -625,7 +625,7 @@ kuserok_user_k5login_plug_f(void *plug_c if (!_krb5_homedir_access(context)) return KRB5_PLUGIN_NO_HANDLE; - if (getpwnam_r(luser, &pw, pwbuf, sizeof(pwbuf), &pwd) != 0) { + if (rk_getpwnam_r(luser, &pw, pwbuf, sizeof(pwbuf), &pwd) != 0) { krb5_set_error_message(context, errno, "User unknown (getpwnam_r())"); return KRB5_PLUGIN_NO_HANDLE; } Index: src/crypto/external/bsd/heimdal/dist/lib/roken/getxxyyy.c diff -u src/crypto/external/bsd/heimdal/dist/lib/roken/getxxyyy.c:1.2 src/crypto/external/bsd/heimdal/dist/lib/roken/getxxyyy.c:1.2.8.1 --- src/crypto/external/bsd/heimdal/dist/lib/roken/getxxyyy.c:1.2 Sat Jan 28 21:31:50 2017 +++ src/crypto/external/bsd/heimdal/dist/lib/roken/getxxyyy.c Mon Sep 11 04:58:44 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: getxxyyy.c,v 1.2 2017/01/28 21:31:50 christos Exp $ */ +/* $NetBSD: getxxyyy.c,v 1.2.8.1 2017/09/11 04:58:44 snj Exp $ */ /* * Copyright (c) 2011 Kungliga Tekniska Högskolan @@ -39,30 +39,18 @@ #ifdef TEST_GETXXYYY #undef rk_getpwnam_r +#undef rk_getpwuid_r ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_getpwnam_r(const char *, struct passwd *, char *, size_t, struct passwd **); +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +rk_getpwuid_r(uid_t, struct passwd *, char *, size_t, struct passwd **); #endif -#if !defined(POSIX_GETPWNAM_R) || defined(TEST_GETXXYYY) - -/* - * At least limit the race between threads - */ - -ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL -rk_getpwnam_r(const char *name, struct passwd *pwd, char *buffer, - size_t bufsize, struct passwd **result) +#if !defined(POSIX_GETPWUID_R) || !defined(POSIX_GETPWNAM_R) || defined(TEST_GETXXYYY) +static void +copypw(struct passwd *pwd, char *buffer, size_t bufsize, const struct passwd *p) { - struct passwd *p; - size_t slen, n = 0; - - *result = NULL; - - p = getpwnam(name); - if(p == NULL) - return (errno = ENOENT); - memset(pwd, 0, sizeof(*pwd)); #define APPEND(el) \ @@ -83,6 +71,53 @@ do { \ APPEND(pw_gecos); APPEND(pw_dir); APPEND(pw_shell); +} + +#if !defined(POSIX_GETPWUID_R) || defined(TEST_GETXXYYY) +/* + * At least limit the race between threads + */ + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +rk_getpwnam_r(const char *name, struct passwd *pwd, char *buffer, + size_t bufsize, struct passwd **result) +{ + struct passwd *p; + size_t slen, n = 0; + + *result = NULL; + + p = getpwnam(name); + if(p == NULL) + return (errno = ENOENT); + + copypw(pwd, buffer, bufsize, p); + + *result = pwd; + + return 0; +} + +#if !defined(POSIX_GETPWNAM_R) || defined(TEST_GETXXYYY) + +/* + * At least limit the race between threads + */ + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +rk_getpwnam_r(const char *name, struct passwd *pwd, char *buffer, + size_t bufsize, struct passwd **result) +{ + struct passwd *p; + size_t slen, n = 0; + + *result = NULL; + + p = getpwnam(name); + if(p == NULL) + return (errno = ENOENT); + + copypw(pwd, buffer, bufsize, p); *result = pwd; @@ -133,6 +168,18 @@ main(int argc, char **argv) if (ret == 0) errx(1, "rk_getpwnam_r no user"); + ret = rk_getpwuid_r(0, &pwd, buf, sizeof(buf), &result); + if (ret) + errx(1, "rk_getpwuid_r"); + print_result(result); + + ret = rk_getpwuid_r(0, &pwd, buf, 1, &result); + if (ret == 0) + errx(1, "rk_getpwuid_r too small buf"); + + ret = rk_getpwuid_r(-1234, &pwd, buf, sizeof(buf), &result); + if (ret == 0) + errx(1, "rk_getpwuid_r no user"); return 0; } Index: src/crypto/external/bsd/heimdal/dist/lib/roken/roken.h.in diff -u src/crypto/external/bsd/heimdal/dist/lib/roken/roken.h.in:1.4 src/crypto/external/bsd/heimdal/dist/lib/roken/roken.h.in:1.4.4.1 --- src/crypto/external/bsd/heimdal/dist/lib/roken/roken.h.in:1.4 Sat Jan 28 21:31:50 2017 +++ src/crypto/external/bsd/heimdal/dist/lib/roken/roken.h.in Mon Sep 11 04:58:44 2017 @@ -650,6 +650,13 @@ ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_getpwnam_r(const char *, struct passwd *, char *, size_t, struct passwd **); #endif +#ifdef POSIX_GETPWUID_R +#define rk_getpwuid_r(_u, _pw, _b, _sz, _pwd) getpwuid_r(_u, _pw, _b, _sz, _pwd) +#else +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +rk_getpwuid_r(uid_t, struct passwd *, char *, size_t, struct passwd **); +#endif + ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL get_default_username (void); #ifndef HAVE_SETEUID Index: src/crypto/external/bsd/heimdal/include/config.h diff -u src/crypto/external/bsd/heimdal/include/config.h:1.8 src/crypto/external/bsd/heimdal/include/config.h:1.8.4.1 --- src/crypto/external/bsd/heimdal/include/config.h:1.8 Sun Jan 29 01:46:16 2017 +++ src/crypto/external/bsd/heimdal/include/config.h Mon Sep 11 04:58:44 2017 @@ -471,6 +471,9 @@ static /**/const char *const rcsid[] = { /* Define to 1 if you have the `getpwnam_r' function. */ #define HAVE_GETPWNAM_R 1 +/* Define to 1 if you have the `getpwuid_r' function. */ +#define HAVE_GETPWUID_R 1 + /* Define to 1 if you have the `getrlimit' function. */ #define HAVE_GETRLIMIT 1 @@ -1470,6 +1473,9 @@ static /**/const char *const rcsid[] = { /* Define if getpwnam_r has POSIX flavour. */ #define POSIX_GETPWNAM_R 1 +/* Define if getpwuid_r has POSIX flavour. */ +#define POSIX_GETPWUID_R 1 + /* Define if you have the readline package. */ /* #undef READLINE */ Index: src/crypto/external/bsd/heimdal/include/roken.h diff -u src/crypto/external/bsd/heimdal/include/roken.h:1.7 src/crypto/external/bsd/heimdal/include/roken.h:1.7.4.1 --- src/crypto/external/bsd/heimdal/include/roken.h:1.7 Sun Jan 29 19:38:38 2017 +++ src/crypto/external/bsd/heimdal/include/roken.h Mon Sep 11 04:58:44 2017 @@ -159,6 +159,7 @@ ROKEN_LIB_FUNCTION struct passwd * ROKEN ROKEN_LIB_FUNCTION struct passwd * ROKEN_LIB_CALL k_getpwuid (uid_t); #define rk_getpwnam_r(_n, _pw, _b, _sz, _pwd) getpwnam_r(_n, _pw, _b, _sz, _pwd) +#define rk_getpwuid_r(_u, _pw, _b, _sz, _pwd) getpwuid_r(_u, _pw, _b, _sz, _pwd) ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL get_default_username (void); Added files: Index: src/crypto/external/bsd/heimdal/dist/cf/check-getpwuid_r-posix.m4 diff -u /dev/null src/crypto/external/bsd/heimdal/dist/cf/check-getpwuid_r-posix.m4:1.1.14.2 --- /dev/null Mon Sep 11 04:58:45 2017 +++ src/crypto/external/bsd/heimdal/dist/cf/check-getpwuid_r-posix.m4 Mon Sep 11 04:58:44 2017 @@ -0,0 +1,40 @@ +dnl Id +dnl +dnl check for getpwuid_r, and if it's posix or not + +AC_DEFUN([AC_CHECK_GETPWUID_R_POSIX],[ +AC_FIND_FUNC_NO_LIBS(getpwuid_r,c_r) +if test "$ac_cv_func_getpwuid_r" = yes; then + AC_CACHE_CHECK(if getpwuid_r is posix,ac_cv_func_getpwuid_r_posix, + ac_libs="$LIBS" + LIBS="$LIBS $LIB_getpwuid_r" + AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#define _POSIX_PTHREAD_SEMANTICS +#include <pwd.h> +int main(int argc, char **argv) +{ + struct passwd pw, *pwd; + return getpwuid_r(0, &pw, 0, 0, &pwd) < 0; +} +]])],[ac_cv_func_getpwuid_r_posix=yes],[ac_cv_func_getpwuid_r_posix=no],[:]) +LIBS="$ac_libs") + AC_CACHE_CHECK(if _POSIX_PTHREAD_SEMANTICS is needed,ac_cv_func_getpwuid_r_posix_def, + ac_libs="$LIBS" + LIBS="$LIBS $LIB_getpwuid_r" + AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include <pwd.h> +int main(int argc, char **argv) +{ + struct passwd pw, *pwd; + return getpwuid_r(0, &pw, 0, 0, &pwd) < 0; +} +]])],[ac_cv_func_getpwuid_r_posix_def=no],[ac_cv_func_getpwuid_r_posix_def=yes],[:]) +LIBS="$ac_libs") +if test "$ac_cv_func_getpwuid_r_posix" = yes; then + AC_DEFINE(POSIX_GETPWUID_R, 1, [Define if getpwuid_r has POSIX flavour.]) +fi +if test "$ac_cv_func_getpwuid_r_posix" = yes -a "$ac_cv_func_getpwuid_r_posix_def" = yes; then + AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Define to get POSIX getpwuid_r in some systems.]) +fi +fi +])