* Authors:
* Jonathan Pryor (jonpryor@vt.edu)
*
- * Copyright (C) 2004 Jonathan Pryor
+ * Copyright (C) 2004-2005 Jonathan Pryor
*/
#include <sys/types.h>
+#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
+#endif
#include <grp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> /* 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)
{
{
size_t nlen, plen, buflen;
int i, count;
- char *cur;
+ char *cur, **to_mem;
to->gr_gid = from->gr_gid;
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);
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;
}
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;
}
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 */
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;
}
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 */
}
#endif /* ndef HAVE_GETGRGID_R */
+#if HAVE_GETGRENT
gint32
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;
}
errno = 0;
- gr = fgetgrent (stream);
+ gr = fgetgrent ((FILE*) stream);
if (gr == NULL)
return -1;
}
#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