X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=support%2Fgrp.c;h=827bc550d938fa91252db4ca620d739b939cb508;hb=HEAD;hp=8e2a3f790cf38e37bea281b8d548e77d56d737d2;hpb=f73e0d5c67f0d26e85b92fc4b75fc48783f20d64;p=mono.git diff --git a/support/grp.c b/support/grp.c index 8e2a3f790cf..827bc550d93 100644 --- a/support/grp.c +++ b/support/grp.c @@ -8,7 +8,9 @@ */ #include +#ifdef HAVE_SYS_PARAM_H #include +#endif #include #include #include @@ -16,19 +18,11 @@ #include #include /* for setgroups on Mac OS X */ +#include "map.h" #include "mph.h" G_BEGIN_DECLS -struct Mono_Posix_Syscall__Group { - /* string */ char *gr_name; - /* string */ char *gr_passwd; - /* gid_t */ mph_gid_t gr_gid; - /* int */ int _gr_nmem_; - /* string */ char **gr_mem; - /* string */ char *_gr_buf_; /* holds all but gr_mem */ -}; - static void count_members (char **gr_mem, int *count, size_t *mem) { @@ -56,7 +50,7 @@ copy_group (struct Mono_Posix_Syscall__Group *to, struct group *from) { size_t nlen, plen, buflen; int i, count; - char *cur; + char *cur, **to_mem; to->gr_gid = from->gr_gid; @@ -83,7 +77,7 @@ copy_group (struct Mono_Posix_Syscall__Group *to, struct group *from) to->_gr_nmem_ = count; cur = to->_gr_buf_ = (char*) malloc (buflen); - to->gr_mem = (char **) malloc (sizeof(char*)*(count+1)); + to_mem = to->gr_mem = malloc (sizeof(char*)*(count+1)); if (to->_gr_buf_ == NULL || to->gr_mem == NULL) { free (to->_gr_buf_); free (to->gr_mem); @@ -96,10 +90,10 @@ copy_group (struct Mono_Posix_Syscall__Group *to, struct group *from) cur += (plen + 1); for (i = 0; i != count; ++i) { - to->gr_mem[i] = strcpy (cur, from->gr_mem[i]); + to_mem [i] = strcpy (cur, from->gr_mem[i]); cur += (strlen (from->gr_mem[i])+1); } - to->gr_mem[i] = NULL; + to_mem [i] = NULL; return 0; } @@ -234,6 +228,7 @@ Mono_Posix_Syscall_getgrgid_r (mph_gid_t gid, } #endif /* ndef HAVE_GETGRGID_R */ +#if HAVE_GETGRENT gint32 Mono_Posix_Syscall_getgrent (struct Mono_Posix_Syscall__Group *grbuf) { @@ -255,6 +250,7 @@ Mono_Posix_Syscall_getgrent (struct Mono_Posix_Syscall__Group *grbuf) } return 0; } +#endif /* def HAVE_GETGRENT */ #ifdef HAVE_FGETGRENT gint32 @@ -280,28 +276,36 @@ Mono_Posix_Syscall_fgetgrent (void *stream, struct Mono_Posix_Syscall__Group *gr } #endif /* ndef HAVE_FGETGRENT */ +#if HAVE_SETGROUPS gint32 Mono_Posix_Syscall_setgroups (mph_size_t size, mph_gid_t *list) { mph_return_if_size_t_overflow (size); return setgroups ((size_t) size, list); } +#endif /* def HAVE_SETGROUPS */ +#if HAVE_SETGRENT int Mono_Posix_Syscall_setgrent (void) { errno = 0; - setgrent (); - return errno == 0 ? 0 : -1; + do { + setgrent (); + } while (errno == EINTR); + mph_return_if_val_in_list5(errno, EIO, EMFILE, ENFILE, ENOMEM, ERANGE); + return 0; } +#endif /* def HAVE_SETGRENT */ +#if HAVE_ENDGRENT int Mono_Posix_Syscall_endgrent (void) { - errno = 0; endgrent(); - return errno == 0 ? 0 : -1; + return 0; } +#endif /* def HAVE_ENDGRENT */ G_END_DECLS