X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=support%2Fgrp.c;h=827bc550d938fa91252db4ca620d739b939cb508;hb=5317fbc0cd0146c84ffab2dc1776ec34cce859c0;hp=99ef795c139a705bad4b08a867a9d9f0f2a86a56;hpb=6b6435d1b3206b0162c37e5ecce8d9a699fe6467;p=mono.git diff --git a/support/grp.c b/support/grp.c index 99ef795c139..827bc550d93 100644 --- a/support/grp.c +++ b/support/grp.c @@ -4,11 +4,13 @@ * Authors: * Jonathan Pryor (jonpryor@vt.edu) * - * Copyright (C) 2004 Jonathan Pryor + * Copyright (C) 2004-2005 Jonathan Pryor */ #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; } @@ -152,7 +146,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; @@ -176,7 +170,7 @@ Mono_Posix_Syscall_getgrnam_r (const char *name, } buf = buf2; errno = 0; - } while ((r = getgrnam_r (name, &_grbuf, buf, buflen, gbufp)) && + } 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 */ @@ -195,7 +189,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; @@ -219,7 +213,7 @@ Mono_Posix_Syscall_getgrgid_r (mph_gid_t gid, } buf = buf2; errno = 0; - } while ((r = getgrgid_r (gid, &_grbuf, buf, buflen, gbufp)) && + } 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 */ @@ -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,10 +250,11 @@ Mono_Posix_Syscall_getgrent (struct Mono_Posix_Syscall__Group *grbuf) } return 0; } +#endif /* def HAVE_GETGRENT */ #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; @@ -268,7 +264,7 @@ Mono_Posix_Syscall_fgetgrent (FILE *stream, struct Mono_Posix_Syscall__Group *gr } errno = 0; - gr = fgetgrent (stream); + gr = fgetgrent ((FILE*) stream); if (gr == NULL) return -1; @@ -280,12 +276,37 @@ Mono_Posix_Syscall_fgetgrent (FILE *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; + 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) +{ + endgrent(); + return 0; +} +#endif /* def HAVE_ENDGRENT */ + G_END_DECLS