NetBSD doesn't know getgrnam_r()/getpwnam_r()

Signed-off-by: Lennart Poettering <lennart@poettering.net>
This commit is contained in:
Jared D. McNeill 2009-01-22 02:15:50 +01:00 committed by Lennart Poettering
parent 61075a78f7
commit c0e4e5a868
2 changed files with 41 additions and 11 deletions

View file

@ -367,8 +367,8 @@ AC_CHECK_FUNCS([lrintf strtof])
AC_FUNC_FORK AC_FUNC_FORK
AC_FUNC_GETGROUPS AC_FUNC_GETGROUPS
AC_FUNC_SELECT_ARGTYPES AC_FUNC_SELECT_ARGTYPES
AC_CHECK_FUNCS([chmod chown clock_gettime getaddrinfo getgrgid_r \ AC_CHECK_FUNCS([chmod chown clock_gettime getaddrinfo getgrgid_r getgrnam_r \
getpwuid_r gettimeofday getuid inet_ntop inet_pton mlock nanosleep \ getpwnam_r getpwuid_r gettimeofday getuid inet_ntop inet_pton mlock nanosleep \
pipe posix_fadvise posix_madvise posix_memalign setpgid setsid shm_open \ pipe posix_fadvise posix_madvise posix_memalign setpgid setsid shm_open \
sigaction sleep sysconf]) sigaction sleep sysconf])
AC_CHECK_FUNCS([mkfifo], [HAVE_MKFIFO=1], [HAVE_MKFIFO=0]) AC_CHECK_FUNCS([mkfifo], [HAVE_MKFIFO=1], [HAVE_MKFIFO=0])

View file

@ -935,7 +935,7 @@ static int is_group(gid_t gid, const char *name) {
#else #else
n = -1; n = -1;
#endif #endif
if (n < 0) if (n <= 0)
n = 512; n = 512;
data = pa_xmalloc((size_t) n); data = pa_xmalloc((size_t) n);
@ -959,7 +959,7 @@ finish:
* support getgrgid_r. */ * support getgrgid_r. */
errno = 0; errno = 0;
if ((result = getgrgid(gid)) == NULL) { if (!(result = getgrgid(gid))) {
pa_log("getgrgid(%u): %s", gid, pa_cstrerror(errno)); pa_log("getgrgid(%u): %s", gid, pa_cstrerror(errno));
if (!errno) if (!errno)
@ -1026,18 +1026,35 @@ int pa_uid_in_group(uid_t uid, const char *name) {
char **i; char **i;
int r = -1; int r = -1;
#ifdef _SC_GETGR_R_SIZE_MAX
g_n = sysconf(_SC_GETGR_R_SIZE_MAX); g_n = sysconf(_SC_GETGR_R_SIZE_MAX);
#else
g_n = -1;
#endif
if (g_n <= 0)
g_n = 512;
g_buf = pa_xmalloc((size_t) g_n); g_buf = pa_xmalloc((size_t) g_n);
#ifdef _SC_GETPW_R_SIZE_MAX
p_n = sysconf(_SC_GETPW_R_SIZE_MAX); p_n = sysconf(_SC_GETPW_R_SIZE_MAX);
#else
p_n = -1;
#endif
if (p_n <= 0)
p_n = 512;
p_buf = pa_xmalloc((size_t) p_n); p_buf = pa_xmalloc((size_t) p_n);
errno = 0; errno = 0;
if (getgrnam_r(name, &grbuf, g_buf, (size_t) g_n, &gr) != 0 || !gr) { #ifdef HAVE_GETGRNAM_R
if (getgrnam_r(name, &grbuf, g_buf, (size_t) g_n, &gr) != 0 || !gr)
#else
if (!(gr = getgrnam(name)))
#endif
{
if (!errno) if (!errno)
errno = ENOENT; errno = ENOENT;
goto finish; goto finish;
} }
@ -1045,8 +1062,11 @@ int pa_uid_in_group(uid_t uid, const char *name) {
for (i = gr->gr_mem; *i; i++) { for (i = gr->gr_mem; *i; i++) {
struct passwd pwbuf, *pw; struct passwd pwbuf, *pw;
errno = 0; #ifdef HAVE_GETPWNAM_R
if (getpwnam_r(*i, &pwbuf, p_buf, (size_t) p_n, &pw) != 0 || !pw) if (getpwnam_r(*i, &pwbuf, p_buf, (size_t) p_n, &pw) != 0 || !pw)
#else
if (!(pw = getpwnam(*i)))
#endif
continue; continue;
if (pw->pw_uid == uid) { if (pw->pw_uid == uid) {
@ -1069,15 +1089,25 @@ gid_t pa_get_gid_of_group(const char *name) {
long g_n; long g_n;
struct group grbuf, *gr; struct group grbuf, *gr;
#ifdef _SC_GETGR_R_SIZE_MAX
g_n = sysconf(_SC_GETGR_R_SIZE_MAX); g_n = sysconf(_SC_GETGR_R_SIZE_MAX);
#else
g_n = -1;
#endif
if (g_n <= 0)
g_n = 512;
g_buf = pa_xmalloc((size_t) g_n); g_buf = pa_xmalloc((size_t) g_n);
errno = 0; errno = 0;
if (getgrnam_r(name, &grbuf, g_buf, (size_t) g_n, &gr) != 0 || !gr) { #ifdef HAVE_GETGRNAM_R
if (getgrnam_r(name, &grbuf, g_buf, (size_t) g_n, &gr) != 0 || !gr)
#else
if (!(gr = getgrnam(name)))
#endif
{
if (!errno) if (!errno)
errno = ENOENT; errno = ENOENT;
goto finish; goto finish;
} }