Merge pull request #5668 from kumpera/wasm-work-p4
[mono.git] / support / macros.c
index 27d7065014a694afd8f7a5fefc39063b5eaa9010..8d455889d7ca4c30ea10c8a6e7c2471afcec7179 100644 (file)
@@ -1,9 +1,15 @@
+#include "mph.h"
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <pwd.h>
 #include <grp.h>
+#include <errno.h>
+#include <dirent.h>
+#include <string.h>
+#include <glib.h>
+#include "map.h"
 
 int wifexited (int status)
 {
@@ -35,7 +41,7 @@ int wstopsig (int status)
        return WSTOPSIG (status);
 }
 
-int helper_Mono_Posix_Stat(char *filename, int dereference, 
+int helper_Mono_Posix_Stat(const char *filename, int dereference, 
        int *device,
        int *inode,
        int *mode,
@@ -43,12 +49,12 @@ int helper_Mono_Posix_Stat(char *filename, int dereference,
        int *uid,
        int *gid,
        int *rdev,
-       long *size,
-       long *blksize,
-       long *blocks,
-       long *atime,
-       long *mtime,
-       long *ctime
+       gint64 *size,
+       gint64 *blksize,
+       gint64 *blocks,
+       gint64 *atime,
+       gint64 *mtime,
+       gint64 *ctime
        ) {
        int ret;
        struct stat buf;
@@ -79,11 +85,75 @@ int helper_Mono_Posix_Stat(char *filename, int dereference,
 char *helper_Mono_Posix_GetUserName(int uid) {
        struct passwd *p = getpwuid(uid);
        if (p == NULL) return NULL;
-       return p->pw_name;
+       return strdup (p->pw_name);
 }
 char *helper_Mono_Posix_GetGroupName(int gid) {
        struct group *p = getgrgid(gid);
        if (p == NULL) return NULL;
-       return p->gr_name;
+       return strdup (p->gr_name);
 }
 
+char *helper_Mono_Posix_readdir(void *dir) {
+       struct dirent* e = readdir((DIR*) dir);
+       if (e == NULL) return NULL;
+       return strdup (e->d_name);
+}
+
+#if HAVE_GETPWNAM_R
+int helper_Mono_Posix_getpwnamuid (int mode, char *in_name, int in_uid,
+       char **account,
+       char **password,
+       int *uid,
+       int *gid,
+       char **name,
+       char **home,
+       char **shell);
+
+int helper_Mono_Posix_getpwnamuid (int mode, char *in_name, int in_uid,
+       char **account,
+       char **password,
+       int *uid,
+       int *gid,
+       char **name,
+       char **home,
+       char **shell
+       ) {
+
+       struct passwd pw, *pwp;
+       char buf[4096];
+       int ret;
+
+       if (mode == 0)
+               ret = getpwnam_r (in_name, &pw, buf, 4096, &pwp);
+       else
+               ret = getpwuid_r (in_uid, &pw, buf, 4096, &pwp);
+
+       if (ret == 0 && pwp == NULL) {
+               // Don't know why this happens, but it does.
+               // ret == 0, errno == 0, but no record was found.
+               ret = ENOENT;
+       }
+
+       if (ret) {
+               *account = NULL; // prevent marshalling unset pointers
+               *password = NULL;
+               *uid = 0;
+               *gid = 0;
+               *name = NULL;
+               *home = NULL;
+               *shell = NULL;
+               return ret;
+       }
+
+       *account = pwp->pw_name;
+       *password = pwp->pw_passwd;
+       *uid = pwp->pw_uid;
+       *gid = pwp->pw_gid;
+       *name = pwp->pw_gecos;
+       *home = pwp->pw_dir;
+       *shell = pwp->pw_shell;
+
+       return 0;
+}
+#endif  /* def HAVE_GETPWNAM_R */
+