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