[w32file] Move MonoIO.Find{First,Next,Close} to managed
[mono.git] / support / pwd.c
index 13bccef9b559a9392c6787f8dc47c19ab485296b..6e3b68a208e9bc2340facb98262023033f9a2527 100644 (file)
@@ -22,7 +22,9 @@ static const mph_string_offset_t
 passwd_offsets[] = {
        MPH_STRING_OFFSET (struct passwd, pw_name,    MPH_STRING_OFFSET_PTR),
        MPH_STRING_OFFSET (struct passwd, pw_passwd,  MPH_STRING_OFFSET_PTR),
+#if HAVE_STRUCT_PASSWD_PW_GECOS
        MPH_STRING_OFFSET (struct passwd, pw_gecos,   MPH_STRING_OFFSET_PTR),
+#endif  /* def HAVE_STRUCT_PASSWD_PW_GECOS */
        MPH_STRING_OFFSET (struct passwd, pw_dir,     MPH_STRING_OFFSET_PTR),
        MPH_STRING_OFFSET (struct passwd, pw_shell,   MPH_STRING_OFFSET_PTR)
 };
@@ -31,7 +33,9 @@ static const mph_string_offset_t
 mph_passwd_offsets[] = {
        MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Passwd, pw_name,    MPH_STRING_OFFSET_PTR),
        MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Passwd, pw_passwd,  MPH_STRING_OFFSET_PTR),
+#if HAVE_STRUCT_PASSWD_PW_GECOS
        MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Passwd, pw_gecos,   MPH_STRING_OFFSET_PTR),
+#endif  /* def HAVE_STRUCT_PASSWD_PW_GECOS */
        MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Passwd, pw_dir,     MPH_STRING_OFFSET_PTR),
        MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Passwd, pw_shell,   MPH_STRING_OFFSET_PTR)
 };
@@ -179,6 +183,10 @@ Mono_Posix_Syscall_getpwuid_r (mph_uid_t uid,
        } while ((r = getpwuid_r (uid, &_pwbuf, buf, buflen, (struct passwd**) pwbufp)) && 
                        recheck_range (r));
 
+       if (r == 0 && !(*pwbufp))
+               /* On solaris, this function returns 0 even if the entry was not found */
+               r = errno = ENOENT;
+
        if (r == 0 && copy_passwd (pwbuf, &_pwbuf) == -1)
                r = errno = ENOMEM;
        free (buf);
@@ -187,6 +195,7 @@ Mono_Posix_Syscall_getpwuid_r (mph_uid_t uid,
 }
 #endif /* ndef HAVE_GETPWUID_R */
 
+#if HAVE_GETPWENT
 gint32
 Mono_Posix_Syscall_getpwent (struct Mono_Posix_Syscall__Passwd *pwbuf)
 {
@@ -208,6 +217,7 @@ Mono_Posix_Syscall_getpwent (struct Mono_Posix_Syscall__Passwd *pwbuf)
        }
        return 0;
 }
+#endif  /* def HAVE_GETPWENT */
 
 #ifdef HAVE_FGETPWENT
 gint32
@@ -233,6 +243,7 @@ Mono_Posix_Syscall_fgetpwent (void *stream, struct Mono_Posix_Syscall__Passwd *p
 }
 #endif /* ndef HAVE_FGETPWENT */
 
+#if HAVE_SETPWENT
 int
 Mono_Posix_Syscall_setpwent (void)
 {
@@ -243,7 +254,9 @@ Mono_Posix_Syscall_setpwent (void)
        mph_return_if_val_in_list5(errno, EIO, EMFILE, ENFILE, ENOMEM, ERANGE);
        return 0;
 }
+#endif  /* def HAVE_SETPWENT */
 
+#if HAVE_ENDPWENT
 int
 Mono_Posix_Syscall_endpwent (void)
 {
@@ -253,6 +266,7 @@ Mono_Posix_Syscall_endpwent (void)
                return -1;
        return 0;
 }
+#endif  /* def HAVE_ENDPWENT */
 
 G_END_DECLS