* configure.in: Add header, structure member, and function checks as
[mono.git] / support / unistd.c
1 /*
2  * <unistd.h> wrapper functions.
3  *
4  * Authors:
5  *   Jonathan Pryor (jonpryor@vt.edu)
6  *
7  * Copyright (C) 2004-2006 Jonathan Pryor
8  */
9
10 #ifndef _GNU_SOURCE
11 #define _GNU_SOURCE
12 #endif /* ndef _GNU_SOURCE */
13
14 #include <sys/types.h>
15 #include <sys/stat.h>
16 #include <unistd.h>
17 #include <fcntl.h>
18 #include <errno.h>
19 #include <limits.h>
20 #include <string.h>     /* for swab(3) on Mac OS X */
21
22 #include "map.h"
23 #include "mph.h"
24
25 G_BEGIN_DECLS
26
27 mph_off_t
28 Mono_Posix_Syscall_lseek (gint32 fd, mph_off_t offset, gint32 whence)
29 {
30         mph_return_if_off_t_overflow (offset);
31
32         return lseek (fd, offset, whence);
33 }
34
35 mph_ssize_t
36 Mono_Posix_Syscall_read (gint32 fd, void *buf, mph_size_t count)
37 {
38         mph_return_if_size_t_overflow (count);
39         return read (fd, buf, (size_t) count);
40 }
41
42 mph_ssize_t
43 Mono_Posix_Syscall_write (gint32 fd, void *buf, mph_size_t count)
44 {
45         mph_return_if_size_t_overflow (count);
46         return write (fd, buf, (size_t) count);
47 }
48
49 mph_ssize_t
50 Mono_Posix_Syscall_pread (gint32 fd, void *buf, mph_size_t count, mph_off_t offset)
51 {
52         mph_return_if_size_t_overflow (count);
53         mph_return_if_off_t_overflow (offset);
54
55         return pread (fd, buf, (size_t) count, (off_t) offset);
56 }
57
58 mph_ssize_t
59 Mono_Posix_Syscall_pwrite (gint32 fd, void *buf, mph_size_t count, mph_off_t offset)
60 {
61         mph_return_if_size_t_overflow (count);
62         mph_return_if_off_t_overflow (offset);
63
64         return pwrite (fd, buf, (size_t) count, (off_t) offset);
65 }
66
67 gint32
68 Mono_Posix_Syscall_pipe (gint32 *reading, gint32 *writing)
69 {
70         int filedes[2] = {-1, -1};
71         int r;
72
73         if (reading == NULL || writing == NULL) {
74                 errno = EFAULT;
75                 return -1;
76         }
77
78         r = pipe (filedes);
79
80         *reading = filedes[0];
81         *writing = filedes[1];
82         return r;
83 }
84
85 void*
86 Mono_Posix_Syscall_getcwd (char *buf, mph_size_t size)
87 {
88         mph_return_val_if_size_t_overflow (size, NULL);
89         return getcwd (buf, (size_t) size);
90 }
91
92 gint64
93 Mono_Posix_Syscall_fpathconf (int filedes, int name, int defaultError)
94 {
95         errno = defaultError;
96         if (Mono_Posix_FromPathconfName (name, &name) == -1)
97                 return -1;
98         return fpathconf (filedes, name);
99 }
100
101 gint64
102 Mono_Posix_Syscall_pathconf (const char *path, int name, int defaultError)
103 {
104         errno = defaultError;
105         if (Mono_Posix_FromPathconfName (name, &name) == -1)
106                 return -1;
107         return pathconf (path, name);
108 }
109
110 gint64
111 Mono_Posix_Syscall_sysconf (int name, int defaultError)
112 {
113         errno = defaultError;
114         if (Mono_Posix_FromSysconfName (name, &name) == -1)
115                 return -1;
116         return sysconf (name);
117 }
118
119 #if HAVE_CONFSTR
120 mph_size_t
121 Mono_Posix_Syscall_confstr (int name, char *buf, mph_size_t len)
122 {
123         mph_return_if_size_t_overflow (len);
124         if (Mono_Posix_FromConfstrName (name, &name) == -1)
125                 return -1;
126         return confstr (name, buf, (size_t) len);
127 }
128 #endif  /* def HAVE_CONFSTR */
129
130 #ifdef HAVE_TTYNAME_R
131 gint32
132 Mono_Posix_Syscall_ttyname_r (int fd, char *buf, mph_size_t len)
133 {
134         mph_return_if_size_t_overflow (len);
135         return ttyname_r (fd, buf, (size_t) len);
136 }
137 #endif /* ndef HAVE_TTYNAME_R */
138
139 gint32
140 Mono_Posix_Syscall_readlink (const char *path, char *buf, mph_size_t len)
141 {
142         int r;
143         mph_return_if_size_t_overflow (len);
144         r = readlink (path, buf, (size_t) len);
145         if (r >= 0 && r < len)
146                 buf [r] = '\0';
147         return r;
148 }
149
150 #if HAVE_GETLOGIN_R
151 gint32
152 Mono_Posix_Syscall_getlogin_r (char *buf, mph_size_t len)
153 {
154         mph_return_if_size_t_overflow (len);
155         return getlogin_r (buf, (size_t) len);
156 }
157 #endif  /* def HAVE_GETLOGIN_R */
158
159 gint32
160 Mono_Posix_Syscall_gethostname (char *buf, mph_size_t len)
161 {
162         mph_return_if_size_t_overflow (len);
163         return gethostname (buf, (size_t) len);
164 }
165
166 #if HAVE_SETHOSTNAME
167 gint32
168 Mono_Posix_Syscall_sethostname (const char *name, mph_size_t len)
169 {
170         mph_return_if_size_t_overflow (len);
171         return sethostname (name, (size_t) len);
172 }
173 #endif  /* def HAVE_SETHOSTNAME */
174
175 #if HAVE_GETHOSTID
176 gint64
177 Mono_Posix_Syscall_gethostid (void)
178 {
179         return gethostid ();
180 }
181 #endif  /* def HAVE_GETHOSTID */
182
183 #ifdef HAVE_SETHOSTID
184 gint32
185 Mono_Posix_Syscall_sethostid (gint64 hostid)
186 {
187         mph_return_if_long_overflow (hostid);
188 #ifdef MPH_ON_BSD
189         sethostid ((long) hostid);
190         return 0;
191 #else
192         return sethostid ((long) hostid);
193 #endif
194 }
195 #endif /* def HAVE_SETHOSTID */
196
197 #ifdef HAVE_GETDOMAINNAME
198 gint32
199 Mono_Posix_Syscall_getdomainname (char *name, mph_size_t len)
200 {
201         mph_return_if_size_t_overflow (len);
202         return getdomainname (name, (size_t) len);
203 }
204 #endif /* def HAVE_GETDOMAINNAME */
205
206 #ifdef HAVE_SETDOMAINNAME
207 gint32
208 Mono_Posix_Syscall_setdomainname (const char *name, mph_size_t len)
209 {
210         mph_return_if_size_t_overflow (len);
211         return setdomainname (name, (size_t) len);
212 }
213 #endif /* def HAVE_SETDOMAINNAME */
214
215 /* Android implements truncate, but doesn't declare it.
216  * Result is a warning during compilation, so skip it.
217  */
218 #ifndef PLATFORM_ANDROID
219 gint32
220 Mono_Posix_Syscall_truncate (const char *path, mph_off_t length)
221 {
222         mph_return_if_off_t_overflow (length);
223         return truncate (path, (off_t) length);
224 }
225 #endif
226
227 gint32
228 Mono_Posix_Syscall_ftruncate (int fd, mph_off_t length)
229 {
230         mph_return_if_off_t_overflow (length);
231         return ftruncate (fd, (off_t) length);
232 }
233
234 #if HAVE_LOCKF
235 gint32
236 Mono_Posix_Syscall_lockf (int fd, int cmd, mph_off_t len)
237 {
238         mph_return_if_off_t_overflow (len);
239         if (Mono_Posix_FromLockfCommand (cmd, &cmd) == -1)
240                 return -1;
241         return lockf (fd, cmd, (off_t) len);
242 }
243 #endif  /* def HAVE_LOCKF */
244
245 #if HAVE_SWAB
246 int
247 Mono_Posix_Syscall_swab (void *from, void *to, mph_ssize_t n)
248 {
249         if (mph_have_long_overflow (n))
250                 return -1;
251         swab (from, to, (ssize_t) n);
252         return 0;
253 }
254 #endif  /* def HAVE_SWAB */
255
256 #if HAVE_SETUSERSHELL
257 int
258 Mono_Posix_Syscall_setusershell (void)
259 {
260         setusershell ();
261         return 0;
262 }
263 #endif  /* def HAVE_SETUSERSHELL */
264
265 #if HAVE_ENDUSERSHELL
266 int
267 Mono_Posix_Syscall_endusershell (void)
268 {
269         endusershell ();
270         return 0;
271 }
272 #endif  /* def HAVE_ENDUSERSHELL */
273
274 int
275 Mono_Posix_Syscall_sync (void)
276 {
277         sync ();
278         return 0;
279 }
280
281
282 G_END_DECLS
283
284 /*
285  * vim: noexpandtab
286  */