Use nss_search() to implement getgrouplist() where available. Tested
on Solaris and HP-UX. We need to include a compatibility header for HP-UX which uses the Solaris nsswitch implementation but doesn't ship nss_dbdefs.h.
This commit is contained in:
1
MANIFEST
1
MANIFEST
@@ -47,6 +47,7 @@ compat/mksigname.c
|
|||||||
compat/mksigname.h
|
compat/mksigname.h
|
||||||
compat/mktemp.c
|
compat/mktemp.c
|
||||||
compat/nanosleep.c
|
compat/nanosleep.c
|
||||||
|
compat/nss_dbdefs.h
|
||||||
compat/pw_dup.c
|
compat/pw_dup.c
|
||||||
compat/regress/fnmatch/fnm_test.c
|
compat/regress/fnmatch/fnm_test.c
|
||||||
compat/regress/fnmatch/fnm_test.in
|
compat/regress/fnmatch/fnm_test.in
|
||||||
|
@@ -33,6 +33,15 @@
|
|||||||
# include <strings.h>
|
# include <strings.h>
|
||||||
#endif /* HAVE_STRINGS_H */
|
#endif /* HAVE_STRINGS_H */
|
||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
|
#ifdef HAVE_NSS_SEARCH
|
||||||
|
# include <limits.h>
|
||||||
|
# include <nsswitch.h>
|
||||||
|
# ifdef HAVE_NSS_DBDEFS_H
|
||||||
|
# include <nss_dbdefs.h>
|
||||||
|
# else
|
||||||
|
# include "compat/nss_dbdefs.h"
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "missing.h"
|
#include "missing.h"
|
||||||
|
|
||||||
@@ -79,29 +88,167 @@ done:
|
|||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(HAVE__GETGROUPSBYMEMBER)
|
#elif defined(HAVE_NSS_SEARCH)
|
||||||
|
|
||||||
|
#ifndef GID_MAX
|
||||||
|
# define GID_MAX UID_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ALIGNBYTES
|
||||||
|
# define ALIGNBYTES (sizeof(long) - 1L)
|
||||||
|
#endif
|
||||||
|
#ifndef ALIGN
|
||||||
|
# define ALIGN(p) (((unsigned long)(p) + ALIGNBYTES) & ~ALIGNBYTES)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern void _nss_initf_group(nss_db_params_t *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BSD-compatible getgrouplist(3) using _getgroupsbymember(3)
|
* Convert a groups file string (instr) to a struct group (ent) using
|
||||||
|
* buf for storage.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
str2grp(const char *instr, int inlen, void *ent, char *buf, int buflen)
|
||||||
|
{
|
||||||
|
struct group *grp = ent;
|
||||||
|
char *cp, *ep, *fieldsep = buf;
|
||||||
|
char **gr_mem, **gr_end;
|
||||||
|
int yp = 0;
|
||||||
|
unsigned long gid;
|
||||||
|
|
||||||
|
/* Must at least have space to copy instr -> buf. */
|
||||||
|
if (inlen >= buflen)
|
||||||
|
return NSS_STR_PARSE_ERANGE;
|
||||||
|
|
||||||
|
/* Paranoia: buf and instr should be distinct. */
|
||||||
|
if (buf != instr) {
|
||||||
|
memmove(buf, instr, inlen);
|
||||||
|
buf[inlen] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((fieldsep = strchr(cp = fieldsep, ':')) == NULL)
|
||||||
|
return NSS_STR_PARSE_PARSE;
|
||||||
|
*fieldsep++ = '\0';
|
||||||
|
grp->gr_name = cp;
|
||||||
|
|
||||||
|
/* Check for YP inclusion/exclusion entries. */
|
||||||
|
if (*cp == '+' || *cp == '-') {
|
||||||
|
/* Only the name is required for YP inclusion/exclusion entries. */
|
||||||
|
grp->gr_passwd = "";
|
||||||
|
grp->gr_gid = 0;
|
||||||
|
grp->gr_mem = NULL;
|
||||||
|
yp = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((fieldsep = strchr(cp = fieldsep, ':')) == NULL)
|
||||||
|
return yp ? NSS_STR_PARSE_SUCCESS : NSS_STR_PARSE_PARSE;
|
||||||
|
*fieldsep++ = '\0';
|
||||||
|
grp->gr_passwd = cp;
|
||||||
|
|
||||||
|
if ((fieldsep = strchr(cp = fieldsep, ':')) == NULL)
|
||||||
|
return yp ? NSS_STR_PARSE_SUCCESS : NSS_STR_PARSE_PARSE;
|
||||||
|
*fieldsep++ = '\0';
|
||||||
|
gid = strtoul(cp, &ep, 10);
|
||||||
|
if (*cp == '\0' || *ep != '\0')
|
||||||
|
return yp ? NSS_STR_PARSE_SUCCESS : NSS_STR_PARSE_PARSE;
|
||||||
|
if (gid > GID_MAX || (gid == ULONG_MAX && errno == ERANGE))
|
||||||
|
return NSS_STR_PARSE_ERANGE;
|
||||||
|
grp->gr_gid = (gid_t)gid;
|
||||||
|
|
||||||
|
/* Store group members, taking care to use proper alignment. */
|
||||||
|
grp->gr_mem = NULL;
|
||||||
|
if (*fieldsep != '\0') {
|
||||||
|
grp->gr_mem = gr_mem = (char **)ALIGN(buf + inlen + 1);
|
||||||
|
gr_end = (char **)((unsigned long)(buf + buflen) & ~ALIGNBYTES);
|
||||||
|
for (;;) {
|
||||||
|
if (gr_mem == gr_end)
|
||||||
|
return NSS_STR_PARSE_ERANGE; /* out of space! */
|
||||||
|
*gr_mem++ = cp;
|
||||||
|
if (fieldsep == NULL)
|
||||||
|
break;
|
||||||
|
if ((fieldsep = strchr(cp = fieldsep, ',')) != NULL)
|
||||||
|
*fieldsep++ = '\0';
|
||||||
|
}
|
||||||
|
*gr_mem = NULL;
|
||||||
|
}
|
||||||
|
return NSS_STR_PARSE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static nss_status_t
|
||||||
|
process_cstr(const char *instr, int inlen, struct nss_groupsbymem *gbm)
|
||||||
|
{
|
||||||
|
const char *user = gbm->username;
|
||||||
|
nss_status_t rval = NSS_NOTFOUND;
|
||||||
|
nss_XbyY_buf_t *buf;
|
||||||
|
struct group *grp;
|
||||||
|
char **gr_mem;
|
||||||
|
int error, i;
|
||||||
|
|
||||||
|
buf = _nss_XbyY_buf_alloc(sizeof(struct group), NSS_BUFLEN_GROUP);
|
||||||
|
if (buf == NULL)
|
||||||
|
return NSS_UNAVAIL;
|
||||||
|
|
||||||
|
/* Parse groups file string -> struct group. */
|
||||||
|
grp = buf->result;
|
||||||
|
error = (*gbm->str2ent)(instr, inlen, grp, buf->buffer, buf->buflen);
|
||||||
|
if (error || grp->gr_mem == NULL)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
for (gr_mem = grp->gr_mem; *gr_mem != NULL; gr_mem++) {
|
||||||
|
if (strcmp(*gr_mem, user) == 0) {
|
||||||
|
/* Append to gid_array unless gr_gid is a dupe. */
|
||||||
|
for (i = 0; i < gbm->numgids; i++) {
|
||||||
|
if (gbm->gid_array[i] == grp->gr_gid)
|
||||||
|
goto done; /* already present */
|
||||||
|
}
|
||||||
|
/* Store gid if there is space. */
|
||||||
|
if (i < gbm->maxgids)
|
||||||
|
gbm->gid_array[i] = grp->gr_gid;
|
||||||
|
/* Always increment numgids so we can detect when out of space. */
|
||||||
|
gbm->numgids++;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
_nss_XbyY_buf_free(buf);
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BSD-compatible getgrouplist(3) using nss_search(3)
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
getgrouplist(const char *name, gid_t basegid, gid_t *groups, int *ngroupsp)
|
getgrouplist(const char *name, gid_t basegid, gid_t *groups, int *ngroupsp)
|
||||||
{
|
{
|
||||||
int ngroups, grpsize = *ngroupsp;
|
struct nss_groupsbymem gbm;
|
||||||
int rval = -1;
|
static DEFINE_NSS_DB_ROOT(db_root);
|
||||||
|
|
||||||
if (grpsize > 0) {
|
|
||||||
/* We support BSD semantics where the first element is the base gid */
|
/* We support BSD semantics where the first element is the base gid */
|
||||||
|
if (*ngroupsp <= 0)
|
||||||
|
return -1;
|
||||||
groups[0] = basegid;
|
groups[0] = basegid;
|
||||||
|
|
||||||
/* The last arg is 1 because we already filled in the base gid. */
|
memset(&gbm, 0, sizeof(gbm));
|
||||||
ngroups = _getgroupsbymember(name, groups, grpsize, 1);
|
gbm.username = name;
|
||||||
if (ngroups != -1) {
|
gbm.gid_array = groups;
|
||||||
rval = 0;
|
gbm.maxgids = *ngroupsp;
|
||||||
*ngroupsp = ngroups;
|
gbm.numgids = 1; /* for basegid */
|
||||||
|
gbm.force_slow_way = 1;
|
||||||
|
gbm.str2ent = str2grp;
|
||||||
|
gbm.process_cstr = process_cstr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Can't use nss_search return value since it may return NSS_UNAVAIL
|
||||||
|
* when no nsswitch.conf entry (e.g. compat mode).
|
||||||
|
*/
|
||||||
|
(void)nss_search(&db_root, _nss_initf_group, NSS_DBOP_GROUP_BYMEMBER, &gbm);
|
||||||
|
|
||||||
|
if (gbm.numgids <= gbm.maxgids) {
|
||||||
|
*ngroupsp = gbm.numgids;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
*ngroupsp = gbm.maxgids;
|
||||||
return rval;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* !HAVE_GETGRSET && !HAVE__GETGROUPSBYMEMBER */
|
#else /* !HAVE_GETGRSET && !HAVE__GETGROUPSBYMEMBER */
|
||||||
|
106
compat/nss_dbdefs.h
Normal file
106
compat/nss_dbdefs.h
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _COMPAT_NSS_DBDEFS_H
|
||||||
|
#define _COMPAT_NSS_DBDEFS_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Bits of nss_dbdefs.h and nss_common.h needed to implement
|
||||||
|
* getgrouplist(3) using nss_search(3).
|
||||||
|
*
|
||||||
|
* HP-UX does not ship those headers so we need this compatibility header.
|
||||||
|
* It may also work on other systems that use a Solaris-derived nsswitch
|
||||||
|
* API.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef NEED_HPUX_MUTEX
|
||||||
|
# include <synch.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
NSS_SUCCESS,
|
||||||
|
NSS_NOTFOUND,
|
||||||
|
NSS_UNAVAIL
|
||||||
|
} nss_status_t;
|
||||||
|
|
||||||
|
typedef struct nss_db_params {
|
||||||
|
const char *name;
|
||||||
|
const char *config_name;
|
||||||
|
const char *default_config;
|
||||||
|
unsigned int max_active_per_src;
|
||||||
|
unsigned int max_dormant_per_src;
|
||||||
|
int flags;
|
||||||
|
void *finders;
|
||||||
|
void *private;
|
||||||
|
void (*cleanup)(struct nss_db_params *);
|
||||||
|
} nss_db_params_t;
|
||||||
|
|
||||||
|
struct nss_groupsbymem {
|
||||||
|
const char *username;
|
||||||
|
gid_t *gid_array;
|
||||||
|
int maxgids;
|
||||||
|
int force_slow_way;
|
||||||
|
int (*str2ent)(const char *, int, void *, char *, int);
|
||||||
|
nss_status_t (*process_cstr)(const char *, int, struct nss_groupsbymem *);
|
||||||
|
int numgids;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
void *result; /* group struct to fill in. */
|
||||||
|
char *buffer; /* string buffer for above */
|
||||||
|
size_t buflen; /* string buffer size */
|
||||||
|
} nss_XbyY_buf_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
void *state; /* really struct nss_db_state * */
|
||||||
|
#ifdef NEED_HPUX_MUTEX
|
||||||
|
lwp_mutex_t lock;
|
||||||
|
#endif
|
||||||
|
} nss_db_root_t;
|
||||||
|
|
||||||
|
#ifdef NEED_HPUX_MUTEX
|
||||||
|
# define NSS_DB_ROOT_INIT { 0, LWP_MUTEX_INITIALIZER }
|
||||||
|
#else
|
||||||
|
# define NSS_DB_ROOT_INIT { 0 }
|
||||||
|
#endif
|
||||||
|
# define DEFINE_NSS_DB_ROOT(name) nss_db_root_t name = NSS_DB_ROOT_INIT
|
||||||
|
|
||||||
|
/* Backend function to find all groups a user belongs to for initgroups(). */
|
||||||
|
#define NSS_DBOP_GROUP_BYMEMBER 6
|
||||||
|
|
||||||
|
/* str2ent function return values */
|
||||||
|
#define NSS_STR_PARSE_SUCCESS 0
|
||||||
|
#define NSS_STR_PARSE_PARSE 1
|
||||||
|
#define NSS_STR_PARSE_ERANGE 2
|
||||||
|
|
||||||
|
/* Max length for an /etc/group file line. */
|
||||||
|
#define NSS_BUFLEN_GROUP 8192
|
||||||
|
|
||||||
|
/* HP-UX uses an extra underscore for these functions. */
|
||||||
|
#ifdef HAVE___NSS_INITF_GROUP
|
||||||
|
# define _nss_initf_group __nss_initf_group
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE__NSS_XBYY_BUF_ALLOC
|
||||||
|
# define _nss_XbyY_buf_alloc __nss_XbyY_buf_alloc
|
||||||
|
# define _nss_XbyY_buf_free __nss_XbyY_buf_free
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef void (*nss_db_initf_t)(nss_db_params_t *);
|
||||||
|
extern nss_status_t nss_search(nss_db_root_t *, nss_db_initf_t, int, void *);
|
||||||
|
extern nss_XbyY_buf_t *_nss_XbyY_buf_alloc(int, int);
|
||||||
|
extern void _nss_XbyY_buf_free(nss_XbyY_buf_t *);
|
||||||
|
|
||||||
|
#endif /* _COMPAT_NSS_DBDEFS_H */
|
21
config.h.in
21
config.h.in
@@ -391,6 +391,12 @@
|
|||||||
/* Define to 1 if you have the `nl_langinfo' function. */
|
/* Define to 1 if you have the `nl_langinfo' function. */
|
||||||
#undef HAVE_NL_LANGINFO
|
#undef HAVE_NL_LANGINFO
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <nss_dbdefs.h> header file. */
|
||||||
|
#undef HAVE_NSS_DBDEFS_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `nss_search' function. */
|
||||||
|
#undef HAVE_NSS_SEARCH
|
||||||
|
|
||||||
/* Define to 1 if you have the `openpty' function. */
|
/* Define to 1 if you have the `openpty' function. */
|
||||||
#undef HAVE_OPENPTY
|
#undef HAVE_OPENPTY
|
||||||
|
|
||||||
@@ -697,21 +703,30 @@
|
|||||||
/* Define to 1 if the system has the type `_Bool'. */
|
/* Define to 1 if the system has the type `_Bool'. */
|
||||||
#undef HAVE__BOOL
|
#undef HAVE__BOOL
|
||||||
|
|
||||||
/* Define to 1 if you have the `_getgroupsbymember' function. */
|
|
||||||
#undef HAVE__GETGROUPSBYMEMBER
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `_getpty' function. */
|
/* Define to 1 if you have the `_getpty' function. */
|
||||||
#undef HAVE__GETPTY
|
#undef HAVE__GETPTY
|
||||||
|
|
||||||
/* Define to 1 if you have the `_innetgr' function. */
|
/* Define to 1 if you have the `_innetgr' function. */
|
||||||
#undef HAVE__INNETGR
|
#undef HAVE__INNETGR
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `_nss_initf_group' function. */
|
||||||
|
#undef HAVE__NSS_INITF_GROUP
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `_nss_XbyY_buf_alloc' function. */
|
||||||
|
#undef HAVE__NSS_XBYY_BUF_ALLOC
|
||||||
|
|
||||||
/* Define to 1 if you have the `_ttyname_dev' function. */
|
/* Define to 1 if you have the `_ttyname_dev' function. */
|
||||||
#undef HAVE__TTYNAME_DEV
|
#undef HAVE__TTYNAME_DEV
|
||||||
|
|
||||||
/* Define to 1 if the compiler supports the C99 __func__ variable. */
|
/* Define to 1 if the compiler supports the C99 __func__ variable. */
|
||||||
#undef HAVE___FUNC__
|
#undef HAVE___FUNC__
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `__nss_initf_group' function. */
|
||||||
|
#undef HAVE___NSS_INITF_GROUP
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `__nss_XbyY_buf_alloc' function. */
|
||||||
|
#undef HAVE___NSS_XBYY_BUF_ALLOC
|
||||||
|
|
||||||
/* Define to 1 if your crt0.o defines the __progname symbol for you. */
|
/* Define to 1 if your crt0.o defines the __progname symbol for you. */
|
||||||
#undef HAVE___PROGNAME
|
#undef HAVE___PROGNAME
|
||||||
|
|
||||||
|
142
configure
vendored
142
configure
vendored
@@ -13927,19 +13927,6 @@ case "$host" in
|
|||||||
OS_INIT=os_init_solaris
|
OS_INIT=os_init_solaris
|
||||||
SUDO_OBJS="${SUDO_OBJS} solaris.o"
|
SUDO_OBJS="${SUDO_OBJS} solaris.o"
|
||||||
|
|
||||||
# For implementing getgrouplist()
|
|
||||||
for ac_func in _getgroupsbymember
|
|
||||||
do :
|
|
||||||
ac_fn_c_check_func "$LINENO" "_getgroupsbymember" "ac_cv_func__getgroupsbymember"
|
|
||||||
if test "x$ac_cv_func__getgroupsbymember" = xyes; then :
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define HAVE__GETGROUPSBYMEMBER 1
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
# To get the crypt(3) prototype (so we pass -Wall)
|
# To get the crypt(3) prototype (so we pass -Wall)
|
||||||
OSDEFS="${OSDEFS} -D__EXTENSIONS__"
|
OSDEFS="${OSDEFS} -D__EXTENSIONS__"
|
||||||
# AFS support needs -lucb
|
# AFS support needs -lucb
|
||||||
@@ -14040,19 +14027,6 @@ fi
|
|||||||
with_netsvc="/etc/netsvc.conf"
|
with_netsvc="/etc/netsvc.conf"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# For implementing getgrouplist()
|
|
||||||
for ac_func in getgrset
|
|
||||||
do :
|
|
||||||
ac_fn_c_check_func "$LINENO" "getgrset" "ac_cv_func_getgrset"
|
|
||||||
if test "x$ac_cv_func_getgrset" = xyes; then :
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define HAVE_GETGRSET 1
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
# LDR_PRELOAD is only supported in AIX 5.3 and later
|
# LDR_PRELOAD is only supported in AIX 5.3 and later
|
||||||
if test $OSMAJOR -lt 5; then
|
if test $OSMAJOR -lt 5; then
|
||||||
with_noexec=no
|
with_noexec=no
|
||||||
@@ -16665,11 +16639,25 @@ _ACEOF
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
for ac_func in getgrouplist
|
||||||
|
do :
|
||||||
ac_fn_c_check_func "$LINENO" "getgrouplist" "ac_cv_func_getgrouplist"
|
ac_fn_c_check_func "$LINENO" "getgrouplist" "ac_cv_func_getgrouplist"
|
||||||
if test "x$ac_cv_func_getgrouplist" = xyes; then :
|
if test "x$ac_cv_func_getgrouplist" = xyes; then :
|
||||||
$as_echo "#define HAVE_GETGROUPLIST 1" >>confdefs.h
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define HAVE_GETGROUPLIST 1
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
|
case "$host" in
|
||||||
|
*-*-aix*)
|
||||||
|
for ac_func in getgrset
|
||||||
|
do :
|
||||||
|
ac_fn_c_check_func "$LINENO" "getgrset" "ac_cv_func_getgrset"
|
||||||
|
if test "x$ac_cv_func_getgrset" = xyes; then :
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define HAVE_GETGRSET 1
|
||||||
|
_ACEOF
|
||||||
case " $LIBOBJS " in
|
case " $LIBOBJS " in
|
||||||
*" getgrouplist.$ac_objext "* ) ;;
|
*" getgrouplist.$ac_objext "* ) ;;
|
||||||
*) LIBOBJS="$LIBOBJS getgrouplist.$ac_objext"
|
*) LIBOBJS="$LIBOBJS getgrouplist.$ac_objext"
|
||||||
@@ -16677,7 +16665,98 @@ else
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
ac_fn_c_check_func "$LINENO" "nss_search" "ac_cv_func_nss_search"
|
||||||
|
if test "x$ac_cv_func_nss_search" = xyes; then :
|
||||||
|
|
||||||
|
ac_fn_c_check_func "$LINENO" "_nss_XbyY_buf_alloc" "ac_cv_func__nss_XbyY_buf_alloc"
|
||||||
|
if test "x$ac_cv_func__nss_XbyY_buf_alloc" = xyes; then :
|
||||||
|
|
||||||
|
# Solaris
|
||||||
|
ac_fn_c_check_func "$LINENO" "_nss_initf_group" "ac_cv_func__nss_initf_group"
|
||||||
|
if test "x$ac_cv_func__nss_initf_group" = xyes; then :
|
||||||
|
|
||||||
|
for ac_header in nss_dbdefs.h
|
||||||
|
do :
|
||||||
|
ac_fn_c_check_header_mongrel "$LINENO" "nss_dbdefs.h" "ac_cv_header_nss_dbdefs_h" "$ac_includes_default"
|
||||||
|
if test "x$ac_cv_header_nss_dbdefs_h" = xyes; then :
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define HAVE_NSS_DBDEFS_H 1
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
$as_echo "#define HAVE_NSS_SEARCH 1" >>confdefs.h
|
||||||
|
|
||||||
|
$as_echo "#define HAVE__NSS_XBYY_BUF_ALLOC 1" >>confdefs.h
|
||||||
|
|
||||||
|
$as_echo "#define HAVE__NSS_INITF_GROUP 1" >>confdefs.h
|
||||||
|
|
||||||
|
case " $LIBOBJS " in
|
||||||
|
*" getgrouplist.$ac_objext "* ) ;;
|
||||||
|
*) LIBOBJS="$LIBOBJS getgrouplist.$ac_objext"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
# HP-UX
|
||||||
|
ac_fn_c_check_func "$LINENO" "__nss_XbyY_buf_alloc" "ac_cv_func___nss_XbyY_buf_alloc"
|
||||||
|
if test "x$ac_cv_func___nss_XbyY_buf_alloc" = xyes; then :
|
||||||
|
|
||||||
|
ac_fn_c_check_func "$LINENO" "__nss_initf_group" "ac_cv_func___nss_initf_group"
|
||||||
|
if test "x$ac_cv_func___nss_initf_group" = xyes; then :
|
||||||
|
|
||||||
|
for ac_header in nss_dbdefs.h
|
||||||
|
do :
|
||||||
|
ac_fn_c_check_header_mongrel "$LINENO" "nss_dbdefs.h" "ac_cv_header_nss_dbdefs_h" "$ac_includes_default"
|
||||||
|
if test "x$ac_cv_header_nss_dbdefs_h" = xyes; then :
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define HAVE_NSS_DBDEFS_H 1
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
$as_echo "#define HAVE_NSS_SEARCH 1" >>confdefs.h
|
||||||
|
|
||||||
|
$as_echo "#define HAVE___NSS_XBYY_BUF_ALLOC 1" >>confdefs.h
|
||||||
|
|
||||||
|
$as_echo "#define HAVE___NSS_INITF_GROUP 1" >>confdefs.h
|
||||||
|
|
||||||
|
case " $LIBOBJS " in
|
||||||
|
*" getgrouplist.$ac_objext "* ) ;;
|
||||||
|
*) LIBOBJS="$LIBOBJS getgrouplist.$ac_objext"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
for ac_func in getline
|
for ac_func in getline
|
||||||
do :
|
do :
|
||||||
@@ -17117,12 +17196,11 @@ if test "x$ac_cv_func_setreuid" = xyes; then :
|
|||||||
cat >>confdefs.h <<_ACEOF
|
cat >>confdefs.h <<_ACEOF
|
||||||
#define HAVE_SETREUID 1
|
#define HAVE_SETREUID 1
|
||||||
_ACEOF
|
_ACEOF
|
||||||
SKIP_SETEUID=yes
|
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
fi
|
fi
|
||||||
if test -z "$SKIP_SETEUID"; then
|
|
||||||
for ac_func in seteuid
|
for ac_func in seteuid
|
||||||
do :
|
do :
|
||||||
ac_fn_c_check_func "$LINENO" "seteuid" "ac_cv_func_seteuid"
|
ac_fn_c_check_func "$LINENO" "seteuid" "ac_cv_func_seteuid"
|
||||||
@@ -17134,7 +17212,6 @@ _ACEOF
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
fi
|
|
||||||
if test X"$with_interfaces" != X"no"; then
|
if test X"$with_interfaces" != X"no"; then
|
||||||
for ac_func in getifaddrs
|
for ac_func in getifaddrs
|
||||||
do :
|
do :
|
||||||
@@ -23448,6 +23525,11 @@ fi
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
49
configure.in
49
configure.in
@@ -1573,9 +1573,6 @@ case "$host" in
|
|||||||
OS_INIT=os_init_solaris
|
OS_INIT=os_init_solaris
|
||||||
SUDO_OBJS="${SUDO_OBJS} solaris.o"
|
SUDO_OBJS="${SUDO_OBJS} solaris.o"
|
||||||
|
|
||||||
# For implementing getgrouplist()
|
|
||||||
AC_CHECK_FUNCS(_getgroupsbymember)
|
|
||||||
|
|
||||||
# To get the crypt(3) prototype (so we pass -Wall)
|
# To get the crypt(3) prototype (so we pass -Wall)
|
||||||
OSDEFS="${OSDEFS} -D__EXTENSIONS__"
|
OSDEFS="${OSDEFS} -D__EXTENSIONS__"
|
||||||
# AFS support needs -lucb
|
# AFS support needs -lucb
|
||||||
@@ -1632,9 +1629,6 @@ case "$host" in
|
|||||||
with_netsvc="/etc/netsvc.conf"
|
with_netsvc="/etc/netsvc.conf"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# For implementing getgrouplist()
|
|
||||||
AC_CHECK_FUNCS(getgrset)
|
|
||||||
|
|
||||||
# LDR_PRELOAD is only supported in AIX 5.3 and later
|
# LDR_PRELOAD is only supported in AIX 5.3 and later
|
||||||
if test $OSMAJOR -lt 5; then
|
if test $OSMAJOR -lt 5; then
|
||||||
with_noexec=no
|
with_noexec=no
|
||||||
@@ -2228,7 +2222,39 @@ AC_FUNC_GETGROUPS
|
|||||||
AC_CHECK_FUNCS(glob strrchr sysconf tzset strftime setenv \
|
AC_CHECK_FUNCS(glob strrchr sysconf tzset strftime setenv \
|
||||||
regcomp nl_langinfo mbr_check_membership \
|
regcomp nl_langinfo mbr_check_membership \
|
||||||
setrlimit64)
|
setrlimit64)
|
||||||
AC_REPLACE_FUNCS(getgrouplist)
|
dnl AC_REPLACE_FUNCS(getgrouplist)
|
||||||
|
AC_CHECK_FUNCS(getgrouplist, [], [
|
||||||
|
case "$host" in
|
||||||
|
*-*-aix*)
|
||||||
|
AC_CHECK_FUNCS(getgrset, [AC_LIBOBJ(getgrouplist)])
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
AC_CHECK_FUNC(nss_search, [
|
||||||
|
AC_CHECK_FUNC(_nss_XbyY_buf_alloc, [
|
||||||
|
# Solaris
|
||||||
|
AC_CHECK_FUNC(_nss_initf_group, [
|
||||||
|
AC_CHECK_HEADERS(nss_dbdefs.h)
|
||||||
|
AC_DEFINE([HAVE_NSS_SEARCH])
|
||||||
|
AC_DEFINE([HAVE__NSS_XBYY_BUF_ALLOC])
|
||||||
|
AC_DEFINE([HAVE__NSS_INITF_GROUP])
|
||||||
|
AC_LIBOBJ(getgrouplist)
|
||||||
|
])
|
||||||
|
], [
|
||||||
|
# HP-UX
|
||||||
|
AC_CHECK_FUNC(__nss_XbyY_buf_alloc, [
|
||||||
|
AC_CHECK_FUNC(__nss_initf_group, [
|
||||||
|
AC_CHECK_HEADERS(nss_dbdefs.h)
|
||||||
|
AC_DEFINE([HAVE_NSS_SEARCH])
|
||||||
|
AC_DEFINE([HAVE___NSS_XBYY_BUF_ALLOC])
|
||||||
|
AC_DEFINE([HAVE___NSS_INITF_GROUP])
|
||||||
|
AC_LIBOBJ(getgrouplist)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
AC_CHECK_FUNCS(getline, [], [
|
AC_CHECK_FUNCS(getline, [], [
|
||||||
AC_LIBOBJ(getline)
|
AC_LIBOBJ(getline)
|
||||||
AC_CHECK_FUNCS(fgetln)
|
AC_CHECK_FUNCS(fgetln)
|
||||||
@@ -2304,11 +2330,9 @@ if test -z "$SKIP_SETRESUID"; then
|
|||||||
])
|
])
|
||||||
fi
|
fi
|
||||||
if test -z "$SKIP_SETREUID"; then
|
if test -z "$SKIP_SETREUID"; then
|
||||||
AC_CHECK_FUNCS(setreuid, [SKIP_SETEUID=yes])
|
AC_CHECK_FUNCS(setreuid)
|
||||||
fi
|
fi
|
||||||
if test -z "$SKIP_SETEUID"; then
|
|
||||||
AC_CHECK_FUNCS(seteuid)
|
AC_CHECK_FUNCS(seteuid)
|
||||||
fi
|
|
||||||
if test X"$with_interfaces" != X"no"; then
|
if test X"$with_interfaces" != X"no"; then
|
||||||
AC_CHECK_FUNCS(getifaddrs, [AC_CHECK_FUNCS(freeifaddrs)])
|
AC_CHECK_FUNCS(getifaddrs, [AC_CHECK_FUNCS(freeifaddrs)])
|
||||||
fi
|
fi
|
||||||
@@ -3697,6 +3721,11 @@ AH_TEMPLATE(RTLD_PRELOAD_DELIM, [The delimiter to use when defining multiple pre
|
|||||||
AH_TEMPLATE(RTLD_PRELOAD_DEFAULT, [The default value of preloaded objects (if any).])
|
AH_TEMPLATE(RTLD_PRELOAD_DEFAULT, [The default value of preloaded objects (if any).])
|
||||||
AH_TEMPLATE(HAVE_DSO_VISIBILITY, [Define to 1 if the compiler supports the __visibility__ attribute.])
|
AH_TEMPLATE(HAVE_DSO_VISIBILITY, [Define to 1 if the compiler supports the __visibility__ attribute.])
|
||||||
AH_TEMPLATE(HAVE_SYS_SIGABBREV, [Define to 1 if your libc has the `sys_sigabbrev' symbol.])
|
AH_TEMPLATE(HAVE_SYS_SIGABBREV, [Define to 1 if your libc has the `sys_sigabbrev' symbol.])
|
||||||
|
AH_TEMPLATE(HAVE_NSS_SEARCH, [Define to 1 if you have the `nss_search' function.])
|
||||||
|
AH_TEMPLATE(HAVE__NSS_INITF_GROUP, [Define to 1 if you have the `_nss_initf_group' function.])
|
||||||
|
AH_TEMPLATE(HAVE___NSS_INITF_GROUP, [Define to 1 if you have the `__nss_initf_group' function.])
|
||||||
|
AH_TEMPLATE(HAVE__NSS_XBYY_BUF_ALLOC, [Define to 1 if you have the `_nss_XbyY_buf_alloc' function.])
|
||||||
|
AH_TEMPLATE(HAVE___NSS_XBYY_BUF_ALLOC, [Define to 1 if you have the `__nss_XbyY_buf_alloc' function.])
|
||||||
|
|
||||||
dnl
|
dnl
|
||||||
dnl Bits to copy verbatim into config.h.in
|
dnl Bits to copy verbatim into config.h.in
|
||||||
|
Reference in New Issue
Block a user