fcntl.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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. if (Mono_Posix_FromFlock (lock, &_lock) == -1)
  58. return -1;
  59. r = fcntl (fd, cmd, &_lock);
  60. if (Mono_Posix_ToFlock (&_lock, lock) == -1)
  61. return -1;
  62. return r;
  63. }
  64. gint32
  65. Mono_Posix_Syscall_open (const char *pathname, gint32 flags)
  66. {
  67. if (Mono_Posix_FromOpenFlags (flags, &flags) == -1)
  68. return -1;
  69. return open (pathname, flags);
  70. }
  71. gint32
  72. Mono_Posix_Syscall_open_mode (const char *pathname, gint32 flags, guint32 mode)
  73. {
  74. if (Mono_Posix_FromOpenFlags (flags, &flags) == -1)
  75. return -1;
  76. if (Mono_Posix_FromFilePermissions (mode, &mode) == -1)
  77. return -1;
  78. return open (pathname, flags, mode);
  79. }
  80. gint32
  81. Mono_Posix_Syscall_creat (const char *pathname, guint32 mode)
  82. {
  83. if (Mono_Posix_FromFilePermissions (mode, &mode) == -1)
  84. return -1;
  85. return creat (pathname, mode);
  86. }
  87. #ifdef HAVE_POSIX_FADVISE
  88. gint32
  89. Mono_Posix_Syscall_posix_fadvise (gint32 fd, mph_off_t offset, mph_off_t len,
  90. gint32 advice)
  91. {
  92. mph_return_if_off_t_overflow (offset);
  93. mph_return_if_off_t_overflow (len);
  94. if (Mono_Posix_FromPosixFadviseAdvice (advice, &advice) == -1)
  95. return -1;
  96. return posix_fadvise (fd, (off_t) offset, (off_t) len, advice);
  97. }
  98. #endif /* ndef HAVE_POSIX_FADVISE */
  99. #ifdef HAVE_POSIX_FALLOCATE
  100. gint32
  101. Mono_Posix_Syscall_posix_fallocate (gint32 fd, mph_off_t offset, mph_size_t len)
  102. {
  103. mph_return_if_off_t_overflow (offset);
  104. mph_return_if_size_t_overflow (len);
  105. return posix_fallocate (fd, (off_t) offset, (size_t) len);
  106. }
  107. #endif /* ndef HAVE_POSIX_FALLOCATE */
  108. G_END_DECLS
  109. /*
  110. * vim: noexpandtab
  111. */