2010-02-05 Rodrigo Kumpera <rkumpera@novell.com>
[mono.git] / support / unistd.c
blob209c0c1c450c1bae02b7fec90dbdcae168d1d94c
1 /*
2 * <unistd.h> wrapper functions.
4 * Authors:
5 * Jonathan Pryor (jonpryor@vt.edu)
7 * Copyright (C) 2004-2006 Jonathan Pryor
8 */
10 #ifndef _GNU_SOURCE
11 #define _GNU_SOURCE
12 #endif /* ndef _GNU_SOURCE */
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 */
22 #include "map.h"
23 #include "mph.h"
25 G_BEGIN_DECLS
27 mph_off_t
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);
35 mph_ssize_t
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);
42 mph_ssize_t
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);
49 mph_ssize_t
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);
58 mph_ssize_t
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);
67 gint32
68 Mono_Posix_Syscall_pipe (gint32 *reading, gint32 *writing)
70 int filedes[2] = {-1, -1};
71 int r;
73 if (reading == NULL || writing == NULL) {
74 errno = EFAULT;
75 return -1;
78 r = pipe (filedes);
80 *reading = filedes[0];
81 *writing = filedes[1];
82 return r;
85 void*
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);
92 gint64
93 Mono_Posix_Syscall_fpathconf (int filedes, int name, int defaultError)
95 errno = defaultError;
96 if (Mono_Posix_FromPathconfName (name, &name) == -1)
97 return -1;
98 return fpathconf (filedes, name);
101 gint64
102 Mono_Posix_Syscall_pathconf (const char *path, int name, int defaultError)
104 errno = defaultError;
105 if (Mono_Posix_FromPathconfName (name, &name) == -1)
106 return -1;
107 return pathconf (path, name);
110 gint64
111 Mono_Posix_Syscall_sysconf (int name, int defaultError)
113 errno = defaultError;
114 if (Mono_Posix_FromSysconfName (name, &name) == -1)
115 return -1;
116 return sysconf (name);
119 mph_size_t
120 Mono_Posix_Syscall_confstr (int name, char *buf, mph_size_t len)
122 mph_return_if_size_t_overflow (len);
123 if (Mono_Posix_FromConfstrName (name, &name) == -1)
124 return -1;
125 return confstr (name, buf, (size_t) len);
128 #ifdef HAVE_TTYNAME_R
129 gint32
130 Mono_Posix_Syscall_ttyname_r (int fd, char *buf, mph_size_t len)
132 mph_return_if_size_t_overflow (len);
133 return ttyname_r (fd, buf, (size_t) len);
135 #endif /* ndef HAVE_TTYNAME_R */
137 gint32
138 Mono_Posix_Syscall_readlink (const char *path, char *buf, mph_size_t len)
140 int r;
141 mph_return_if_size_t_overflow (len);
142 r = readlink (path, buf, (size_t) len);
143 if (r >= 0 && r < len)
144 buf [r] = '\0';
145 return r;
148 gint32
149 Mono_Posix_Syscall_getlogin_r (char *buf, mph_size_t len)
151 mph_return_if_size_t_overflow (len);
152 return getlogin_r (buf, (size_t) len);
155 gint32
156 Mono_Posix_Syscall_gethostname (char *buf, mph_size_t len)
158 mph_return_if_size_t_overflow (len);
159 return gethostname (buf, (size_t) len);
162 gint32
163 Mono_Posix_Syscall_sethostname (const char *name, mph_size_t len)
165 mph_return_if_size_t_overflow (len);
166 return sethostname (name, (size_t) len);
169 gint64
170 Mono_Posix_Syscall_gethostid (void)
172 return gethostid ();
175 #ifdef HAVE_SETHOSTID
176 gint32
177 Mono_Posix_Syscall_sethostid (gint64 hostid)
179 mph_return_if_long_overflow (hostid);
180 #ifdef MPH_ON_BSD
181 sethostid ((long) hostid);
182 return 0;
183 #else
184 return sethostid ((long) hostid);
185 #endif
187 #endif /* def HAVE_SETHOSTID */
189 #ifdef HAVE_GETDOMAINNAME
190 gint32
191 Mono_Posix_Syscall_getdomainname (char *name, mph_size_t len)
193 mph_return_if_size_t_overflow (len);
194 return getdomainname (name, (size_t) len);
196 #endif /* def HAVE_GETDOMAINNAME */
198 #ifdef HAVE_SETDOMAINNAME
199 gint32
200 Mono_Posix_Syscall_setdomainname (const char *name, mph_size_t len)
202 mph_return_if_size_t_overflow (len);
203 return setdomainname (name, (size_t) len);
205 #endif /* def HAVE_SETDOMAINNAME */
207 gint32
208 Mono_Posix_Syscall_truncate (const char *path, mph_off_t length)
210 mph_return_if_off_t_overflow (length);
211 return truncate (path, (off_t) length);
214 gint32
215 Mono_Posix_Syscall_ftruncate (int fd, mph_off_t length)
217 mph_return_if_off_t_overflow (length);
218 return ftruncate (fd, (off_t) length);
221 gint32
222 Mono_Posix_Syscall_lockf (int fd, int cmd, mph_off_t len)
224 mph_return_if_off_t_overflow (len);
225 if (Mono_Posix_FromLockfCommand (cmd, &cmd) == -1)
226 return -1;
227 return lockf (fd, cmd, (off_t) len);
231 Mono_Posix_Syscall_swab (void *from, void *to, mph_ssize_t n)
233 if (mph_have_long_overflow (n))
234 return -1;
235 swab (from, to, (ssize_t) n);
236 return 0;
240 Mono_Posix_Syscall_setusershell (void)
242 setusershell ();
243 return 0;
247 Mono_Posix_Syscall_endusershell (void)
249 endusershell ();
250 return 0;
254 Mono_Posix_Syscall_sync (void)
256 sync ();
257 return 0;
261 G_END_DECLS
264 * vim: noexpandtab