2010-03-06 Zoltan Varga <vargaz@gmail.com>
[mono.git] / support / pwd.c
index 2e0b373cf29493fddb61219ae3c02ad88227f8fb..13bccef9b559a9392c6787f8dc47c19ab485296b 100644 (file)
 
 G_BEGIN_DECLS
 
-static const size_t
+static const mph_string_offset_t
 passwd_offsets[] = {
-       offsetof (struct passwd, pw_name),
-       offsetof (struct passwd, pw_passwd),
-       offsetof (struct passwd, pw_gecos),
-       offsetof (struct passwd, pw_dir),
-       offsetof (struct passwd, pw_shell)
+       MPH_STRING_OFFSET (struct passwd, pw_name,    MPH_STRING_OFFSET_PTR),
+       MPH_STRING_OFFSET (struct passwd, pw_passwd,  MPH_STRING_OFFSET_PTR),
+       MPH_STRING_OFFSET (struct passwd, pw_gecos,   MPH_STRING_OFFSET_PTR),
+       MPH_STRING_OFFSET (struct passwd, pw_dir,     MPH_STRING_OFFSET_PTR),
+       MPH_STRING_OFFSET (struct passwd, pw_shell,   MPH_STRING_OFFSET_PTR)
 };
 
-static const size_t
+static const mph_string_offset_t
 mph_passwd_offsets[] = {
-       offsetof (struct Mono_Posix_Syscall__Passwd, pw_name),
-       offsetof (struct Mono_Posix_Syscall__Passwd, pw_passwd),
-       offsetof (struct Mono_Posix_Syscall__Passwd, pw_gecos),
-       offsetof (struct Mono_Posix_Syscall__Passwd, pw_dir),
-       offsetof (struct Mono_Posix_Syscall__Passwd, pw_shell)
+       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),
+       MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Passwd, pw_gecos,   MPH_STRING_OFFSET_PTR),
+       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)
 };
 
 /*
@@ -237,8 +237,11 @@ int
 Mono_Posix_Syscall_setpwent (void)
 {
        errno = 0;
-       setpwent ();
-       return errno == 0 ? 0 : -1;
+       do {
+               setpwent ();
+       } while (errno == EINTR);
+       mph_return_if_val_in_list5(errno, EIO, EMFILE, ENFILE, ENOMEM, ERANGE);
+       return 0;
 }
 
 int
@@ -246,7 +249,9 @@ Mono_Posix_Syscall_endpwent (void)
 {
        errno = 0;
        endpwent ();
-       return errno == 0 ? 0 : -1;
+       if (errno == EIO)
+               return -1;
+       return 0;
 }
 
 G_END_DECLS