* Copyright (C) 2004 Jonathan Pryor
*/
+#include <sys/types.h>
+#include <sys/param.h>
#include <grp.h>
+#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
+#include <unistd.h> /* for setgroups on Mac OS X */
#include "mph.h"
return -1;
}
+ errno = 0;
_gbuf = getgrnam (name);
if (_gbuf == NULL)
return -1;
return -1;
}
+ errno = 0;
_gbuf = getgrgid (gid);
if (_gbuf == NULL)
return -1;
return 0;
}
+#ifdef HAVE_GETGRNAM_R
gint32
Mono_Posix_Syscall_getgrnam_r (const char *name,
struct Mono_Posix_Syscall__Group *gbuf,
return -1;
}
buf = buf2;
- } while ((r = getgrnam_r (name, &_grbuf, buf, buflen, gbufp)) && r == ERANGE);
+ errno = 0;
+ } while ((r = getgrnam_r (name, &_grbuf, buf, buflen, gbufp)) &&
+ recheck_range (r));
+
+ /* On Solaris, this function returns 0 even if the entry was not found */
+ if (r == 0 && !(*gbufp))
+ r = errno = ENOENT;
if (r == 0 && copy_group (gbuf, &_grbuf) == -1)
r = errno = ENOMEM;
return r;
}
+#endif /* ndef HAVE_GETGRNAM_R */
+#ifdef HAVE_GETGRGID_R
gint32
Mono_Posix_Syscall_getgrgid_r (mph_gid_t gid,
struct Mono_Posix_Syscall__Group *gbuf,
return -1;
}
buf = buf2;
- } while ((r = getgrgid_r (gid, &_grbuf, buf, buflen, gbufp)) && r == ERANGE);
+ errno = 0;
+ } while ((r = getgrgid_r (gid, &_grbuf, buf, buflen, gbufp)) &&
+ recheck_range (r));
+
+ /* On Solaris, this function returns 0 even if the entry was not found */
+ if (r == 0 && !(*gbufp))
+ r = errno = ENOENT;
if (r == 0 && copy_group (gbuf, &_grbuf) == -1)
r = errno = ENOMEM;
return r;
}
+#endif /* ndef HAVE_GETGRGID_R */
gint32
Mono_Posix_Syscall_getgrent (struct Mono_Posix_Syscall__Group *grbuf)
return -1;
}
+ errno = 0;
gr = getgrent ();
if (gr == NULL)
return -1;
return 0;
}
+#ifdef HAVE_FGETGRENT
gint32
Mono_Posix_Syscall_fgetgrent (FILE *stream, struct Mono_Posix_Syscall__Group *grbuf)
{
return -1;
}
+ errno = 0;
gr = fgetgrent (stream);
if (gr == NULL)
return -1;
}
return 0;
}
+#endif /* ndef HAVE_FGETGRENT */
gint32
Mono_Posix_Syscall_setgroups (mph_size_t size, mph_gid_t *list)