2 * <unistd.h> wrapper functions.
5 * Jonathan Pryor (jonpryor@vt.edu)
7 * Copyright (C) 2004-2006 Jonathan Pryor
14 #endif /* ndef _GNU_SOURCE */
16 #include <sys/types.h>
22 #include <string.h> /* for swab(3) on Mac OS X */
30 Mono_Posix_Syscall_lseek (gint32 fd
, mph_off_t offset
, gint32 whence
)
32 mph_return_if_off_t_overflow (offset
);
34 return lseek (fd
, offset
, whence
);
38 Mono_Posix_Syscall_read (gint32 fd
, void *buf
, mph_size_t count
)
40 mph_return_if_size_t_overflow (count
);
41 return read (fd
, buf
, (size_t) count
);
45 Mono_Posix_Syscall_write (gint32 fd
, void *buf
, mph_size_t count
)
47 mph_return_if_size_t_overflow (count
);
48 return write (fd
, buf
, (size_t) count
);
52 Mono_Posix_Syscall_pread (gint32 fd
, void *buf
, mph_size_t count
, mph_off_t offset
)
54 mph_return_if_size_t_overflow (count
);
55 mph_return_if_off_t_overflow (offset
);
57 return pread (fd
, buf
, (size_t) count
, (off_t
) offset
);
61 Mono_Posix_Syscall_pwrite (gint32 fd
, void *buf
, mph_size_t count
, mph_off_t offset
)
63 mph_return_if_size_t_overflow (count
);
64 mph_return_if_off_t_overflow (offset
);
66 return pwrite (fd
, buf
, (size_t) count
, (off_t
) offset
);
70 Mono_Posix_Syscall_pipe (gint32
*reading
, gint32
*writing
)
72 int filedes
[2] = {-1, -1};
75 if (reading
== NULL
|| writing
== NULL
) {
82 *reading
= filedes
[0];
83 *writing
= filedes
[1];
88 Mono_Posix_Syscall_getcwd (char *buf
, mph_size_t size
)
90 mph_return_val_if_size_t_overflow (size
, NULL
);
91 return getcwd (buf
, (size_t) size
);
95 Mono_Posix_Syscall_fpathconf (int filedes
, int name
, int defaultError
)
98 if (Mono_Posix_FromPathconfName (name
, &name
) == -1)
100 return fpathconf (filedes
, name
);
104 Mono_Posix_Syscall_pathconf (const char *path
, int name
, int defaultError
)
106 errno
= defaultError
;
107 if (Mono_Posix_FromPathconfName (name
, &name
) == -1)
109 return pathconf (path
, name
);
113 Mono_Posix_Syscall_sysconf (int name
, int defaultError
)
115 errno
= defaultError
;
116 if (Mono_Posix_FromSysconfName (name
, &name
) == -1)
118 return sysconf (name
);
123 Mono_Posix_Syscall_confstr (int name
, char *buf
, mph_size_t len
)
125 mph_return_if_size_t_overflow (len
);
126 if (Mono_Posix_FromConfstrName (name
, &name
) == -1)
128 return confstr (name
, buf
, (size_t) len
);
130 #endif /* def HAVE_CONFSTR */
132 #ifdef HAVE_TTYNAME_R
134 Mono_Posix_Syscall_ttyname_r (int fd
, char *buf
, mph_size_t len
)
136 mph_return_if_size_t_overflow (len
);
137 return ttyname_r (fd
, buf
, (size_t) len
);
139 #endif /* ndef HAVE_TTYNAME_R */
142 Mono_Posix_Syscall_readlink (const char *path
, unsigned char *buf
, mph_size_t len
)
145 mph_return_if_size_t_overflow (len
);
146 r
= readlink (path
, (char*) buf
, (size_t) len
);
147 if (r
>= 0 && r
< len
)
152 #ifdef HAVE_READLINKAT
154 Mono_Posix_Syscall_readlinkat (int dirfd
, const char *path
, unsigned char *buf
, mph_size_t len
)
157 mph_return_if_size_t_overflow (len
);
158 r
= readlinkat (dirfd
, path
, (char*) buf
, (size_t) len
);
159 if (r
>= 0 && r
< len
)
163 #endif /* def HAVE_READLINKAT */
167 Mono_Posix_Syscall_getlogin_r (char *buf
, mph_size_t len
)
169 mph_return_if_size_t_overflow (len
);
170 return getlogin_r (buf
, (size_t) len
);
172 #endif /* def HAVE_GETLOGIN_R */
175 Mono_Posix_Syscall_gethostname (char *buf
, mph_size_t len
)
177 mph_return_if_size_t_overflow (len
);
178 return gethostname (buf
, (size_t) len
);
183 Mono_Posix_Syscall_sethostname (const char *name
, mph_size_t len
)
185 mph_return_if_size_t_overflow (len
);
186 return sethostname (name
, (size_t) len
);
188 #endif /* def HAVE_SETHOSTNAME */
192 Mono_Posix_Syscall_gethostid (void)
196 #endif /* def HAVE_GETHOSTID */
198 #ifdef HAVE_SETHOSTID
200 Mono_Posix_Syscall_sethostid (gint64 hostid
)
202 mph_return_if_long_overflow (hostid
);
204 sethostid ((long) hostid
);
207 return sethostid ((long) hostid
);
210 #endif /* def HAVE_SETHOSTID */
212 #ifdef HAVE_GETDOMAINNAME
214 Mono_Posix_Syscall_getdomainname (char *name
, mph_size_t len
)
216 mph_return_if_size_t_overflow (len
);
217 return getdomainname (name
, (size_t) len
);
219 #endif /* def HAVE_GETDOMAINNAME */
221 #ifdef HAVE_SETDOMAINNAME
223 Mono_Posix_Syscall_setdomainname (const char *name
, mph_size_t len
)
225 mph_return_if_size_t_overflow (len
);
226 return setdomainname (name
, (size_t) len
);
228 #endif /* def HAVE_SETDOMAINNAME */
230 /* Android implements truncate, but doesn't declare it.
231 * Result is a warning during compilation, so skip it.
233 #ifndef PLATFORM_ANDROID
235 Mono_Posix_Syscall_truncate (const char *path
, mph_off_t length
)
237 mph_return_if_off_t_overflow (length
);
238 return truncate (path
, (off_t
) length
);
243 Mono_Posix_Syscall_ftruncate (int fd
, mph_off_t length
)
245 mph_return_if_off_t_overflow (length
);
246 return ftruncate (fd
, (off_t
) length
);
251 Mono_Posix_Syscall_lockf (int fd
, int cmd
, mph_off_t len
)
253 mph_return_if_off_t_overflow (len
);
254 if (Mono_Posix_FromLockfCommand (cmd
, &cmd
) == -1)
256 return lockf (fd
, cmd
, (off_t
) len
);
258 #endif /* def HAVE_LOCKF */
262 Mono_Posix_Syscall_swab (void *from
, void *to
, mph_ssize_t n
)
264 if (mph_have_long_overflow (n
))
266 swab (from
, to
, (ssize_t
) n
);
269 #endif /* def HAVE_SWAB */
271 #if HAVE_SETUSERSHELL
273 Mono_Posix_Syscall_setusershell (void)
278 #endif /* def HAVE_SETUSERSHELL */
280 #if HAVE_ENDUSERSHELL
282 Mono_Posix_Syscall_endusershell (void)
287 #endif /* def HAVE_ENDUSERSHELL */
290 Mono_Posix_Syscall_sync (void)