diff options
Diffstat (limited to 'support/macros.c')
-rw-r--r-- | support/macros.c | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/support/macros.c b/support/macros.c new file mode 100644 index 00000000000..c64c7dae528 --- /dev/null +++ b/support/macros.c @@ -0,0 +1,144 @@ +#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> + +int wifexited (int status) +{ + return WIFEXITED (status); +} + +int wexitstatus (int status) +{ + return WEXITSTATUS (status); +} + +int wifsignaled (int status) +{ + return WIFSIGNALED (status); +} + +int wtermsig (int status) +{ + return WTERMSIG (status); +} + +int wifstopped (int status) +{ + return WIFSTOPPED (status); +} + +int wstopsig (int status) +{ + return WSTOPSIG (status); +} + +int helper_Mono_Posix_Stat(char *filename, int dereference, + int *device, + int *inode, + int *mode, + int *nlinks, + int *uid, + int *gid, + int *rdev, + long *size, + long *blksize, + long *blocks, + long *atime, + long *mtime, + long *ctime + ) { + int ret; + struct stat buf; + + if (!dereference) + ret = stat(filename, &buf); + else + ret = lstat(filename, &buf); + + if (ret) return ret; + + *device = buf.st_dev; + *inode = buf.st_ino; + *mode = buf.st_mode; + *nlinks = buf.st_nlink; + *uid = buf.st_uid; + *gid = buf.st_gid; + *rdev = buf.st_rdev; + *size = buf.st_size; + *blksize = buf.st_blksize; + *blocks = buf.st_blocks; + *atime = buf.st_atime; + *mtime = buf.st_mtime; + *ctime = buf.st_ctime; + return 0; +} + +char *helper_Mono_Posix_GetUserName(int uid) { + struct passwd *p = getpwuid(uid); + if (p == NULL) return NULL; + return strdup (p->pw_name); +} +char *helper_Mono_Posix_GetGroupName(int gid) { + struct group *p = getgrgid(gid); + if (p == NULL) return NULL; + return strdup (p->gr_name); +} + +char *helper_Mono_Posix_readdir(DIR *dir) { + struct dirent* e = readdir(dir); + if (e == NULL) return NULL; + return strdup (e->d_name); +} + +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; +} |