* 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;
}
}
#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
}
#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