Blob Blame History Raw
#******************************************************************************
#  AUTHOR:
#    Chris Dunlap <cdunlap@llnl.gov>
#
#  SYNOPSIS:
#    X_AC_GETPWNAM
#
#  DESCRIPTION:
#    Check what forms of getpwnam() & getpwnam_r() are supported.
#******************************************************************************

AC_DEFUN([X_AC_GETPWNAM], [
  AC_CHECK_FUNCS(getpwnam)
  _X_AC_GETPWNAM_R_AIX
  _X_AC_GETPWNAM_R_POSIX
  _X_AC_GETPWNAM_R_SUN
])

AC_DEFUN([_X_AC_GETPWNAM_R_AIX], [
  AC_CACHE_CHECK(
    [for getpwnam_r (AIX)],
    [x_ac_cv_have_getpwnam_r_aix], [
    AC_LINK_IFELSE([
      AC_LANG_PROGRAM([[
#undef _ALL_SOURCE                      /* for overriding POSIX getpwnam_r */
#define _THREAD_SAFE 1
#define _UNIX95 1
#define _XOPEN_SOURCE_EXTENDED 1
#include <pwd.h>
]],
[[
int rv;
char *user;
struct passwd pw;
char pw_buf [1024];
rv = getpwnam_r (user, &pw, pw_buf, sizeof (pw_buf)); ]]
      )],
      AS_VAR_SET(x_ac_cv_have_getpwnam_r_aix, yes),
      AS_VAR_SET(x_ac_cv_have_getpwnam_r_aix, no)
    )]
  )
  AS_IF([test AS_VAR_GET(x_ac_cv_have_getpwnam_r_aix) = yes],
    AC_DEFINE([HAVE_GETPWNAM_R_AIX], [1],
      [Define to 1 if you have the `getpwnam_r' function from AIX.]
    )
  )]
)

AC_DEFUN([_X_AC_GETPWNAM_R_POSIX], [
  AC_CACHE_CHECK(
    [for getpwnam_r (POSIX)],
    [x_ac_cv_have_getpwnam_r_posix], [
    AC_LINK_IFELSE([
      AC_LANG_PROGRAM([[
#define _POSIX_PTHREAD_SEMANTICS 1      /* for SunOS */
#include <pwd.h>
]],
[[
int rv;
char *user;
struct passwd pw, *pw_ptr;
char pw_buf [1024];
rv = getpwnam_r (user, &pw, pw_buf, sizeof (pw_buf), &pw_ptr); ]]
      )],
      AC_RUN_IFELSE([
        AC_LANG_PROGRAM([[
#define _POSIX_PTHREAD_SEMANTICS 1      /* for SunOS */
#include <errno.h>
#include <pwd.h>
#include <stdlib.h>
]],
[[
int rv;
char *user = "root";
struct passwd pw, *pw_ptr;
char pw_buf;
rv = getpwnam_r (user, &pw, &pw_buf, sizeof (pw_buf), &pw_ptr);
return ((rv == ERANGE || errno == ERANGE) ? EXIT_SUCCESS : EXIT_FAILURE); ]]
        )],
        AS_VAR_SET(x_ac_cv_have_getpwnam_r_posix, yes),
        AS_VAR_SET(x_ac_cv_have_getpwnam_r_posix, broken),
        AS_VAR_SET(x_ac_cv_have_getpwnam_r_posix, yes)),
      AS_VAR_SET(x_ac_cv_have_getpwnam_r_posix, no)
    )]
  )
  AS_IF([test AS_VAR_GET(x_ac_cv_have_getpwnam_r_posix) = yes],
    AC_DEFINE([HAVE_GETPWNAM_R_POSIX], [1],
      [Define to 1 if you have the `getpwnam_r' function from POSIX.]
    )
  )]
)

AC_DEFUN([_X_AC_GETPWNAM_R_SUN], [
  AC_CACHE_CHECK(
    [for getpwnam_r (SunOS)],
    [x_ac_cv_have_getpwnam_r_sun], [
    AC_LINK_IFELSE([
      AC_LANG_PROGRAM([[
#undef _POSIX_PTHREAD_SEMANTICS         /* for overriding POSIX getpwnam_r */
#include <pwd.h>
]],
[[
char *user;
struct passwd pw, *pw_ptr;
char pw_buf [1024];
pw_ptr = getpwnam_r (user, &pw, pw_buf, sizeof (pw_buf)); ]]
      )],
      AS_VAR_SET(x_ac_cv_have_getpwnam_r_sun, yes),
      AS_VAR_SET(x_ac_cv_have_getpwnam_r_sun, no)
    )]
  )
  AS_IF([test AS_VAR_GET(x_ac_cv_have_getpwnam_r_sun) = yes],
    AC_DEFINE([HAVE_GETPWNAM_R_SUN], [1],
      [Define to 1 if you have the `getpwnam_r' function from SunOS.]
    )
  )]
)