OSDN Git Service

new repo
[bytom/vapor.git] / vendor / golang.org / x / sys / plan9 / syscall_plan9.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 // Plan 9 system 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 system call stubs.
9 // Note that sometimes we use a lowercase //sys name and
10 // wrap it in our own nicer implementation.
11
12 package plan9
13
14 import (
15         "syscall"
16         "unsafe"
17 )
18
19 // A Note is a string describing a process note.
20 // It implements the os.Signal interface.
21 type Note string
22
23 func (n Note) Signal() {}
24
25 func (n Note) String() string {
26         return string(n)
27 }
28
29 var (
30         Stdin  = 0
31         Stdout = 1
32         Stderr = 2
33 )
34
35 // For testing: clients can set this flag to force
36 // creation of IPv6 sockets to return EAFNOSUPPORT.
37 var SocketDisableIPv6 bool
38
39 func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.ErrorString)
40 func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.ErrorString)
41 func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)
42 func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
43
44 func atoi(b []byte) (n uint) {
45         n = 0
46         for i := 0; i < len(b); i++ {
47                 n = n*10 + uint(b[i]-'0')
48         }
49         return
50 }
51
52 func cstring(s []byte) string {
53         for i := range s {
54                 if s[i] == 0 {
55                         return string(s[0:i])
56                 }
57         }
58         return string(s)
59 }
60
61 func errstr() string {
62         var buf [ERRMAX]byte
63
64         RawSyscall(SYS_ERRSTR, uintptr(unsafe.Pointer(&buf[0])), uintptr(len(buf)), 0)
65
66         buf[len(buf)-1] = 0
67         return cstring(buf[:])
68 }
69
70 // Implemented in assembly to import from runtime.
71 func exit(code int)
72
73 func Exit(code int) { exit(code) }
74
75 func readnum(path string) (uint, error) {
76         var b [12]byte
77
78         fd, e := Open(path, O_RDONLY)
79         if e != nil {
80                 return 0, e
81         }
82         defer Close(fd)
83
84         n, e := Pread(fd, b[:], 0)
85
86         if e != nil {
87                 return 0, e
88         }
89
90         m := 0
91         for ; m < n && b[m] == ' '; m++ {
92         }
93
94         return atoi(b[m : n-1]), nil
95 }
96
97 func Getpid() (pid int) {
98         n, _ := readnum("#c/pid")
99         return int(n)
100 }
101
102 func Getppid() (ppid int) {
103         n, _ := readnum("#c/ppid")
104         return int(n)
105 }
106
107 func Read(fd int, p []byte) (n int, err error) {
108         return Pread(fd, p, -1)
109 }
110
111 func Write(fd int, p []byte) (n int, err error) {
112         return Pwrite(fd, p, -1)
113 }
114
115 var ioSync int64
116
117 //sys   fd2path(fd int, buf []byte) (err error)
118 func Fd2path(fd int) (path string, err error) {
119         var buf [512]byte
120
121         e := fd2path(fd, buf[:])
122         if e != nil {
123                 return "", e
124         }
125         return cstring(buf[:]), nil
126 }
127
128 //sys   pipe(p *[2]int32) (err error)
129 func Pipe(p []int) (err error) {
130         if len(p) != 2 {
131                 return syscall.ErrorString("bad arg in system call")
132         }
133         var pp [2]int32
134         err = pipe(&pp)
135         p[0] = int(pp[0])
136         p[1] = int(pp[1])
137         return
138 }
139
140 // Underlying system call writes to newoffset via pointer.
141 // Implemented in assembly to avoid allocation.
142 func seek(placeholder uintptr, fd int, offset int64, whence int) (newoffset int64, err string)
143
144 func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
145         newoffset, e := seek(0, fd, offset, whence)
146
147         if newoffset == -1 {
148                 err = syscall.ErrorString(e)
149         }
150         return
151 }
152
153 func Mkdir(path string, mode uint32) (err error) {
154         fd, err := Create(path, O_RDONLY, DMDIR|mode)
155
156         if fd != -1 {
157                 Close(fd)
158         }
159
160         return
161 }
162
163 type Waitmsg struct {
164         Pid  int
165         Time [3]uint32
166         Msg  string
167 }
168
169 func (w Waitmsg) Exited() bool   { return true }
170 func (w Waitmsg) Signaled() bool { return false }
171
172 func (w Waitmsg) ExitStatus() int {
173         if len(w.Msg) == 0 {
174                 // a normal exit returns no message
175                 return 0
176         }
177         return 1
178 }
179
180 //sys   await(s []byte) (n int, err error)
181 func Await(w *Waitmsg) (err error) {
182         var buf [512]byte
183         var f [5][]byte
184
185         n, err := await(buf[:])
186
187         if err != nil || w == nil {
188                 return
189         }
190
191         nf := 0
192         p := 0
193         for i := 0; i < n && nf < len(f)-1; i++ {
194                 if buf[i] == ' ' {
195                         f[nf] = buf[p:i]
196                         p = i + 1
197                         nf++
198                 }
199         }
200         f[nf] = buf[p:]
201         nf++
202
203         if nf != len(f) {
204                 return syscall.ErrorString("invalid wait message")
205         }
206         w.Pid = int(atoi(f[0]))
207         w.Time[0] = uint32(atoi(f[1]))
208         w.Time[1] = uint32(atoi(f[2]))
209         w.Time[2] = uint32(atoi(f[3]))
210         w.Msg = cstring(f[4])
211         if w.Msg == "''" {
212                 // await() returns '' for no error
213                 w.Msg = ""
214         }
215         return
216 }
217
218 func Unmount(name, old string) (err error) {
219         fixwd()
220         oldp, err := BytePtrFromString(old)
221         if err != nil {
222                 return err
223         }
224         oldptr := uintptr(unsafe.Pointer(oldp))
225
226         var r0 uintptr
227         var e syscall.ErrorString
228
229         // bind(2) man page: If name is zero, everything bound or mounted upon old is unbound or unmounted.
230         if name == "" {
231                 r0, _, e = Syscall(SYS_UNMOUNT, _zero, oldptr, 0)
232         } else {
233                 namep, err := BytePtrFromString(name)
234                 if err != nil {
235                         return err
236                 }
237                 r0, _, e = Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(namep)), oldptr, 0)
238         }
239
240         if int32(r0) == -1 {
241                 err = e
242         }
243         return
244 }
245
246 func Fchdir(fd int) (err error) {
247         path, err := Fd2path(fd)
248
249         if err != nil {
250                 return
251         }
252
253         return Chdir(path)
254 }
255
256 type Timespec struct {
257         Sec  int32
258         Nsec int32
259 }
260
261 type Timeval struct {
262         Sec  int32
263         Usec int32
264 }
265
266 func NsecToTimeval(nsec int64) (tv Timeval) {
267         nsec += 999 // round up to microsecond
268         tv.Usec = int32(nsec % 1e9 / 1e3)
269         tv.Sec = int32(nsec / 1e9)
270         return
271 }
272
273 func nsec() int64 {
274         var scratch int64
275
276         r0, _, _ := Syscall(SYS_NSEC, uintptr(unsafe.Pointer(&scratch)), 0, 0)
277         // TODO(aram): remove hack after I fix _nsec in the pc64 kernel.
278         if r0 == 0 {
279                 return scratch
280         }
281         return int64(r0)
282 }
283
284 func Gettimeofday(tv *Timeval) error {
285         nsec := nsec()
286         *tv = NsecToTimeval(nsec)
287         return nil
288 }
289
290 func Getpagesize() int { return 0x1000 }
291
292 func Getegid() (egid int) { return -1 }
293 func Geteuid() (euid int) { return -1 }
294 func Getgid() (gid int)   { return -1 }
295 func Getuid() (uid int)   { return -1 }
296
297 func Getgroups() (gids []int, err error) {
298         return make([]int, 0), nil
299 }
300
301 //sys   open(path string, mode int) (fd int, err error)
302 func Open(path string, mode int) (fd int, err error) {
303         fixwd()
304         return open(path, mode)
305 }
306
307 //sys   create(path string, mode int, perm uint32) (fd int, err error)
308 func Create(path string, mode int, perm uint32) (fd int, err error) {
309         fixwd()
310         return create(path, mode, perm)
311 }
312
313 //sys   remove(path string) (err error)
314 func Remove(path string) error {
315         fixwd()
316         return remove(path)
317 }
318
319 //sys   stat(path string, edir []byte) (n int, err error)
320 func Stat(path string, edir []byte) (n int, err error) {
321         fixwd()
322         return stat(path, edir)
323 }
324
325 //sys   bind(name string, old string, flag int) (err error)
326 func Bind(name string, old string, flag int) (err error) {
327         fixwd()
328         return bind(name, old, flag)
329 }
330
331 //sys   mount(fd int, afd int, old string, flag int, aname string) (err error)
332 func Mount(fd int, afd int, old string, flag int, aname string) (err error) {
333         fixwd()
334         return mount(fd, afd, old, flag, aname)
335 }
336
337 //sys   wstat(path string, edir []byte) (err error)
338 func Wstat(path string, edir []byte) (err error) {
339         fixwd()
340         return wstat(path, edir)
341 }
342
343 //sys   chdir(path string) (err error)
344 //sys   Dup(oldfd int, newfd int) (fd int, err error)
345 //sys   Pread(fd int, p []byte, offset int64) (n int, err error)
346 //sys   Pwrite(fd int, p []byte, offset int64) (n int, err error)
347 //sys   Close(fd int) (err error)
348 //sys   Fstat(fd int, edir []byte) (n int, err error)
349 //sys   Fwstat(fd int, edir []byte) (err error)