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) (errno int)
22 func Pipe(p []int) (errno int) {
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) {
39 return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
42 //sys getcwd(buf *byte, size Size_t) (errno int)
43 //getcwd(buf *byte, size Size_t) *byte
45 const ImplementsGetwd = true
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)
56 return string(b[0:i]), 0;
64 //sysnb getgroups(size int, list *Gid_t) (nn int, errno int)
65 //getgroups(size int, list *Gid_t) int
67 func Getgroups() (gids []int, errno int) {
68 n, err := getgroups(0, nil)
76 // Sanity check group count. Max is 1<<16 on Linux.
77 if n < 0 || n > 1<<20 {
82 n, err = getgroups(n, &a[0])
87 for i, v := range a[0:n] {
93 //sysnb setgroups(n int, list *Gid_t) (errno int)
94 //setgroups(n Size_t, list *Gid_t) int
96 func Setgroups(gids []int) (errno int) {
98 return setgroups(0, nil)
101 a := make([]Gid_t, len(gids))
102 for i, v := range gids {
105 return setgroups(len(a), &a[0])
108 type WaitStatus uint32
110 // The WaitStatus methods are implemented in C, to pick up the macros
111 // #defines in <sys/wait.h>.
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
123 //sys Mkfifo(path string, mode uint32) (errno int)
124 //mkfifo(path *byte, mode Mode_t) int
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
129 const nfdbits = unsafe.Sizeof(fds_bits_type) * 8
132 Bits [(FD_SETSIZE + nfdbits - 1) / nfdbits]fds_bits_type
135 func FDSet(fd int, set *FdSet) {
136 set.Bits[fd / nfdbits] |= (1 << (uint)(fd % nfdbits))
139 func FDClr(fd int, set *FdSet) {
140 set.Bits[fd / nfdbits] &^= (1 << (uint)(fd % nfdbits))
143 func FDIsSet(fd int, set *FdSet) bool {
144 if set.Bits[fd / nfdbits] & (1 << (uint)(fd % nfdbits)) != 0 {
151 func FDZero(set *FdSet) {
152 for i := range set.Bits {
157 //sys Access(path string, mode uint32) (errno int)
158 //access(path *byte, mode int) int
160 //sys Chdir(path string) (errno int)
161 //chdir(path *byte) int
163 //sys Chmod(path string, mode uint32) (errno int)
164 //chmod(path *byte, mode Mode_t) int
166 //sys Chown(path string, uid int, gid int) (errno int)
167 //chown(path *byte, uid Uid_t, gid Gid_t) int
169 //sys Chroot(path string) (errno int)
170 //chroot(path *byte) int
172 //sys Close(fd int) (errno int)
175 //sys Creat(path string, mode uint32) (fd int, errno int)
176 //creat(path *byte, mode Mode_t) int
178 //sysnb Dup(oldfd int) (fd int, errno int)
181 //sysnb Dup2(oldfd int, newfd int) (fd int, errno int)
182 //dup2(oldfd int, newfd int) int
187 //sys Fchdir(fd int) (errno int)
190 //sys Fchmod(fd int, mode uint32) (errno int)
191 //fchmod(fd int, mode Mode_t) int
193 //sys Fchown(fd int, uid int, gid int) (errno int)
194 //fchown(fd int, uid Uid_t, gid Gid_t) int
196 //sys fcntl(fd int, cmd int, arg int) (val int, errno int)
197 //fcntl(fd int, cmd int, arg int) int
199 //sys Fdatasync(fd int) (errno int)
200 //fdatasync(fd int) int
202 //sys Fsync(fd int) (errno int)
205 //sysnb Getegid() (egid int)
208 //sysnb Geteuid() (euid int)
211 //sysnb Getgid() (gid int)
214 //sysnb Getpagesize() (pagesize int)
217 //sysnb Getpgid(pid int) (pgid int, errno int)
218 //getpgid(pid Pid_t) Pid_t
220 //sysnb Getpgrp() (pid int)
223 //sysnb Getpid() (pid int)
226 //sysnb Getppid() (ppid int)
229 // FIXME: mksysinfo Rlimit
230 // //sysnb Getrlimit(resource int, rlim *Rlimit) (errno int)
231 // //getrlimit(resource int, rlim *Rlimit) int
233 //sysnb Getrusage(who int, rusage *Rusage) (errno int)
234 //getrusage(who int, rusage *Rusage) int
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)
242 //sysnb Getuid() (uid int)
245 //sysnb Kill(pid int, sig int) (errno int)
246 //kill(pid Pid_t, sig int) int
248 //sys Lchown(path string, uid int, gid int) (errno int)
249 //lchown(path *byte, uid Uid_t, gid Gid_t) int
251 //sys Link(oldpath string, newpath string) (errno int)
252 //link(oldpath *byte, newpath *byte) int
254 //sys Mkdir(path string, mode uint32) (errno int)
255 //mkdir(path *byte, mode Mode_t) int
257 //sys Mknod(path string, mode uint32, dev int) (errno int)
258 //mknod(path *byte, mode Mode_t, dev _dev_t) int
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
263 //sys Nanosleep(time *Timespec, leftover *Timespec) (errno int)
264 //nanosleep(time *Timespec, leftover *Timespec) int
266 //sys Pause() (errno int)
269 //sys Read(fd int, p []byte) (n int, errno int)
270 //read(fd int, buf *byte, count Size_t) Ssize_t
272 //sys Readlink(path string, buf []byte) (n int, errno int)
273 //readlink(path *byte, buf *byte, bufsiz Size_t) Ssize_t
275 //sys Rename(oldpath string, newpath string) (errno int)
276 //rename(oldpath *byte, newpath *byte) int
278 //sys Rmdir(path string) (errno int)
279 //rmdir(path *byte) int
281 //sys Setdomainname(p []byte) (errno int)
282 //setdomainname(name *byte, len Size_t) int
284 //sys Sethostname(p []byte) (errno int)
285 //sethostname(name *byte, len Size_t) int
287 //sysnb Setgid(gid int) (errno int)
288 //setgid(gid Gid_t) int
290 //sysnb Setregid(rgid int, egid int) (errno int)
291 //setregid(rgid Gid_t, egid Gid_t) int
293 //sysnb Setpgid(pid int, pgid int) (errno int)
294 //setpgid(pid Pid_t, pgid Pid_t) int
296 //sysnb Setreuid(ruid int, euid int) (errno int)
297 //setreuid(ruid Uid_t, euid Uid_t) int
299 // FIXME: mksysinfo Rlimit
300 // //sysnb Setrlimit(resource int, rlim *Rlimit) (errno int)
301 // //setrlimit(resource int, rlim *Rlimit) int
303 //sysnb Setsid() (pid int, errno int)
306 //sysnb settimeofday(tv *Timeval, tz *byte) (errno int)
307 //settimeofday(tv *Timeval, tz *byte) int
309 func Settimeofday(tv *Timeval) (errno int) {
310 return settimeofday(tv, nil)
313 //sysnb Setuid(uid int) (errno int)
314 //setuid(uid Uid_t) int
316 //sys Symlink(oldpath string, newpath string) (errno int)
317 //symlink(oldpath *byte, newpath *byte) int
322 // FIXME: mksysinfo Time_t
323 // //sysnb Time(t *Time_t) (tt Time_t, errno int)
324 // //time(t *Time_t) Time_t
326 // FIXME: mksysinfo Tms
327 // //sysnb Times(tms *Tms) (ticks uintptr, errno int)
328 // //times(tms *Tms) _clock_t
330 //sysnb Umask(mask int) (oldmask int)
331 //umask(mask Mode_t) Mode_t
333 //sys Unlink(path string) (errno int)
334 //unlink(path *byte) int
336 // FIXME: mksysinfo Utimbuf
337 // //sys Utime(path string, buf *Utimbuf) (errno int)
338 // //utime(path *byte, buf *Utimbuf) int
340 //sys Write(fd int, p []byte) (n int, errno int)
341 //write(fd int, buf *byte, count Size_t) Ssize_t
343 //sys munmap(addr uintptr, length uintptr) (errno int)
344 //munmap(addr *byte, length Size_t) int
346 //sys Madvise(b []byte, advice int) (errno int)
347 //madvise(addr *byte, len Size_t, advice int) int
349 //sys Mprotect(b []byte, prot int) (errno int)
350 //mprotect(addr *byte, len Size_t, prot int) int
352 //sys Mlock(b []byte) (errno int)
353 //mlock(addr *byte, len Size_t) int
355 //sys Munlock(b []byte) (errno int)
356 //munlock(addr *byte, len Size_t) int
358 //sys Mlockall(flags int) (errno int)
359 //mlockall(flags int) int
361 //sys Munlockall() (errno int)
364 func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
366 func NsecToTimespec(nsec int64) (ts Timespec) {
367 ts.Sec = Timespec_sec_t(nsec / 1e9)
368 ts.Nsec = Timespec_nsec_t(nsec % 1e9)
372 func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 }
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)