fcntl.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /*
  2. * <fcntl.h> wrapper functions.
  3. *
  4. * Authors:
  5. * Jonathan Pryor ([email protected])
  6. *
  7. * Copyright (C) 2004, 2006 Jonathan Pryor
  8. */
  9. #ifndef _GNU_SOURCE
  10. #define _GNU_SOURCE
  11. #endif
  12. #include <sys/types.h>
  13. #include <sys/stat.h>
  14. #include <unistd.h>
  15. #include <fcntl.h>
  16. #include <errno.h>
  17. #include "map.h"
  18. #include "mph.h"
  19. G_BEGIN_DECLS
  20. gint32
  21. Mono_Posix_Syscall_fcntl (gint32 fd, gint32 cmd)
  22. {
  23. if (Mono_Posix_FromFcntlCommand (cmd, &cmd) == -1)
  24. return -1;
  25. return fcntl (fd, cmd);
  26. }
  27. gint32
  28. Mono_Posix_Syscall_fcntl_arg (gint32 fd, gint32 cmd, gint64 arg)
  29. {
  30. long _arg;
  31. gint32 _cmd;
  32. mph_return_if_long_overflow (arg);
  33. #ifdef F_NOTIFY
  34. if (cmd == F_NOTIFY) {
  35. int _argi;
  36. if (Mono_Posix_FromDirectoryNotifyFlags (arg, &_argi) == -1) {
  37. return -1;
  38. }
  39. _arg = _argi;
  40. }
  41. else
  42. #endif
  43. _arg = (long) arg;
  44. if (Mono_Posix_FromFcntlCommand (cmd, &_cmd) == -1)
  45. return -1;
  46. return fcntl (fd, cmd, _arg);
  47. }
  48. gint32
  49. Mono_Posix_Syscall_fcntl_lock (gint32 fd, gint32 cmd, struct Mono_Posix_Flock *lock)
  50. {
  51. struct flock _lock;
  52. int r;
  53. if (lock == NULL) {
  54. errno = EFAULT;
  55. return -1;
  56. }
  57. mph_return_if_off_t_overflow (lock->l_start);
  58. mph_return_if_off_t_overflow (lock->l_len);
  59. if (Mono_Posix_FromLockType (lock->l_type, &lock->l_type) == -1)
  60. return -1;
  61. _lock.l_type = lock->l_type;
  62. _lock.l_whence = lock->l_whence;
  63. _lock.l_start = lock->l_start;
  64. _lock.l_len = lock->l_len;
  65. _lock.l_pid = lock->l_pid;
  66. r = fcntl (fd, cmd, &_lock);
  67. if (Mono_Posix_ToLockType (_lock.l_type, &_lock.l_type) == -1)
  68. r = -1;
  69. lock->l_type = _lock.l_type;
  70. lock->l_whence = _lock.l_whence;
  71. lock->l_start = _lock.l_start;
  72. lock->l_len = _lock.l_len;
  73. lock->l_pid = _lock.l_pid;
  74. return r;
  75. }
  76. gint32
  77. Mono_Posix_Syscall_open (const char *pathname, gint32 flags)
  78. {
  79. if (Mono_Posix_FromOpenFlags (flags, &flags) == -1)
  80. return -1;
  81. return open (pathname, flags);
  82. }
  83. gint32
  84. Mono_Posix_Syscall_open_mode (const char *pathname, gint32 flags, guint32 mode)
  85. {
  86. if (Mono_Posix_FromOpenFlags (flags, &flags) == -1)
  87. return -1;
  88. if (Mono_Posix_FromFilePermissions (mode, &mode) == -1)
  89. return -1;
  90. return open (pathname, flags, mode);
  91. }
  92. gint32
  93. Mono_Posix_Syscall_creat (const char *pathname, guint32 mode)
  94. {
  95. if (Mono_Posix_FromFilePermissions (mode, &mode) == -1)
  96. return -1;
  97. return creat (pathname, mode);
  98. }
  99. #ifdef HAVE_POSIX_FADVISE
  100. gint32
  101. Mono_Posix_Syscall_posix_fadvise (gint32 fd, mph_off_t offset, mph_off_t len,
  102. gint32 advice)
  103. {
  104. mph_return_if_off_t_overflow (offset);
  105. mph_return_if_off_t_overflow (len);
  106. if (Mono_Posix_FromPosixFadviseAdvice (advice, &advice) == -1)
  107. return -1;
  108. return posix_fadvise (fd, (off_t) offset, (off_t) len, advice);
  109. }
  110. #endif /* ndef HAVE_POSIX_FADVISE */
  111. #ifdef HAVE_POSIX_FALLOCATE
  112. gint32
  113. Mono_Posix_Syscall_posix_fallocate (gint32 fd, mph_off_t offset, mph_size_t len)
  114. {
  115. mph_return_if_off_t_overflow (offset);
  116. mph_return_if_size_t_overflow (len);
  117. return posix_fallocate (fd, (off_t) offset, (size_t) len);
  118. }
  119. #endif /* ndef HAVE_POSIX_FALLOCATE */
  120. G_END_DECLS
  121. /*
  122. * vim: noexpandtab
  123. */