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.
20 //sysnb pipe(p *[2]int) (err error)
22 func Pipe(p []int) (err error) {
33 //sys utimes(path string, times *[2]Timeval) (err error)
34 //utimes(path *byte, times *[2]Timeval) int
35 func Utimes(path string, tv []Timeval) (err error) {
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)
56 return string(b[0:i]), nil
64 func Getcwd(buf []byte) (n int, err error) {
65 err = getcwd(&buf[0], Size_t(len(buf)))
76 //sysnb getgroups(size int, list *Gid_t) (nn int, err error)
77 //getgroups(size int, list *Gid_t) int
79 func Getgroups() (gids []int, err error) {
80 n, err := getgroups(0, nil)
88 // Sanity check group count. Max is 1<<16 on GNU/Linux.
89 if n < 0 || n > 1<<20 {
94 n, err = getgroups(n, &a[0])
99 for i, v := range a[0:n] {
105 //sysnb setgroups(n int, list *Gid_t) (err error)
106 //setgroups(n Size_t, list *Gid_t) int
108 func Setgroups(gids []int) (err error) {
110 return setgroups(0, nil)
113 a := make([]Gid_t, len(gids))
114 for i, v := range gids {
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) int
138 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
139 //select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) int
141 const nfdbits = unsafe.Sizeof(fds_bits_type) * 8
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 {
163 func FDZero(set *FdSet) {
164 for i := range set.Bits {
169 //sys Access(path string, mode uint32) (err error)
170 //access(path *byte, mode int) int
172 //sys Chdir(path string) (err error)
173 //chdir(path *byte) int
175 //sys Chmod(path string, mode uint32) (err error)
176 //chmod(path *byte, mode Mode_t) int
178 //sys Chown(path string, uid int, gid int) (err error)
179 //chown(path *byte, uid Uid_t, gid Gid_t) int
181 //sys Chroot(path string) (err error)
182 //chroot(path *byte) int
184 //sys Close(fd int) (err error)
187 //sys Creat(path string, mode uint32) (fd int, err error)
188 //creat(path *byte, mode Mode_t) int
190 //sysnb Dup(oldfd int) (fd int, err error)
193 //sysnb Dup2(oldfd int, newfd int) (err error)
194 //dup2(oldfd int, newfd int) int
199 //sys Fchdir(fd int) (err error)
202 //sys Fchmod(fd int, mode uint32) (err error)
203 //fchmod(fd int, mode Mode_t) int
205 //sys Fchown(fd int, uid int, gid int) (err error)
206 //fchown(fd int, uid Uid_t, gid Gid_t) int
208 //sys fcntl(fd int, cmd int, arg int) (val int, err error)
209 //fcntl(fd int, cmd int, arg int) int
211 //sys Fdatasync(fd int) (err error)
212 //fdatasync(fd int) int
214 //sys Fsync(fd int) (err error)
217 //sysnb Getegid() (egid int)
220 //sysnb Geteuid() (euid int)
223 //sysnb Getgid() (gid int)
226 //sysnb Getpagesize() (pagesize int)
229 //sysnb Getpgid(pid int) (pgid int, err error)
230 //getpgid(pid Pid_t) Pid_t
232 //sysnb Getpgrp() (pid int)
235 //sysnb Getpid() (pid int)
238 //sysnb Getppid() (ppid int)
241 //sysnb Getrlimit(resource int, rlim *Rlimit) (err error)
242 //getrlimit(resource int, rlim *Rlimit) int
244 //sysnb Getrusage(who int, rusage *Rusage) (err error)
245 //getrusage(who int, rusage *Rusage) int
247 //sysnb gettimeofday(tv *Timeval, tz *byte) (err error)
248 //gettimeofday(tv *Timeval, tz *byte) int
249 func Gettimeofday(tv *Timeval) (err error) {
250 return gettimeofday(tv, nil)
253 //sysnb Getuid() (uid int)
256 //sysnb Kill(pid int, sig Signal) (err error)
257 //kill(pid Pid_t, sig int) int
259 //sys Lchown(path string, uid int, gid int) (err error)
260 //lchown(path *byte, uid Uid_t, gid Gid_t) int
262 //sys Link(oldpath string, newpath string) (err error)
263 //link(oldpath *byte, newpath *byte) int
265 //sys Mkdir(path string, mode uint32) (err error)
266 //mkdir(path *byte, mode Mode_t) int
268 //sys Mknod(path string, mode uint32, dev int) (err error)
269 //mknod(path *byte, mode Mode_t, dev _dev_t) int
271 //sys Mount(source string, target string, fstype string, flags int, data string) (err error)
272 //mount(source *byte, target *byte, fstype *byte, flags _C_long, data *byte) int
274 //sys Nanosleep(time *Timespec, leftover *Timespec) (err error)
275 //nanosleep(time *Timespec, leftover *Timespec) int
277 //sys Pause() (err error)
280 //sys Read(fd int, p []byte) (n int, err error)
281 //read(fd int, buf *byte, count Size_t) Ssize_t
283 //sys Readlink(path string, buf []byte) (n int, err error)
284 //readlink(path *byte, buf *byte, bufsiz Size_t) Ssize_t
286 //sys Rename(oldpath string, newpath string) (err error)
287 //rename(oldpath *byte, newpath *byte) int
289 //sys Rmdir(path string) (err error)
290 //rmdir(path *byte) int
292 //sys Setdomainname(p []byte) (err error)
293 //setdomainname(name *byte, len Size_t) int
295 //sys Sethostname(p []byte) (err error)
296 //sethostname(name *byte, len Size_t) int
298 //sysnb Setgid(gid int) (err error)
299 //setgid(gid Gid_t) int
301 //sysnb Setregid(rgid int, egid int) (err error)
302 //setregid(rgid Gid_t, egid Gid_t) int
304 //sysnb Setpgid(pid int, pgid int) (err error)
305 //setpgid(pid Pid_t, pgid Pid_t) int
307 //sysnb Setreuid(ruid int, euid int) (err error)
308 //setreuid(ruid Uid_t, euid Uid_t) int
310 //sysnb Setrlimit(resource int, rlim *Rlimit) (err error)
311 //setrlimit(resource int, rlim *Rlimit) int
313 //sysnb Setsid() (pid int, err error)
316 //sysnb settimeofday(tv *Timeval, tz *byte) (err error)
317 //settimeofday(tv *Timeval, tz *byte) int
319 func Settimeofday(tv *Timeval) (err error) {
320 return settimeofday(tv, nil)
323 //sysnb Setuid(uid int) (err error)
324 //setuid(uid Uid_t) int
326 //sys Symlink(oldpath string, newpath string) (err error)
327 //symlink(oldpath *byte, newpath *byte) int
332 //sysnb Time(t *Time_t) (tt Time_t, err error)
333 //time(t *Time_t) Time_t
335 //sysnb Times(tms *Tms) (ticks uintptr, err error)
336 //times(tms *Tms) _clock_t
338 //sysnb Umask(mask int) (oldmask int)
339 //umask(mask Mode_t) Mode_t
341 //sys Unlink(path string) (err error)
342 //unlink(path *byte) int
344 //sys Utime(path string, buf *Utimbuf) (err error)
345 //utime(path *byte, buf *Utimbuf) int
347 //sys Write(fd int, p []byte) (n int, err error)
348 //write(fd int, buf *byte, count Size_t) Ssize_t
350 //sys munmap(addr uintptr, length uintptr) (err error)
351 //munmap(addr *byte, length Size_t) int
353 //sys Madvise(b []byte, advice int) (err error)
354 //madvise(addr *byte, len Size_t, advice int) int
356 //sys Mprotect(b []byte, prot int) (err error)
357 //mprotect(addr *byte, len Size_t, prot int) int
359 //sys Mlock(b []byte) (err error)
360 //mlock(addr *byte, len Size_t) int
362 //sys Munlock(b []byte) (err error)
363 //munlock(addr *byte, len Size_t) int
365 //sys Mlockall(flags int) (err error)
366 //mlockall(flags int) int
368 //sys Munlockall() (err error)
371 func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
373 func NsecToTimespec(nsec int64) (ts Timespec) {
374 ts.Sec = Timespec_sec_t(nsec / 1e9)
375 ts.Nsec = Timespec_nsec_t(nsec % 1e9)
379 func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 }
381 func NsecToTimeval(nsec int64) (tv Timeval) {
382 nsec += 999 // round up to microsecond
383 tv.Sec = Timeval_sec_t(nsec / 1e9)
384 tv.Usec = Timeval_usec_t(nsec % 1e9 / 1e3)
388 //sysnb Tcgetattr(fd int, p *Termios) (err error)
389 //tcgetattr(fd int, p *Termios) int
391 //sys Tcsetattr(fd int, actions int, p *Termios) (err error)
392 //tcsetattr(fd int, actions int, p *Termios) int