8d455889d7ca4c30ea10c8a6e7c2471afcec7179
[mono.git] / support / macros.c
1 #include "mph.h"
2 #include <sys/types.h>
3 #include <sys/wait.h>
4 #include <sys/stat.h>
5 #include <unistd.h>
6 #include <pwd.h>
7 #include <grp.h>
8 #include <errno.h>
9 #include <dirent.h>
10 #include <string.h>
11 #include <glib.h>
12 #include "map.h"
13
14 int wifexited (int status)
15 {
16         return WIFEXITED (status);
17 }
18
19 int wexitstatus (int status)
20 {
21         return WEXITSTATUS (status);
22 }
23
24 int wifsignaled (int status)
25 {
26         return WIFSIGNALED (status);
27 }
28
29 int wtermsig (int status)
30 {
31         return WTERMSIG (status);
32 }
33
34 int wifstopped (int status)
35 {
36         return WIFSTOPPED (status);
37 }
38
39 int wstopsig (int status)
40 {
41         return WSTOPSIG (status);
42 }
43
44 int helper_Mono_Posix_Stat(const char *filename, int dereference, 
45         int *device,
46         int *inode,
47         int *mode,
48         int *nlinks,
49         int *uid,
50         int *gid,
51         int *rdev,
52         gint64 *size,
53         gint64 *blksize,
54         gint64 *blocks,
55         gint64 *atime,
56         gint64 *mtime,
57         gint64 *ctime
58         ) {
59         int ret;
60         struct stat buf;
61         
62         if (!dereference)
63                 ret = stat(filename, &buf);
64         else
65                 ret = lstat(filename, &buf);
66         
67         if (ret) return ret;
68         
69         *device = buf.st_dev;
70         *inode = buf.st_ino;
71         *mode = buf.st_mode;
72         *nlinks = buf.st_nlink;
73         *uid = buf.st_uid;
74         *gid = buf.st_gid;
75         *rdev = buf.st_rdev;
76         *size = buf.st_size;
77         *blksize = buf.st_blksize;
78         *blocks = buf.st_blocks;
79         *atime = buf.st_atime;
80         *mtime = buf.st_mtime;
81         *ctime = buf.st_ctime;
82         return 0;
83 }
84
85 char *helper_Mono_Posix_GetUserName(int uid) {
86         struct passwd *p = getpwuid(uid);
87         if (p == NULL) return NULL;
88         return strdup (p->pw_name);
89 }
90 char *helper_Mono_Posix_GetGroupName(int gid) {
91         struct group *p = getgrgid(gid);
92         if (p == NULL) return NULL;
93         return strdup (p->gr_name);
94 }
95
96 char *helper_Mono_Posix_readdir(void *dir) {
97         struct dirent* e = readdir((DIR*) dir);
98         if (e == NULL) return NULL;
99         return strdup (e->d_name);
100 }
101
102 #if HAVE_GETPWNAM_R
103 int helper_Mono_Posix_getpwnamuid (int mode, char *in_name, int in_uid,
104         char **account,
105         char **password,
106         int *uid,
107         int *gid,
108         char **name,
109         char **home,
110         char **shell);
111
112 int helper_Mono_Posix_getpwnamuid (int mode, char *in_name, int in_uid,
113         char **account,
114         char **password,
115         int *uid,
116         int *gid,
117         char **name,
118         char **home,
119         char **shell
120         ) {
121
122         struct passwd pw, *pwp;
123         char buf[4096];
124         int ret;
125
126         if (mode == 0)
127                 ret = getpwnam_r (in_name, &pw, buf, 4096, &pwp);
128         else
129                 ret = getpwuid_r (in_uid, &pw, buf, 4096, &pwp);
130
131         if (ret == 0 && pwp == NULL) {
132                 // Don't know why this happens, but it does.
133                 // ret == 0, errno == 0, but no record was found.
134                 ret = ENOENT;
135         }
136
137         if (ret) {
138                 *account = NULL; // prevent marshalling unset pointers
139                 *password = NULL;
140                 *uid = 0;
141                 *gid = 0;
142                 *name = NULL;
143                 *home = NULL;
144                 *shell = NULL;
145                 return ret;
146         }
147
148         *account = pwp->pw_name;
149         *password = pwp->pw_passwd;
150         *uid = pwp->pw_uid;
151         *gid = pwp->pw_gid;
152         *name = pwp->pw_gecos;
153         *home = pwp->pw_dir;
154         *shell = pwp->pw_shell;
155
156         return 0;
157 }
158 #endif  /* def HAVE_GETPWNAM_R */
159