2 * <unistd.h> wrapper functions.
5 * Jonathan Pryor (jonpryor@vt.edu)
7 * Copyright (C) 2004-2006 Jonathan Pryor
12 #endif /* ndef _GNU_SOURCE */
14 #include <sys/types.h>
20 #include <string.h> /* for swab(3) on Mac OS X */
28 Mono_Posix_Syscall_lseek (gint32 fd, mph_off_t offset, gint32 whence)
30 mph_return_if_off_t_overflow (offset);
32 return lseek (fd, offset, whence);
36 Mono_Posix_Syscall_read (gint32 fd, void *buf, mph_size_t count)
38 mph_return_if_size_t_overflow (count);
39 return read (fd, buf, (size_t) count);
43 Mono_Posix_Syscall_write (gint32 fd, void *buf, mph_size_t count)
45 mph_return_if_size_t_overflow (count);
46 return write (fd, buf, (size_t) count);
50 Mono_Posix_Syscall_pread (gint32 fd, void *buf, mph_size_t count, mph_off_t offset)
52 mph_return_if_size_t_overflow (count);
53 mph_return_if_off_t_overflow (offset);
55 return pread (fd, buf, (size_t) count, (off_t) offset);
59 Mono_Posix_Syscall_pwrite (gint32 fd, void *buf, mph_size_t count, mph_off_t offset)
61 mph_return_if_size_t_overflow (count);
62 mph_return_if_off_t_overflow (offset);
64 return pwrite (fd, buf, (size_t) count, (off_t) offset);
68 Mono_Posix_Syscall_pipe (gint32 *reading, gint32 *writing)
70 int filedes[2] = {-1, -1};
73 if (reading == NULL || writing == NULL) {
80 *reading = filedes[0];
81 *writing = filedes[1];
86 Mono_Posix_Syscall_getcwd (char *buf, mph_size_t size)
88 mph_return_val_if_size_t_overflow (size, NULL);
89 return getcwd (buf, (size_t) size);
93 Mono_Posix_Syscall_fpathconf (int filedes, int name, int defaultError)
96 if (Mono_Posix_FromPathconfName (name, &name) == -1)
98 return fpathconf (filedes, name);
102 Mono_Posix_Syscall_pathconf (const char *path, int name, int defaultError)
104 errno = defaultError;
105 if (Mono_Posix_FromPathconfName (name, &name) == -1)
107 return pathconf (path, name);
111 Mono_Posix_Syscall_sysconf (int name, int defaultError)
113 errno = defaultError;
114 if (Mono_Posix_FromSysconfName (name, &name) == -1)
116 return sysconf (name);
121 Mono_Posix_Syscall_confstr (int name, char *buf, mph_size_t len)
123 mph_return_if_size_t_overflow (len);
124 if (Mono_Posix_FromConfstrName (name, &name) == -1)
126 return confstr (name, buf, (size_t) len);
128 #endif /* def HAVE_CONFSTR */
130 #ifdef HAVE_TTYNAME_R
132 Mono_Posix_Syscall_ttyname_r (int fd, char *buf, mph_size_t len)
134 mph_return_if_size_t_overflow (len);
135 return ttyname_r (fd, buf, (size_t) len);
137 #endif /* ndef HAVE_TTYNAME_R */
140 Mono_Posix_Syscall_readlink (const char *path, char *buf, mph_size_t len)
143 mph_return_if_size_t_overflow (len);
144 r = readlink (path, buf, (size_t) len);
145 if (r >= 0 && r < len)
150 #ifdef HAVE_READLINKAT
152 Mono_Posix_Syscall_readlinkat (int dirfd, const char *path, char *buf, mph_size_t len)
155 mph_return_if_size_t_overflow (len);
156 r = readlinkat (dirfd, path, buf, (size_t) len);
157 if (r >= 0 && r < len)
161 #endif /* def HAVE_READLINKAT */
165 Mono_Posix_Syscall_getlogin_r (char *buf, mph_size_t len)
167 mph_return_if_size_t_overflow (len);
168 return getlogin_r (buf, (size_t) len);
170 #endif /* def HAVE_GETLOGIN_R */
173 Mono_Posix_Syscall_gethostname (char *buf, mph_size_t len)
175 mph_return_if_size_t_overflow (len);
176 return gethostname (buf, (size_t) len);
181 Mono_Posix_Syscall_sethostname (const char *name, mph_size_t len)
183 mph_return_if_size_t_overflow (len);
184 return sethostname (name, (size_t) len);
186 #endif /* def HAVE_SETHOSTNAME */
190 Mono_Posix_Syscall_gethostid (void)
194 #endif /* def HAVE_GETHOSTID */
196 #ifdef HAVE_SETHOSTID
198 Mono_Posix_Syscall_sethostid (gint64 hostid)
200 mph_return_if_long_overflow (hostid);
202 sethostid ((long) hostid);
205 return sethostid ((long) hostid);
208 #endif /* def HAVE_SETHOSTID */
210 #ifdef HAVE_GETDOMAINNAME
212 Mono_Posix_Syscall_getdomainname (char *name, mph_size_t len)
214 mph_return_if_size_t_overflow (len);
215 return getdomainname (name, (size_t) len);
217 #endif /* def HAVE_GETDOMAINNAME */
219 #ifdef HAVE_SETDOMAINNAME
221 Mono_Posix_Syscall_setdomainname (const char *name, mph_size_t len)
223 mph_return_if_size_t_overflow (len);
224 return setdomainname (name, (size_t) len);
226 #endif /* def HAVE_SETDOMAINNAME */
228 /* Android implements truncate, but doesn't declare it.
229 * Result is a warning during compilation, so skip it.
231 #ifndef PLATFORM_ANDROID
233 Mono_Posix_Syscall_truncate (const char *path, mph_off_t length)
235 mph_return_if_off_t_overflow (length);
236 return truncate (path, (off_t) length);
241 Mono_Posix_Syscall_ftruncate (int fd, mph_off_t length)
243 mph_return_if_off_t_overflow (length);
244 return ftruncate (fd, (off_t) length);
249 Mono_Posix_Syscall_lockf (int fd, int cmd, mph_off_t len)
251 mph_return_if_off_t_overflow (len);
252 if (Mono_Posix_FromLockfCommand (cmd, &cmd) == -1)
254 return lockf (fd, cmd, (off_t) len);
256 #endif /* def HAVE_LOCKF */
260 Mono_Posix_Syscall_swab (void *from, void *to, mph_ssize_t n)
262 if (mph_have_long_overflow (n))
264 swab (from, to, (ssize_t) n);
267 #endif /* def HAVE_SWAB */
269 #if HAVE_SETUSERSHELL
271 Mono_Posix_Syscall_setusershell (void)
276 #endif /* def HAVE_SETUSERSHELL */
278 #if HAVE_ENDUSERSHELL
280 Mono_Posix_Syscall_endusershell (void)
285 #endif /* def HAVE_ENDUSERSHELL */
288 Mono_Posix_Syscall_sync (void)