Rebase.
[official-gcc.git] / libgo / go / syscall / libcall_posix.go
blobd3580a1bc0cb5a0b7a6beb210e8a82215bd335e1
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 //sys Creat(path string, mode uint32) (fd int, err error)
188 //creat(path *byte, mode Mode_t) _C_int
190 //sysnb Dup(oldfd int) (fd int, err error)
191 //dup(oldfd _C_int) _C_int
193 //sysnb Dup2(oldfd int, newfd int) (err error)
194 //dup2(oldfd _C_int, newfd _C_int) _C_int
196 //sys Exit(code int)
197 //exit(code _C_int)
199 //sys Fchdir(fd int) (err error)
200 //fchdir(fd _C_int) _C_int
202 //sys Fchmod(fd int, mode uint32) (err error)
203 //fchmod(fd _C_int, mode Mode_t) _C_int
205 //sys Fchown(fd int, uid int, gid int) (err error)
206 //fchown(fd _C_int, uid Uid_t, gid Gid_t) _C_int
208 //sys fcntl(fd int, cmd int, arg int) (val int, err error)
209 //__go_fcntl(fd _C_int, cmd _C_int, arg _C_int) _C_int
211 //sys FcntlFlock(fd uintptr, cmd int, lk *Flock_t) (err error)
212 //__go_fcntl_flock(fd _C_int, cmd _C_int, arg *Flock_t) _C_int
214 //sys Fdatasync(fd int) (err error)
215 //fdatasync(fd _C_int) _C_int
217 //sys Fsync(fd int) (err error)
218 //fsync(fd _C_int) _C_int
220 //sysnb Getegid() (egid int)
221 //getegid() Gid_t
223 //sysnb Geteuid() (euid int)
224 //geteuid() Uid_t
226 //sysnb Getgid() (gid int)
227 //getgid() Gid_t
229 //sysnb Getpagesize() (pagesize int)
230 //getpagesize() _C_int
232 //sysnb Getpgid(pid int) (pgid int, err error)
233 //getpgid(pid Pid_t) Pid_t
235 //sysnb Getpgrp() (pid int)
236 //getpgrp() Pid_t
238 //sysnb Getpid() (pid int)
239 //getpid() Pid_t
241 //sysnb Getppid() (ppid int)
242 //getppid() Pid_t
244 //sys Getpriority(which int, who int) (prio int, err error)
245 //getpriority(which _C_int, who _C_int) _C_int
247 //sysnb Getrusage(who int, rusage *Rusage) (err error)
248 //getrusage(who _C_int, rusage *Rusage) _C_int
250 //sysnb gettimeofday(tv *Timeval, tz *byte) (err error)
251 //gettimeofday(tv *Timeval, tz *byte) _C_int
252 func Gettimeofday(tv *Timeval) (err error) {
253 return gettimeofday(tv, nil)
256 //sysnb Getuid() (uid int)
257 //getuid() Uid_t
259 //sysnb Kill(pid int, sig Signal) (err error)
260 //kill(pid Pid_t, sig _C_int) _C_int
262 //sys Lchown(path string, uid int, gid int) (err error)
263 //lchown(path *byte, uid Uid_t, gid Gid_t) _C_int
265 //sys Link(oldpath string, newpath string) (err error)
266 //link(oldpath *byte, newpath *byte) _C_int
268 //sys Mkdir(path string, mode uint32) (err error)
269 //mkdir(path *byte, mode Mode_t) _C_int
271 //sys Mknod(path string, mode uint32, dev int) (err error)
272 //mknod(path *byte, mode Mode_t, dev _dev_t) _C_int
274 //sys Mount(source string, target string, fstype string, flags uintptr, data string) (err error)
275 //mount(source *byte, target *byte, fstype *byte, flags _C_long, data *byte) _C_int
277 //sys Nanosleep(time *Timespec, leftover *Timespec) (err error)
278 //nanosleep(time *Timespec, leftover *Timespec) _C_int
280 //sys Pause() (err error)
281 //pause() _C_int
283 //sys read(fd int, p []byte) (n int, err error)
284 //read(fd _C_int, buf *byte, count Size_t) Ssize_t
286 //sys readlen(fd int, p *byte, np int) (n int, err error)
287 //read(fd _C_int, buf *byte, count Size_t) Ssize_t
289 //sys Readlink(path string, buf []byte) (n int, err error)
290 //readlink(path *byte, buf *byte, bufsiz Size_t) Ssize_t
292 //sys Rename(oldpath string, newpath string) (err error)
293 //rename(oldpath *byte, newpath *byte) _C_int
295 //sys Rmdir(path string) (err error)
296 //rmdir(path *byte) _C_int
298 //sys Setdomainname(p []byte) (err error)
299 //setdomainname(name *byte, len Size_t) _C_int
301 //sys Sethostname(p []byte) (err error)
302 //sethostname(name *byte, len Size_t) _C_int
304 //sysnb Setgid(gid int) (err error)
305 //setgid(gid Gid_t) _C_int
307 //sysnb Setregid(rgid int, egid int) (err error)
308 //setregid(rgid Gid_t, egid Gid_t) _C_int
310 //sysnb Setpgid(pid int, pgid int) (err error)
311 //setpgid(pid Pid_t, pgid Pid_t) _C_int
313 //sys Setpriority(which int, who int, prio int) (err error)
314 //setpriority(which _C_int, who _C_int, prio _C_int) _C_int
316 //sysnb Setreuid(ruid int, euid int) (err error)
317 //setreuid(ruid Uid_t, euid Uid_t) _C_int
319 //sysnb Setsid() (pid int, err error)
320 //setsid() Pid_t
322 //sysnb settimeofday(tv *Timeval, tz *byte) (err error)
323 //settimeofday(tv *Timeval, tz *byte) _C_int
325 func Settimeofday(tv *Timeval) (err error) {
326 return settimeofday(tv, nil)
329 //sysnb Setuid(uid int) (err error)
330 //setuid(uid Uid_t) _C_int
332 //sys Symlink(oldpath string, newpath string) (err error)
333 //symlink(oldpath *byte, newpath *byte) _C_int
335 //sys Sync()
336 //sync()
338 //sysnb Time(t *Time_t) (tt Time_t, err error)
339 //time(t *Time_t) Time_t
341 //sysnb Times(tms *Tms) (ticks uintptr, err error)
342 //times(tms *Tms) _clock_t
344 //sysnb Umask(mask int) (oldmask int)
345 //umask(mask Mode_t) Mode_t
347 //sys Unlink(path string) (err error)
348 //unlink(path *byte) _C_int
350 //sys Utime(path string, buf *Utimbuf) (err error)
351 //utime(path *byte, buf *Utimbuf) _C_int
353 //sys write(fd int, p []byte) (n int, err error)
354 //write(fd _C_int, buf *byte, count Size_t) Ssize_t
356 //sys writelen(fd int, p *byte, np int) (n int, err error)
357 //write(fd _C_int, buf *byte, count Size_t) Ssize_t
359 //sys munmap(addr uintptr, length uintptr) (err error)
360 //munmap(addr *byte, length Size_t) _C_int
362 //sys Madvise(b []byte, advice int) (err error)
363 //madvise(addr *byte, len Size_t, advice _C_int) _C_int
365 //sys Mprotect(b []byte, prot int) (err error)
366 //mprotect(addr *byte, len Size_t, prot _C_int) _C_int
368 //sys Mlock(b []byte) (err error)
369 //mlock(addr *byte, len Size_t) _C_int
371 //sys Munlock(b []byte) (err error)
372 //munlock(addr *byte, len Size_t) _C_int
374 //sys Mlockall(flags int) (err error)
375 //mlockall(flags _C_int) _C_int
377 //sys Munlockall() (err error)
378 //munlockall() _C_int
380 func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
382 func NsecToTimespec(nsec int64) (ts Timespec) {
383 ts.Sec = Timespec_sec_t(nsec / 1e9)
384 ts.Nsec = Timespec_nsec_t(nsec % 1e9)
385 return
388 func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 }
390 func NsecToTimeval(nsec int64) (tv Timeval) {
391 nsec += 999 // round up to microsecond
392 tv.Sec = Timeval_sec_t(nsec / 1e9)
393 tv.Usec = Timeval_usec_t(nsec % 1e9 / 1e3)
394 return
397 //sysnb Tcgetattr(fd int, p *Termios) (err error)
398 //tcgetattr(fd _C_int, p *Termios) _C_int
400 //sys Tcsetattr(fd int, actions int, p *Termios) (err error)
401 //tcsetattr(fd _C_int, actions _C_int, p *Termios) _C_int