merge -r 60690:60700
[mono.git] / support / grp.c
index f6c4832cc0cb4c9202e2b97b091d7640d5b389c0..8e2a3f790cf38e37bea281b8d548e77d56d737d2 100644 (file)
@@ -4,7 +4,7 @@
  * Authors:
  *   Jonathan Pryor (jonpryor@vt.edu)
  *
- * Copyright (C) 2004 Jonathan Pryor
+ * Copyright (C) 2004-2005 Jonathan Pryor
  */
 
 #include <sys/types.h>
@@ -114,6 +114,7 @@ Mono_Posix_Syscall_getgrnam (const char *name, struct Mono_Posix_Syscall__Group
                return -1;
        }
 
+       errno = 0;
        _gbuf = getgrnam (name);
        if (_gbuf == NULL)
                return -1;
@@ -135,6 +136,7 @@ Mono_Posix_Syscall_getgrgid (mph_gid_t gid, struct Mono_Posix_Syscall__Group *gb
                return -1;
        }
 
+       errno = 0;
        _gbuf = getgrgid (gid);
        if (_gbuf == NULL)
                return -1;
@@ -150,7 +152,7 @@ Mono_Posix_Syscall_getgrgid (mph_gid_t gid, struct Mono_Posix_Syscall__Group *gb
 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;
@@ -173,9 +175,14 @@ Mono_Posix_Syscall_getgrnam_r (const char *name,
                        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);
@@ -188,7 +195,7 @@ Mono_Posix_Syscall_getgrnam_r (const char *name,
 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;
@@ -211,9 +218,14 @@ Mono_Posix_Syscall_getgrgid_r (mph_gid_t gid,
                        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);
@@ -232,6 +244,7 @@ Mono_Posix_Syscall_getgrent (struct Mono_Posix_Syscall__Group *grbuf)
                return -1;
        }
 
+       errno = 0;
        gr = getgrent ();
        if (gr == NULL)
                return -1;
@@ -245,7 +258,7 @@ Mono_Posix_Syscall_getgrent (struct Mono_Posix_Syscall__Group *grbuf)
 
 #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;
 
@@ -254,7 +267,8 @@ Mono_Posix_Syscall_fgetgrent (FILE *stream, struct Mono_Posix_Syscall__Group *gr
                return -1;
        }
 
-       gr = fgetgrent (stream);
+       errno = 0;
+       gr = fgetgrent ((FILE*) stream);
        if (gr == NULL)
                return -1;
 
@@ -273,6 +287,23 @@ Mono_Posix_Syscall_setgroups (mph_size_t size, mph_gid_t *list)
        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
 
 /*