* Authors:
* Jonathan Pryor (jonpryor@vt.edu)
*
- * Copyright (C) 2004 Jonathan Pryor
+ * Copyright (C) 2004-2005 Jonathan Pryor
*/
#include <sys/types.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;
gint32
Mono_Posix_Syscall_getgrnam_r (const char *name,
struct Mono_Posix_Syscall__Group *gbuf,
- struct group **gbufp)
+ void **gbufp)
{
char *buf, *buf2;
size_t buflen;
return -1;
}
buf = buf2;
- } while ((r = getgrnam_r (name, &_grbuf, buf, buflen, gbufp)) &&
+ errno = 0;
+ } while ((r = getgrnam_r (name, &_grbuf, buf, buflen, (struct group**) 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;
free (buf);
gint32
Mono_Posix_Syscall_getgrgid_r (mph_gid_t gid,
struct Mono_Posix_Syscall__Group *gbuf,
- struct group **gbufp)
+ void **gbufp)
{
char *buf, *buf2;
size_t buflen;
return -1;
}
buf = buf2;
- } while ((r = getgrgid_r (gid, &_grbuf, buf, buflen, gbufp)) &&
+ errno = 0;
+ } while ((r = getgrgid_r (gid, &_grbuf, buf, buflen, (struct group**) 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;
free (buf);
return -1;
}
+ errno = 0;
gr = getgrent ();
if (gr == NULL)
return -1;
#ifdef HAVE_FGETGRENT
gint32
-Mono_Posix_Syscall_fgetgrent (FILE *stream, struct Mono_Posix_Syscall__Group *grbuf)
+Mono_Posix_Syscall_fgetgrent (void *stream, struct Mono_Posix_Syscall__Group *grbuf)
{
struct group *gr;
return -1;
}
- gr = fgetgrent (stream);
+ errno = 0;
+ gr = fgetgrent ((FILE*) stream);
if (gr == NULL)
return -1;
return setgroups ((size_t) size, list);
}
+int
+Mono_Posix_Syscall_setgrent (void)
+{
+ errno = 0;
+ setgrent ();
+ return errno == 0 ? 0 : -1;
+}
+
+int
+Mono_Posix_Syscall_endgrent (void)
+{
+ errno = 0;
+ endgrent();
+ return errno == 0 ? 0 : -1;
+}
+
+
G_END_DECLS
/*