Fix "PR c++/92804 ICE trying to use concept as a nested-name-specifier"
[official-gcc.git] / libgo / go / syscall / libcall_posix.go
blob31d6bf19f7d777b6a8af22d5f9568c18ad13b774
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.
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.
12 package syscall
14 import "unsafe"
17 * Wrapped
20 //sysnb pipe(p *[2]_C_int) (err error)
21 //pipe(p *[2]_C_int) _C_int
22 func Pipe(p []int) (err error) {
23 if len(p) != 2 {
24 return EINVAL
26 var pp [2]_C_int
27 err = pipe(&pp)
28 p[0] = int(pp[0])
29 p[1] = int(pp[1])
30 return
33 //sys utimes(path string, times *[2]Timeval) (err error)
34 //utimes(path *byte, times *[2]Timeval) _C_int
35 func Utimes(path string, tv []Timeval) (err error) {
36 if len(tv) != 2 {
37 return EINVAL
39 return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
42 //sys getcwd(buf *byte, size Size_t) (err error)
43 //getcwd(buf *byte, size Size_t) *byte
45 const ImplementsGetwd = true
47 func Getwd() (ret string, err error) {
48 for len := Size_t(4096); ; len *= 2 {
49 b := make([]byte, len)
50 err := getcwd(&b[0], len)
51 if err == nil {
52 i := 0
53 for b[i] != 0 {
54 i++
56 return string(b[0:i]), nil
58 if err != ERANGE {
59 return "", err
64 func Getcwd(buf []byte) (n int, err error) {
65 err = getcwd(&buf[0], Size_t(len(buf)))
66 if err == nil {
67 i := 0
68 for buf[i] != 0 {
69 i++
71 n = i + 1
73 return
76 //sysnb getgroups(size int, list *Gid_t) (nn int, err error)
77 //getgroups(size _C_int, list *Gid_t) _C_int
79 func Getgroups() (gids []int, err error) {
80 n, err := getgroups(0, nil)
81 if err != nil {
82 return nil, err
84 if n == 0 {
85 return nil, nil
88 // Sanity check group count. Max is 1<<16 on GNU/Linux.
89 if n < 0 || n > 1<<20 {
90 return nil, EINVAL
93 a := make([]Gid_t, n)
94 n, err = getgroups(n, &a[0])
95 if err != nil {
96 return nil, err
98 gids = make([]int, n)
99 for i, v := range a[0:n] {
100 gids[i] = int(v)
102 return
105 //sysnb setgroups(n int, list *Gid_t) (err error)
106 //setgroups(n Size_t, list *Gid_t) _C_int
108 func Setgroups(gids []int) (err error) {
109 if len(gids) == 0 {
110 return setgroups(0, nil)
113 a := make([]Gid_t, len(gids))
114 for i, v := range gids {
115 a[i] = Gid_t(v)
117 return setgroups(len(a), &a[0])
120 type WaitStatus uint32
122 // The WaitStatus methods are implemented in C, to pick up the macros
123 // #defines in <sys/wait.h>.
125 func (w WaitStatus) Exited() bool
126 func (w WaitStatus) Signaled() bool
127 func (w WaitStatus) Stopped() bool
128 func (w WaitStatus) Continued() bool
129 func (w WaitStatus) CoreDump() bool
130 func (w WaitStatus) ExitStatus() int
131 func (w WaitStatus) Signal() Signal
132 func (w WaitStatus) StopSignal() Signal
133 func (w WaitStatus) TrapCause() int
135 //sys Mkfifo(path string, mode uint32) (err error)
136 //mkfifo(path *byte, mode Mode_t) _C_int
138 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
139 //select(nfd _C_int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) _C_int
141 const nfdbits = int(unsafe.Sizeof(fds_bits_type(0)) * 8)
143 type FdSet struct {
144 Bits [(FD_SETSIZE + nfdbits - 1) / nfdbits]fds_bits_type
147 func FDSet(fd int, set *FdSet) {
148 set.Bits[fd/nfdbits] |= (1 << (uint)(fd%nfdbits))
151 func FDClr(fd int, set *FdSet) {
152 set.Bits[fd/nfdbits] &^= (1 << (uint)(fd%nfdbits))
155 func FDIsSet(fd int, set *FdSet) bool {
156 if set.Bits[fd/nfdbits]&(1<<(uint)(fd%nfdbits)) != 0 {
157 return true
158 } else {
159 return false
163 func FDZero(set *FdSet) {
164 for i := range set.Bits {
165 set.Bits[i] = 0
169 //sys Access(path string, mode uint32) (err error)
170 //access(path *byte, mode _C_int) _C_int
172 //sys Chdir(path string) (err error)
173 //chdir(path *byte) _C_int
175 //sys Chmod(path string, mode uint32) (err error)
176 //chmod(path *byte, mode Mode_t) _C_int
178 //sys Chown(path string, uid int, gid int) (err error)
179 //chown(path *byte, uid Uid_t, gid Gid_t) _C_int
181 //sys Chroot(path string) (err error)
182 //chroot(path *byte) _C_int
184 //sys Close(fd int) (err error)
185 //close(fd _C_int) _C_int
187 //sysnb Dup(oldfd int) (fd int, err error)
188 //dup(oldfd _C_int) _C_int
190 //sysnb Dup2(oldfd int, newfd int) (err error)
191 //dup2(oldfd _C_int, newfd _C_int) _C_int
193 //sys Fchdir(fd int) (err error)
194 //fchdir(fd _C_int) _C_int
196 //sys Fchmod(fd int, mode uint32) (err error)
197 //fchmod(fd _C_int, mode Mode_t) _C_int
199 //sys Fchown(fd int, uid int, gid int) (err error)
200 //fchown(fd _C_int, uid Uid_t, gid Gid_t) _C_int
202 //sys fcntl(fd int, cmd int, arg int) (val int, err error)
203 //__go_fcntl(fd _C_int, cmd _C_int, arg _C_int) _C_int
205 //sys FcntlFlock(fd uintptr, cmd int, lk *Flock_t) (err error)
206 //__go_fcntl_flock(fd _C_int, cmd _C_int, arg *Flock_t) _C_int
208 //sys Fdatasync(fd int) (err error)
209 //fdatasync(fd _C_int) _C_int
211 //sys Fsync(fd int) (err error)
212 //fsync(fd _C_int) _C_int
214 //sysnb Getegid() (egid int)
215 //getegid() Gid_t
217 //sysnb Geteuid() (euid int)
218 //geteuid() Uid_t
220 //sysnb Getgid() (gid int)
221 //getgid() Gid_t
223 //sysnb Getpgid(pid int) (pgid int, err error)
224 //getpgid(pid Pid_t) Pid_t
226 //sysnb Getpgrp() (pid int)
227 //getpgrp() Pid_t
229 //sysnb Getpid() (pid int)
230 //getpid() Pid_t
232 //sysnb Getppid() (ppid int)
233 //getppid() Pid_t
235 //sys Getpriority(which int, who int) (prio int, err error)
236 //getpriority(which _C_int, who _C_int) _C_int
238 //sysnb Getrusage(who int, rusage *Rusage) (err error)
239 //getrusage(who _C_int, rusage *Rusage) _C_int
241 //sysnb gettimeofday(tv *Timeval, tz *byte) (err error)
242 //gettimeofday(tv *Timeval, tz *byte) _C_int
243 func Gettimeofday(tv *Timeval) (err error) {
244 return gettimeofday(tv, nil)
247 //sysnb Getuid() (uid int)
248 //getuid() Uid_t
250 //sysnb Kill(pid int, sig Signal) (err error)
251 //kill(pid Pid_t, sig _C_int) _C_int
253 //sys Lchown(path string, uid int, gid int) (err error)
254 //lchown(path *byte, uid Uid_t, gid Gid_t) _C_int
256 //sys Link(oldpath string, newpath string) (err error)
257 //link(oldpath *byte, newpath *byte) _C_int
259 //sys Mkdir(path string, mode uint32) (err error)
260 //mkdir(path *byte, mode Mode_t) _C_int
262 //sys Mknod(path string, mode uint32, dev int) (err error)
263 //mknod(path *byte, mode Mode_t, dev _dev_t) _C_int
265 //sys Nanosleep(time *Timespec, leftover *Timespec) (err error)
266 //nanosleep(time *Timespec, leftover *Timespec) _C_int
268 //sys Pause() (err error)
269 //pause() _C_int
271 //sys read(fd int, p []byte) (n int, err error)
272 //read(fd _C_int, buf *byte, count Size_t) Ssize_t
274 //sys readlen(fd int, p *byte, np int) (n int, err error)
275 //read(fd _C_int, buf *byte, count Size_t) Ssize_t
277 //sys Readlink(path string, buf []byte) (n int, err error)
278 //readlink(path *byte, buf *byte, bufsiz Size_t) Ssize_t
280 //sys Rename(oldpath string, newpath string) (err error)
281 //rename(oldpath *byte, newpath *byte) _C_int
283 //sys Rmdir(path string) (err error)
284 //rmdir(path *byte) _C_int
286 //sys Setdomainname(p []byte) (err error)
287 //setdomainname(name *byte, len Size_t) _C_int
289 //sys Sethostname(p []byte) (err error)
290 //sethostname(name *byte, len Size_t) _C_int
292 //sysnb Setgid(gid int) (err error)
293 //setgid(gid Gid_t) _C_int
295 //sysnb Setregid(rgid int, egid int) (err error)
296 //setregid(rgid Gid_t, egid Gid_t) _C_int
298 //sysnb Setpgid(pid int, pgid int) (err error)
299 //setpgid(pid Pid_t, pgid Pid_t) _C_int
301 //sys Setpriority(which int, who int, prio int) (err error)
302 //setpriority(which _C_int, who _C_int, prio _C_int) _C_int
304 //sysnb Setreuid(ruid int, euid int) (err error)
305 //setreuid(ruid Uid_t, euid Uid_t) _C_int
307 //sysnb Setsid() (pid int, err error)
308 //setsid() Pid_t
310 //sysnb settimeofday(tv *Timeval, tz *byte) (err error)
311 //settimeofday(tv *Timeval, tz *byte) _C_int
313 func Settimeofday(tv *Timeval) (err error) {
314 return settimeofday(tv, nil)
317 //sysnb Setuid(uid int) (err error)
318 //setuid(uid Uid_t) _C_int
320 //sys Symlink(oldpath string, newpath string) (err error)
321 //symlink(oldpath *byte, newpath *byte) _C_int
323 //sys Sync()
324 //sync()
326 //sysnb Time(t *Time_t) (tt Time_t, err error)
327 //time(t *Time_t) Time_t
329 //sysnb Times(tms *Tms) (ticks uintptr, err error)
330 //times(tms *Tms) _clock_t
332 //sysnb Umask(mask int) (oldmask int)
333 //umask(mask Mode_t) Mode_t
335 //sys Unlink(path string) (err error)
336 //unlink(path *byte) _C_int
338 //sys Utime(path string, buf *Utimbuf) (err error)
339 //utime(path *byte, buf *Utimbuf) _C_int
341 //sys write(fd int, p []byte) (n int, err error)
342 //write(fd _C_int, buf *byte, count Size_t) Ssize_t
344 //sys writelen(fd int, p *byte, np int) (n int, err error)
345 //write(fd _C_int, buf *byte, count Size_t) Ssize_t
347 //sys munmap(addr uintptr, length uintptr) (err error)
348 //munmap(addr *byte, length Size_t) _C_int
350 //sys Mprotect(b []byte, prot int) (err error)
351 //mprotect(addr *byte, len Size_t, prot _C_int) _C_int
353 //sys Mlock(b []byte) (err error)
354 //mlock(addr *byte, len Size_t) _C_int
356 //sys Munlock(b []byte) (err error)
357 //munlock(addr *byte, len Size_t) _C_int
359 //sys Mlockall(flags int) (err error)
360 //mlockall(flags _C_int) _C_int
362 //sys Munlockall() (err error)
363 //munlockall() _C_int
365 func setTimespec(sec, nsec int64) Timespec {
366 return Timespec{Sec: Timespec_sec_t(sec), Nsec: Timespec_nsec_t(nsec)}
369 func setTimeval(sec, usec int64) Timeval {
370 return Timeval{Sec: Timeval_sec_t(sec), Usec: Timeval_usec_t(usec)}
373 //sysnb Tcgetattr(fd int, p *Termios) (err error)
374 //tcgetattr(fd _C_int, p *Termios) _C_int
376 //sys Tcsetattr(fd int, actions int, p *Termios) (err error)
377 //tcsetattr(fd _C_int, actions _C_int, p *Termios) _C_int
379 //sys sysconf(name int) (ret int64, err error)
380 //sysconf(name _C_int) _C_long
382 func Sysconf(name int) (ret int64, err error) {
383 // If an option is not available, sysconf returns -1 without
384 // changing errno. Detect this case and return err == nil.
385 SetErrno(0)
386 ret, err = sysconf(name)
387 if err == Errno(0) {
388 err = nil
390 return ret, err