OSDN Git Service

syscall: Additional constants, some type corrections.
[pf3gnuchains/gcc-fork.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) (err error)
21 //pipe(p *[2]int) int
22 func Pipe(p []int) (err error) {
23         if len(p) != 2 {
24                 return EINVAL
25         }
26         var pp [2]int
27         err = pipe(&pp)
28         p[0] = pp[0]
29         p[1] = pp[1]
30         return
31 }
32
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) {
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) (err error)
43 //getcwd(buf *byte, size Size_t) *byte
44
45 const ImplementsGetwd = true
46
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++
55                         }
56                         return string(b[0:i]), nil
57                 }
58                 if err != ERANGE {
59                         return "", err
60                 }
61         }
62 }
63
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++
70                 }
71                 n = i + 1
72         }
73         return
74 }
75
76 //sysnb getgroups(size int, list *Gid_t) (nn int, err error)
77 //getgroups(size int, list *Gid_t) int
78
79 func Getgroups() (gids []int, err error) {
80         n, err := getgroups(0, nil)
81         if err != nil {
82                 return nil, err
83         }
84         if n == 0 {
85                 return nil, nil
86         }
87
88         // Sanity check group count.  Max is 1<<16 on GNU/Linux.
89         if n < 0 || n > 1<<20 {
90                 return nil, EINVAL
91         }
92
93         a := make([]Gid_t, n)
94         n, err = getgroups(n, &a[0])
95         if err != nil {
96                 return nil, err
97         }
98         gids = make([]int, n)
99         for i, v := range a[0:n] {
100                 gids[i] = int(v)
101         }
102         return
103 }
104
105 //sysnb setgroups(n int, list *Gid_t) (err error)
106 //setgroups(n Size_t, list *Gid_t) int
107
108 func Setgroups(gids []int) (err error) {
109         if len(gids) == 0 {
110                 return setgroups(0, nil)
111         }
112
113         a := make([]Gid_t, len(gids))
114         for i, v := range gids {
115                 a[i] = Gid_t(v)
116         }
117         return setgroups(len(a), &a[0])
118 }
119
120 type WaitStatus uint32
121
122 // The WaitStatus methods are implemented in C, to pick up the macros
123 // #defines in <sys/wait.h>.
124
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
134
135 //sys   Mkfifo(path string, mode uint32) (err error)
136 //mkfifo(path *byte, mode Mode_t) int
137
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
140
141 const nfdbits = int(unsafe.Sizeof(fds_bits_type) * 8)
142
143 type FdSet struct {
144         Bits [(FD_SETSIZE + nfdbits - 1) / nfdbits]fds_bits_type
145 }
146
147 func FDSet(fd int, set *FdSet) {
148         set.Bits[fd/nfdbits] |= (1 << (uint)(fd%nfdbits))
149 }
150
151 func FDClr(fd int, set *FdSet) {
152         set.Bits[fd/nfdbits] &^= (1 << (uint)(fd%nfdbits))
153 }
154
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
160         }
161 }
162
163 func FDZero(set *FdSet) {
164         for i := range set.Bits {
165                 set.Bits[i] = 0
166         }
167 }
168
169 //sys   Access(path string, mode uint32) (err error)
170 //access(path *byte, mode int) int
171
172 //sys   Chdir(path string) (err error)
173 //chdir(path *byte) int
174
175 //sys   Chmod(path string, mode uint32) (err error)
176 //chmod(path *byte, mode Mode_t) int
177
178 //sys   Chown(path string, uid int, gid int) (err error)
179 //chown(path *byte, uid Uid_t, gid Gid_t) int
180
181 //sys   Chroot(path string) (err error)
182 //chroot(path *byte) int
183
184 //sys   Close(fd int) (err error)
185 //close(fd int) int
186
187 //sys   Creat(path string, mode uint32) (fd int, err error)
188 //creat(path *byte, mode Mode_t) int
189
190 //sysnb Dup(oldfd int) (fd int, err error)
191 //dup(oldfd int) int
192
193 //sysnb Dup2(oldfd int, newfd int) (err error)
194 //dup2(oldfd int, newfd int) int
195
196 //sys   Exit(code int)
197 //exit(code int)
198
199 //sys   Fchdir(fd int) (err error)
200 //fchdir(fd int) int
201
202 //sys   Fchmod(fd int, mode uint32) (err error)
203 //fchmod(fd int, mode Mode_t) int
204
205 //sys   Fchown(fd int, uid int, gid int) (err error)
206 //fchown(fd int, uid Uid_t, gid Gid_t) int
207
208 //sys   fcntl(fd int, cmd int, arg int) (val int, err error)
209 //fcntl(fd int, cmd int, arg int) int
210
211 //sys   Fdatasync(fd int) (err error)
212 //fdatasync(fd int) int
213
214 //sys   Fsync(fd int) (err error)
215 //fsync(fd int) int
216
217 //sysnb Getegid() (egid int)
218 //getegid() Gid_t
219
220 //sysnb Geteuid() (euid int)
221 //geteuid() Uid_t
222
223 //sysnb Getgid() (gid int)
224 //getgid() Gid_t
225
226 //sysnb Getpagesize() (pagesize int)
227 //getpagesize() int
228
229 //sysnb Getpgid(pid int) (pgid int, err error)
230 //getpgid(pid Pid_t) Pid_t
231
232 //sysnb Getpgrp() (pid int)
233 //getpgrp() Pid_t
234
235 //sysnb Getpid() (pid int)
236 //getpid() Pid_t
237
238 //sysnb Getppid() (ppid int)
239 //getppid() Pid_t
240
241 //sysnb Getrlimit(resource int, rlim *Rlimit) (err error)
242 //getrlimit(resource int, rlim *Rlimit) int
243
244 //sysnb Getrusage(who int, rusage *Rusage) (err error)
245 //getrusage(who int, rusage *Rusage) int
246
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)
251 }
252
253 //sysnb Getuid() (uid int)
254 //getuid() Uid_t
255
256 //sysnb Kill(pid int, sig Signal) (err error)
257 //kill(pid Pid_t, sig int) int
258
259 //sys   Lchown(path string, uid int, gid int) (err error)
260 //lchown(path *byte, uid Uid_t, gid Gid_t) int
261
262 //sys   Link(oldpath string, newpath string) (err error)
263 //link(oldpath *byte, newpath *byte) int
264
265 //sys   Mkdir(path string, mode uint32) (err error)
266 //mkdir(path *byte, mode Mode_t) int
267
268 //sys   Mknod(path string, mode uint32, dev int) (err error)
269 //mknod(path *byte, mode Mode_t, dev _dev_t) int
270
271 //sys   Mount(source string, target string, fstype string, flags uintptr, data string) (err error)
272 //mount(source *byte, target *byte, fstype *byte, flags _C_long, data *byte) int
273
274 //sys   Nanosleep(time *Timespec, leftover *Timespec) (err error)
275 //nanosleep(time *Timespec, leftover *Timespec) int
276
277 //sys   Pause() (err error)
278 //pause() int
279
280 //sys   Read(fd int, p []byte) (n int, err error)
281 //read(fd int, buf *byte, count Size_t) Ssize_t
282
283 //sys   Readlink(path string, buf []byte) (n int, err error)
284 //readlink(path *byte, buf *byte, bufsiz Size_t) Ssize_t
285
286 //sys   Rename(oldpath string, newpath string) (err error)
287 //rename(oldpath *byte, newpath *byte) int
288
289 //sys   Rmdir(path string) (err error)
290 //rmdir(path *byte) int
291
292 //sys   Setdomainname(p []byte) (err error)
293 //setdomainname(name *byte, len Size_t) int
294
295 //sys   Sethostname(p []byte) (err error)
296 //sethostname(name *byte, len Size_t) int
297
298 //sysnb Setgid(gid int) (err error)
299 //setgid(gid Gid_t) int
300
301 //sysnb Setregid(rgid int, egid int) (err error)
302 //setregid(rgid Gid_t, egid Gid_t) int
303
304 //sysnb Setpgid(pid int, pgid int) (err error)
305 //setpgid(pid Pid_t, pgid Pid_t) int
306
307 //sysnb Setreuid(ruid int, euid int) (err error)
308 //setreuid(ruid Uid_t, euid Uid_t) int
309
310 //sysnb Setrlimit(resource int, rlim *Rlimit) (err error)
311 //setrlimit(resource int, rlim *Rlimit) int
312
313 //sysnb Setsid() (pid int, err error)
314 //setsid() Pid_t
315
316 //sysnb settimeofday(tv *Timeval, tz *byte) (err error)
317 //settimeofday(tv *Timeval, tz *byte) int
318
319 func Settimeofday(tv *Timeval) (err error) {
320         return settimeofday(tv, nil)
321 }
322
323 //sysnb Setuid(uid int) (err error)
324 //setuid(uid Uid_t) int
325
326 //sys   Symlink(oldpath string, newpath string) (err error)
327 //symlink(oldpath *byte, newpath *byte) int
328
329 //sys   Sync()
330 //sync()
331
332 //sysnb Time(t *Time_t) (tt Time_t, err error)
333 //time(t *Time_t) Time_t
334
335 //sysnb Times(tms *Tms) (ticks uintptr, err error)
336 //times(tms *Tms) _clock_t
337
338 //sysnb Umask(mask int) (oldmask int)
339 //umask(mask Mode_t) Mode_t
340
341 //sys   Unlink(path string) (err error)
342 //unlink(path *byte) int
343
344 //sys   Utime(path string, buf *Utimbuf) (err error)
345 //utime(path *byte, buf *Utimbuf) int
346
347 //sys   Write(fd int, p []byte) (n int, err error)
348 //write(fd int, buf *byte, count Size_t) Ssize_t
349
350 //sys   munmap(addr uintptr, length uintptr) (err error)
351 //munmap(addr *byte, length Size_t) int
352
353 //sys Madvise(b []byte, advice int) (err error)
354 //madvise(addr *byte, len Size_t, advice int) int
355
356 //sys   Mprotect(b []byte, prot int) (err error)
357 //mprotect(addr *byte, len Size_t, prot int) int
358
359 //sys   Mlock(b []byte) (err error)
360 //mlock(addr *byte, len Size_t) int
361
362 //sys   Munlock(b []byte) (err error)
363 //munlock(addr *byte, len Size_t) int
364
365 //sys   Mlockall(flags int) (err error)
366 //mlockall(flags int) int
367
368 //sys   Munlockall() (err error)
369 //munlockall() int
370
371 func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
372
373 func NsecToTimespec(nsec int64) (ts Timespec) {
374         ts.Sec = Timespec_sec_t(nsec / 1e9)
375         ts.Nsec = Timespec_nsec_t(nsec % 1e9)
376         return
377 }
378
379 func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 }
380
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)
385         return
386 }
387
388 //sysnb Tcgetattr(fd int, p *Termios) (err error)
389 //tcgetattr(fd int, p *Termios) int
390
391 //sys   Tcsetattr(fd int, actions int, p *Termios) (err error)
392 //tcsetattr(fd int, actions int, p *Termios) int