macros.c 2.5 KB

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