Solaris/Irix compatibility patches.
[gcc.git] / libgo / go / syscall / libcall_posix.go
1 // Copyright 2011 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 // POSIX library calls.
6 // This file is compiled as ordinary Go code,
7 // but it is also input to mksyscall,
8 // which parses the //sys lines and generates library call stubs.
9 // Note that sometimes we use a lowercase //sys name and
10 // wrap it in our own nicer implementation.
11
12 package syscall
13
14 import "unsafe"
15
16 /*
17 * Wrapped
18 */
19
20 //sysnb pipe(p *[2]int) (errno int)
21 //pipe(p *[2]int) int
22 func Pipe(p []int) (errno int) {
23 if len(p) != 2 {
24 return EINVAL
25 }
26 var pp [2]int
27 errno = pipe(&pp)
28 p[0] = pp[0]
29 p[1] = pp[1]
30 return
31 }
32
33 //sys utimes(path string, times *[2]Timeval) (errno int)
34 //utimes(path *byte, times *[2]Timeval) int
35 func Utimes(path string, tv []Timeval) (errno int) {
36 if len(tv) != 2 {
37 return EINVAL
38 }
39 return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
40 }
41
42 //sys getcwd(buf *byte, size Size_t) (errno int)
43 //getcwd(buf *byte, size Size_t) *byte
44
45 const ImplementsGetwd = true
46
47 func Getwd() (ret string, errno int) {
48 for len := Size_t(4096); ; len *= 2 {
49 b := make([]byte, len)
50 err := getcwd(&b[0], len)
51 if err == 0 {
52 i := 0;
53 for b[i] != 0 {
54 i++;
55 }
56 return string(b[0:i]), 0;
57 }
58 if err != ERANGE {
59 return "", err
60 }
61 }
62 }
63
64 //sysnb getgroups(size int, list *Gid_t) (nn int, errno int)
65 //getgroups(size int, list *Gid_t) int
66
67 func Getgroups() (gids []int, errno int) {
68 n, err := getgroups(0, nil)
69 if err != 0 {
70 return nil, errno
71 }
72 if n == 0 {
73 return nil, 0
74 }
75
76 // Sanity check group count. Max is 1<<16 on Linux.
77 if n < 0 || n > 1<<20 {
78 return nil, EINVAL
79 }
80
81 a := make([]Gid_t, n)
82 n, err = getgroups(n, &a[0])
83 if err != 0 {
84 return nil, errno
85 }
86 gids = make([]int, n)
87 for i, v := range a[0:n] {
88 gids[i] = int(v)
89 }
90 return
91 }
92
93 //sysnb setgroups(n int, list *Gid_t) (errno int)
94 //setgroups(n Size_t, list *Gid_t) int
95
96 func Setgroups(gids []int) (errno int) {
97 if len(gids) == 0 {
98 return setgroups(0, nil)
99 }
100
101 a := make([]Gid_t, len(gids))
102 for i, v := range gids {
103 a[i] = Gid_t(v)
104 }
105 return setgroups(len(a), &a[0])
106 }
107
108 type WaitStatus uint32
109
110 // The WaitStatus methods are implemented in C, to pick up the macros
111 // #defines in <sys/wait.h>.
112
113 func (w WaitStatus) Exited() bool
114 func (w WaitStatus) Signaled() bool
115 func (w WaitStatus) Stopped() bool
116 func (w WaitStatus) Continued() bool
117 func (w WaitStatus) CoreDump() bool
118 func (w WaitStatus) ExitStatus() int
119 func (w WaitStatus) Signal() int
120 func (w WaitStatus) StopSignal() int
121 func (w WaitStatus) TrapCause() int
122
123 //sys Mkfifo(path string, mode uint32) (errno int)
124 //mkfifo(path *byte, mode Mode_t) int
125
126 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, errno int)
127 //select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) int
128
129 const nfdbits = unsafe.Sizeof(fds_bits_type) * 8
130
131 type FdSet struct {
132 Bits [(FD_SETSIZE + nfdbits - 1) / nfdbits]fds_bits_type
133 }
134
135 func FDSet(fd int, set *FdSet) {
136 set.Bits[fd / nfdbits] |= (1 << (uint)(fd % nfdbits))
137 }
138
139 func FDClr(fd int, set *FdSet) {
140 set.Bits[fd / nfdbits] &^= (1 << (uint)(fd % nfdbits))
141 }
142
143 func FDIsSet(fd int, set *FdSet) bool {
144 if set.Bits[fd / nfdbits] & (1 << (uint)(fd % nfdbits)) != 0 {
145 return true
146 } else {
147 return false
148 }
149 }
150
151 func FDZero(set *FdSet) {
152 for i := range set.Bits {
153 set.Bits[i] = 0
154 }
155 }
156
157 //sys Access(path string, mode uint32) (errno int)
158 //access(path *byte, mode int) int
159
160 //sys Chdir(path string) (errno int)
161 //chdir(path *byte) int
162
163 //sys Chmod(path string, mode uint32) (errno int)
164 //chmod(path *byte, mode Mode_t) int
165
166 //sys Chown(path string, uid int, gid int) (errno int)
167 //chown(path *byte, uid Uid_t, gid Gid_t) int
168
169 //sys Chroot(path string) (errno int)
170 //chroot(path *byte) int
171
172 //sys Close(fd int) (errno int)
173 //close(fd int) int
174
175 //sys Creat(path string, mode uint32) (fd int, errno int)
176 //creat(path *byte, mode Mode_t) int
177
178 //sysnb Dup(oldfd int) (fd int, errno int)
179 //dup(oldfd int) int
180
181 //sysnb Dup2(oldfd int, newfd int) (fd int, errno int)
182 //dup2(oldfd int, newfd int) int
183
184 //sys Exit(code int)
185 //exit(code int)
186
187 //sys Fchdir(fd int) (errno int)
188 //fchdir(fd int) int
189
190 //sys Fchmod(fd int, mode uint32) (errno int)
191 //fchmod(fd int, mode Mode_t) int
192
193 //sys Fchown(fd int, uid int, gid int) (errno int)
194 //fchown(fd int, uid Uid_t, gid Gid_t) int
195
196 //sys fcntl(fd int, cmd int, arg int) (val int, errno int)
197 //fcntl(fd int, cmd int, arg int) int
198
199 //sys Fdatasync(fd int) (errno int)
200 //fdatasync(fd int) int
201
202 //sys Fsync(fd int) (errno int)
203 //fsync(fd int) int
204
205 //sysnb Getegid() (egid int)
206 //getegid() Gid_t
207
208 //sysnb Geteuid() (euid int)
209 //geteuid() Uid_t
210
211 //sysnb Getgid() (gid int)
212 //getgid() Gid_t
213
214 //sysnb Getpagesize() (pagesize int)
215 //getpagesize() int
216
217 //sysnb Getpgid(pid int) (pgid int, errno int)
218 //getpgid(pid Pid_t) Pid_t
219
220 //sysnb Getpgrp() (pid int)
221 //getpgrp() Pid_t
222
223 //sysnb Getpid() (pid int)
224 //getpid() Pid_t
225
226 //sysnb Getppid() (ppid int)
227 //getppid() Pid_t
228
229 // FIXME: mksysinfo Rlimit
230 // //sysnb Getrlimit(resource int, rlim *Rlimit) (errno int)
231 // //getrlimit(resource int, rlim *Rlimit) int
232
233 //sysnb Getrusage(who int, rusage *Rusage) (errno int)
234 //getrusage(who int, rusage *Rusage) int
235
236 //sysnb gettimeofday(tv *Timeval, tz *byte) (errno int)
237 //gettimeofday(tv *Timeval, tz *byte) int
238 func Gettimeofday(tv *Timeval) (errno int) {
239 return gettimeofday(tv, nil)
240 }
241
242 //sysnb Getuid() (uid int)
243 //getuid() Uid_t
244
245 //sysnb Kill(pid int, sig int) (errno int)
246 //kill(pid Pid_t, sig int) int
247
248 //sys Lchown(path string, uid int, gid int) (errno int)
249 //lchown(path *byte, uid Uid_t, gid Gid_t) int
250
251 //sys Link(oldpath string, newpath string) (errno int)
252 //link(oldpath *byte, newpath *byte) int
253
254 //sys Mkdir(path string, mode uint32) (errno int)
255 //mkdir(path *byte, mode Mode_t) int
256
257 //sys Mknod(path string, mode uint32, dev int) (errno int)
258 //mknod(path *byte, mode Mode_t, dev _dev_t) int
259
260 //sys Mount(source string, target string, fstype string, flags int, data string) (errno int)
261 //mount(source *byte, target *byte, fstype *byte, flags _C_long, data *byte) int
262
263 //sys Nanosleep(time *Timespec, leftover *Timespec) (errno int)
264 //nanosleep(time *Timespec, leftover *Timespec) int
265
266 //sys Pause() (errno int)
267 //pause() int
268
269 //sys Read(fd int, p []byte) (n int, errno int)
270 //read(fd int, buf *byte, count Size_t) Ssize_t
271
272 //sys Readlink(path string, buf []byte) (n int, errno int)
273 //readlink(path *byte, buf *byte, bufsiz Size_t) Ssize_t
274
275 //sys Rename(oldpath string, newpath string) (errno int)
276 //rename(oldpath *byte, newpath *byte) int
277
278 //sys Rmdir(path string) (errno int)
279 //rmdir(path *byte) int
280
281 //sys Setdomainname(p []byte) (errno int)
282 //setdomainname(name *byte, len Size_t) int
283
284 //sys Sethostname(p []byte) (errno int)
285 //sethostname(name *byte, len Size_t) int
286
287 //sysnb Setgid(gid int) (errno int)
288 //setgid(gid Gid_t) int
289
290 //sysnb Setregid(rgid int, egid int) (errno int)
291 //setregid(rgid Gid_t, egid Gid_t) int
292
293 //sysnb Setpgid(pid int, pgid int) (errno int)
294 //setpgid(pid Pid_t, pgid Pid_t) int
295
296 //sysnb Setreuid(ruid int, euid int) (errno int)
297 //setreuid(ruid Uid_t, euid Uid_t) int
298
299 // FIXME: mksysinfo Rlimit
300 // //sysnb Setrlimit(resource int, rlim *Rlimit) (errno int)
301 // //setrlimit(resource int, rlim *Rlimit) int
302
303 //sysnb Setsid() (pid int, errno int)
304 //setsid() Pid_t
305
306 //sysnb settimeofday(tv *Timeval, tz *byte) (errno int)
307 //settimeofday(tv *Timeval, tz *byte) int
308
309 func Settimeofday(tv *Timeval) (errno int) {
310 return settimeofday(tv, nil)
311 }
312
313 //sysnb Setuid(uid int) (errno int)
314 //setuid(uid Uid_t) int
315
316 //sys Symlink(oldpath string, newpath string) (errno int)
317 //symlink(oldpath *byte, newpath *byte) int
318
319 //sys Sync()
320 //sync()
321
322 // FIXME: mksysinfo Time_t
323 // //sysnb Time(t *Time_t) (tt Time_t, errno int)
324 // //time(t *Time_t) Time_t
325
326 // FIXME: mksysinfo Tms
327 // //sysnb Times(tms *Tms) (ticks uintptr, errno int)
328 // //times(tms *Tms) _clock_t
329
330 //sysnb Umask(mask int) (oldmask int)
331 //umask(mask Mode_t) Mode_t
332
333 //sys Unlink(path string) (errno int)
334 //unlink(path *byte) int
335
336 // FIXME: mksysinfo Utimbuf
337 // //sys Utime(path string, buf *Utimbuf) (errno int)
338 // //utime(path *byte, buf *Utimbuf) int
339
340 //sys Write(fd int, p []byte) (n int, errno int)
341 //write(fd int, buf *byte, count Size_t) Ssize_t
342
343 //sys munmap(addr uintptr, length uintptr) (errno int)
344 //munmap(addr *byte, length Size_t) int
345
346 //sys Madvise(b []byte, advice int) (errno int)
347 //madvise(addr *byte, len Size_t, advice int) int
348
349 //sys Mprotect(b []byte, prot int) (errno int)
350 //mprotect(addr *byte, len Size_t, prot int) int
351
352 //sys Mlock(b []byte) (errno int)
353 //mlock(addr *byte, len Size_t) int
354
355 //sys Munlock(b []byte) (errno int)
356 //munlock(addr *byte, len Size_t) int
357
358 //sys Mlockall(flags int) (errno int)
359 //mlockall(flags int) int
360
361 //sys Munlockall() (errno int)
362 //munlockall() int
363
364 func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
365
366 func NsecToTimespec(nsec int64) (ts Timespec) {
367 ts.Sec = Timespec_sec_t(nsec / 1e9)
368 ts.Nsec = Timespec_nsec_t(nsec % 1e9)
369 return
370 }
371
372 func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 }
373
374 func NsecToTimeval(nsec int64) (tv Timeval) {
375 nsec += 999 // round up to microsecond
376 tv.Sec = Timeval_sec_t(nsec / 1e9)
377 tv.Usec = Timeval_usec_t(nsec % 1e9 / 1e3)
378 return
379 }