* grp.c: Oops. Didn't see other Solaris fix in #72292.
[mono.git] / support / grp.c
index ff49aa1bd2a8ccd7fb9c5a9132a7657e7b35a51a..99ef795c139a705bad4b08a867a9d9f0f2a86a56 100644 (file)
@@ -7,10 +7,14 @@
  * 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"
 
@@ -110,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;
@@ -131,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;
@@ -142,6 +148,7 @@ Mono_Posix_Syscall_getgrgid (mph_gid_t gid, struct Mono_Posix_Syscall__Group *gb
        return 0;
 }
 
+#ifdef HAVE_GETGRNAM_R
 gint32
 Mono_Posix_Syscall_getgrnam_r (const char *name, 
        struct Mono_Posix_Syscall__Group *gbuf,
@@ -168,7 +175,13 @@ Mono_Posix_Syscall_getgrnam_r (const char *name,
                        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;
@@ -176,7 +189,9 @@ Mono_Posix_Syscall_getgrnam_r (const char *name,
 
        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,
@@ -203,7 +218,13 @@ Mono_Posix_Syscall_getgrgid_r (mph_gid_t gid,
                        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;
@@ -211,6 +232,7 @@ Mono_Posix_Syscall_getgrgid_r (mph_gid_t gid,
 
        return r;
 }
+#endif /* ndef HAVE_GETGRGID_R */
 
 gint32
 Mono_Posix_Syscall_getgrent (struct Mono_Posix_Syscall__Group *grbuf)
@@ -222,6 +244,7 @@ Mono_Posix_Syscall_getgrent (struct Mono_Posix_Syscall__Group *grbuf)
                return -1;
        }
 
+       errno = 0;
        gr = getgrent ();
        if (gr == NULL)
                return -1;
@@ -233,6 +256,7 @@ Mono_Posix_Syscall_getgrent (struct Mono_Posix_Syscall__Group *grbuf)
        return 0;
 }
 
+#ifdef HAVE_FGETGRENT
 gint32
 Mono_Posix_Syscall_fgetgrent (FILE *stream, struct Mono_Posix_Syscall__Group *grbuf)
 {
@@ -243,6 +267,7 @@ Mono_Posix_Syscall_fgetgrent (FILE *stream, struct Mono_Posix_Syscall__Group *gr
                return -1;
        }
 
+       errno = 0;
        gr = fgetgrent (stream);
        if (gr == NULL)
                return -1;
@@ -253,6 +278,7 @@ Mono_Posix_Syscall_fgetgrent (FILE *stream, struct Mono_Posix_Syscall__Group *gr
        }
        return 0;
 }
+#endif /* ndef HAVE_FGETGRENT */
 
 gint32
 Mono_Posix_Syscall_setgroups (mph_size_t size, mph_gid_t *list)