annotate vendor/golang.org/x/sys/unix/syscall_solaris.go @ 66:787b5ee0289d draft

Use vendored modules Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Sun, 23 Jul 2023 13:18:53 +0000
parents
children 4b79810863f6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1 // Copyright 2009 The Go Authors. All rights reserved.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
2 // Use of this source code is governed by a BSD-style
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
3 // license that can be found in the LICENSE file.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
4
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 // Solaris system calls.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 // This file is compiled as ordinary Go code,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7 // but it is also input to mksyscall,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 // which parses the //sys lines and generates system call stubs.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9 // Note that sometimes we use a lowercase //sys name and wrap
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 // it in our own nicer implementation, either here or in
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 // syscall_solaris.go or syscall_unix.go.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 package unix
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 import (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16 "fmt"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 "os"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 "runtime"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 "sync"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 "syscall"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 "unsafe"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 // Implemented in runtime/syscall_solaris.go.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 type syscallFunc uintptr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 func rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28 func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 // SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 type SockaddrDatalink struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 Family uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33 Index uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 Type uint8
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 Nlen uint8
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36 Alen uint8
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 Slen uint8
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 Data [244]int8
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 raw RawSockaddrDatalink
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 func direntIno(buf []byte) (uint64, bool) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46 func direntReclen(buf []byte) (uint64, bool) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47 return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 func direntNamlen(buf []byte) (uint64, bool) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 reclen, ok := direntReclen(buf)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 if !ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 return 0, false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55 return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 //sysnb pipe(p *[2]_C_int) (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 func Pipe(p []int) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61 if len(p) != 2 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 return EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 var pp [2]_C_int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65 n, err := pipe(&pp)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66 if n != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69 if err == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 p[0] = int(pp[0])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71 p[1] = int(pp[1])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76 //sysnb pipe2(p *[2]_C_int, flags int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 func Pipe2(p []int, flags int) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 if len(p) != 2 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 return EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82 var pp [2]_C_int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 err := pipe2(&pp, flags)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84 if err == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 p[0] = int(pp[0])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 p[1] = int(pp[1])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91 func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92 if sa.Port < 0 || sa.Port > 0xFFFF {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 return nil, 0, EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95 sa.raw.Family = AF_INET
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 p[0] = byte(sa.Port >> 8)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98 p[1] = byte(sa.Port)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99 sa.raw.Addr = sa.Addr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100 return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104 if sa.Port < 0 || sa.Port > 0xFFFF {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105 return nil, 0, EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107 sa.raw.Family = AF_INET6
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 p[0] = byte(sa.Port >> 8)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110 p[1] = byte(sa.Port)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 sa.raw.Scope_id = sa.ZoneId
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112 sa.raw.Addr = sa.Addr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113 return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
116 func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
117 name := sa.Name
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
118 n := len(name)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
119 if n >= len(sa.raw.Path) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
120 return nil, 0, EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
121 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
122 sa.raw.Family = AF_UNIX
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
123 for i := 0; i < n; i++ {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
124 sa.raw.Path[i] = int8(name[i])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
125 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
126 // length is family (uint16), name, NUL.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
127 sl := _Socklen(2)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
128 if n > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
129 sl += _Socklen(n) + 1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
130 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
131 if sa.raw.Path[0] == '@' {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
132 sa.raw.Path[0] = 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
133 // Don't count trailing NUL for abstract address.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
134 sl--
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
135 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
136
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
137 return unsafe.Pointer(&sa.raw), sl, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
138 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
139
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
140 //sys getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getsockname
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
141
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
142 func Getsockname(fd int) (sa Sockaddr, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
143 var rsa RawSockaddrAny
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
144 var len _Socklen = SizeofSockaddrAny
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
145 if err = getsockname(fd, &rsa, &len); err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
146 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
147 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
148 return anyToSockaddr(fd, &rsa)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
149 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
150
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
151 // GetsockoptString returns the string value of the socket option opt for the
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
152 // socket associated with fd at the given socket level.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
153 func GetsockoptString(fd, level, opt int) (string, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
154 buf := make([]byte, 256)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
155 vallen := _Socklen(len(buf))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
156 err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
157 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
158 return "", err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
159 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
160 return string(buf[:vallen-1]), nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
161 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
162
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
163 const ImplementsGetwd = true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
164
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
165 //sys Getcwd(buf []byte) (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
166
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
167 func Getwd() (wd string, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
168 var buf [PathMax]byte
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
169 // Getcwd will return an error if it failed for any reason.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
170 _, err = Getcwd(buf[0:])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
171 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
172 return "", err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
173 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
174 n := clen(buf[:])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
175 if n < 1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
176 return "", EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
177 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
178 return string(buf[:n]), nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
179 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
180
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
181 /*
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
182 * Wrapped
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
183 */
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
184
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
185 //sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
186 //sysnb setgroups(ngid int, gid *_Gid_t) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
187
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
188 func Getgroups() (gids []int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
189 n, err := getgroups(0, nil)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
190 // Check for error and sanity check group count. Newer versions of
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
191 // Solaris allow up to 1024 (NGROUPS_MAX).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
192 if n < 0 || n > 1024 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
193 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
194 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
195 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
196 return nil, EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
197 } else if n == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
198 return nil, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
199 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
200
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
201 a := make([]_Gid_t, n)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
202 n, err = getgroups(n, &a[0])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
203 if n == -1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
204 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
205 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
206 gids = make([]int, n)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
207 for i, v := range a[0:n] {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
208 gids[i] = int(v)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
209 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
210 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
211 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
212
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
213 func Setgroups(gids []int) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
214 if len(gids) == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
215 return setgroups(0, nil)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
216 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
217
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
218 a := make([]_Gid_t, len(gids))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
219 for i, v := range gids {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
220 a[i] = _Gid_t(v)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
221 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
222 return setgroups(len(a), &a[0])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
223 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
224
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
225 // ReadDirent reads directory entries from fd and writes them into buf.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
226 func ReadDirent(fd int, buf []byte) (n int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
227 // Final argument is (basep *uintptr) and the syscall doesn't take nil.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
228 // TODO(rsc): Can we use a single global basep for all calls?
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
229 return Getdents(fd, buf, new(uintptr))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
230 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
231
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
232 // Wait status is 7 bits at bottom, either 0 (exited),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
233 // 0x7F (stopped), or a signal number that caused an exit.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
234 // The 0x80 bit is whether there was a core dump.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
235 // An extra number (exit code, signal causing a stop)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
236 // is in the high bits.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
237
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
238 type WaitStatus uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
239
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
240 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
241 mask = 0x7F
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
242 core = 0x80
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
243 shift = 8
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
244
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
245 exited = 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
246 stopped = 0x7F
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
247 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
248
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
249 func (w WaitStatus) Exited() bool { return w&mask == exited }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
250
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
251 func (w WaitStatus) ExitStatus() int {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
252 if w&mask != exited {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
253 return -1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
254 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
255 return int(w >> shift)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
256 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
257
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
258 func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
259
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
260 func (w WaitStatus) Signal() syscall.Signal {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
261 sig := syscall.Signal(w & mask)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
262 if sig == stopped || sig == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
263 return -1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
264 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
265 return sig
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
266 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
267
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
268 func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
269
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
270 func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
271
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
272 func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
273
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
274 func (w WaitStatus) StopSignal() syscall.Signal {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
275 if !w.Stopped() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
276 return -1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
277 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
278 return syscall.Signal(w>>shift) & 0xFF
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
279 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
280
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
281 func (w WaitStatus) TrapCause() int { return -1 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
282
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
283 //sys wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
284
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
285 func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (int, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
286 var status _C_int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
287 rpid, err := wait4(int32(pid), &status, options, rusage)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
288 wpid := int(rpid)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
289 if wpid == -1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
290 return wpid, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
291 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
292 if wstatus != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
293 *wstatus = WaitStatus(status)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
294 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
295 return wpid, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
296 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
297
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
298 //sys gethostname(buf []byte) (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
299
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
300 func Gethostname() (name string, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
301 var buf [MaxHostNameLen]byte
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
302 n, err := gethostname(buf[:])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
303 if n != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
304 return "", err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
305 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
306 n = clen(buf[:])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
307 if n < 1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
308 return "", EFAULT
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
309 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
310 return string(buf[:n]), nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
311 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
312
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
313 //sys utimes(path string, times *[2]Timeval) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
314
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
315 func Utimes(path string, tv []Timeval) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
316 if tv == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
317 return utimes(path, nil)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
318 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
319 if len(tv) != 2 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
320 return EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
321 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
322 return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
323 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
324
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
325 //sys utimensat(fd int, path string, times *[2]Timespec, flag int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
326
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
327 func UtimesNano(path string, ts []Timespec) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
328 if ts == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
329 return utimensat(AT_FDCWD, path, nil, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
330 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
331 if len(ts) != 2 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
332 return EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
333 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
334 return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
335 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
336
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
337 func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
338 if ts == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
339 return utimensat(dirfd, path, nil, flags)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
340 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
341 if len(ts) != 2 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
342 return EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
343 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
344 return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
345 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
346
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
347 //sys fcntl(fd int, cmd int, arg int) (val int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
348
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
349 // FcntlInt performs a fcntl syscall on fd with the provided command and argument.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
350 func FcntlInt(fd uintptr, cmd, arg int) (int, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
351 valptr, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(arg), 0, 0, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
352 var err error
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
353 if errno != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
354 err = errno
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
355 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
356 return int(valptr), err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
357 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
358
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
359 // FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
360 func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
361 _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(unsafe.Pointer(lk)), 0, 0, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
362 if e1 != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
363 return e1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
364 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
365 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
366 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
367
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
368 //sys futimesat(fildes int, path *byte, times *[2]Timeval) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
369
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
370 func Futimesat(dirfd int, path string, tv []Timeval) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
371 pathp, err := BytePtrFromString(path)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
372 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
373 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
374 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
375 if tv == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
376 return futimesat(dirfd, pathp, nil)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
377 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
378 if len(tv) != 2 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
379 return EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
380 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
381 return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
382 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
383
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
384 // Solaris doesn't have an futimes function because it allows NULL to be
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
385 // specified as the path for futimesat. However, Go doesn't like
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
386 // NULL-style string interfaces, so this simple wrapper is provided.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
387 func Futimes(fd int, tv []Timeval) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
388 if tv == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
389 return futimesat(fd, nil, nil)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
390 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
391 if len(tv) != 2 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
392 return EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
393 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
394 return futimesat(fd, nil, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
395 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
396
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
397 func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
398 switch rsa.Addr.Family {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
399 case AF_UNIX:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
400 pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
401 sa := new(SockaddrUnix)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
402 // Assume path ends at NUL.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
403 // This is not technically the Solaris semantics for
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
404 // abstract Unix domain sockets -- they are supposed
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
405 // to be uninterpreted fixed-size binary blobs -- but
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
406 // everyone uses this convention.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
407 n := 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
408 for n < len(pp.Path) && pp.Path[n] != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
409 n++
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
410 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
411 bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
412 sa.Name = string(bytes)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
413 return sa, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
414
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
415 case AF_INET:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
416 pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
417 sa := new(SockaddrInet4)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
418 p := (*[2]byte)(unsafe.Pointer(&pp.Port))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
419 sa.Port = int(p[0])<<8 + int(p[1])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
420 sa.Addr = pp.Addr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
421 return sa, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
422
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
423 case AF_INET6:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
424 pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
425 sa := new(SockaddrInet6)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
426 p := (*[2]byte)(unsafe.Pointer(&pp.Port))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
427 sa.Port = int(p[0])<<8 + int(p[1])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
428 sa.ZoneId = pp.Scope_id
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
429 sa.Addr = pp.Addr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
430 return sa, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
431 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
432 return nil, EAFNOSUPPORT
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
433 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
434
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
435 //sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) = libsocket.accept
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
436
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
437 func Accept(fd int) (nfd int, sa Sockaddr, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
438 var rsa RawSockaddrAny
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
439 var len _Socklen = SizeofSockaddrAny
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
440 nfd, err = accept(fd, &rsa, &len)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
441 if nfd == -1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
442 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
443 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
444 sa, err = anyToSockaddr(fd, &rsa)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
445 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
446 Close(nfd)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
447 nfd = 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
448 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
449 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
450 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
451
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
452 //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_recvmsg
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
453
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
454 func recvmsgRaw(fd int, iov []Iovec, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
455 var msg Msghdr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
456 msg.Name = (*byte)(unsafe.Pointer(rsa))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
457 msg.Namelen = uint32(SizeofSockaddrAny)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
458 var dummy byte
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
459 if len(oob) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
460 // receive at least one normal byte
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
461 if emptyIovecs(iov) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
462 var iova [1]Iovec
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
463 iova[0].Base = &dummy
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
464 iova[0].SetLen(1)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
465 iov = iova[:]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
466 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
467 msg.Accrightslen = int32(len(oob))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
468 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
469 if len(iov) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
470 msg.Iov = &iov[0]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
471 msg.SetIovlen(len(iov))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
472 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
473 if n, err = recvmsg(fd, &msg, flags); n == -1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
474 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
475 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
476 oobn = int(msg.Accrightslen)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
477 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
478 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
479
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
480 //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_sendmsg
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
481
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
482 func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
483 var msg Msghdr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
484 msg.Name = (*byte)(unsafe.Pointer(ptr))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
485 msg.Namelen = uint32(salen)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
486 var dummy byte
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
487 var empty bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
488 if len(oob) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
489 // send at least one normal byte
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
490 empty = emptyIovecs(iov)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
491 if empty {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
492 var iova [1]Iovec
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
493 iova[0].Base = &dummy
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
494 iova[0].SetLen(1)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
495 iov = iova[:]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
496 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
497 msg.Accrightslen = int32(len(oob))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
498 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
499 if len(iov) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
500 msg.Iov = &iov[0]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
501 msg.SetIovlen(len(iov))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
502 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
503 if n, err = sendmsg(fd, &msg, flags); err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
504 return 0, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
505 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
506 if len(oob) > 0 && empty {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
507 n = 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
508 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
509 return n, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
510 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
511
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
512 //sys acct(path *byte) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
513
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
514 func Acct(path string) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
515 if len(path) == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
516 // Assume caller wants to disable accounting.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
517 return acct(nil)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
518 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
519
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
520 pathp, err := BytePtrFromString(path)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
521 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
522 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
523 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
524 return acct(pathp)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
525 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
526
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
527 //sys __makedev(version int, major uint, minor uint) (val uint64)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
528
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
529 func Mkdev(major, minor uint32) uint64 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
530 return __makedev(NEWDEV, uint(major), uint(minor))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
531 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
532
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
533 //sys __major(version int, dev uint64) (val uint)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
534
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
535 func Major(dev uint64) uint32 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
536 return uint32(__major(NEWDEV, dev))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
537 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
538
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
539 //sys __minor(version int, dev uint64) (val uint)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
540
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
541 func Minor(dev uint64) uint32 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
542 return uint32(__minor(NEWDEV, dev))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
543 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
544
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
545 /*
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
546 * Expose the ioctl function
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
547 */
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
548
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
549 //sys ioctlRet(fd int, req uint, arg uintptr) (ret int, err error) = libc.ioctl
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
550
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
551 func ioctl(fd int, req uint, arg uintptr) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
552 _, err = ioctlRet(fd, req, arg)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
553 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
554 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
555
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
556 func IoctlSetTermio(fd int, req uint, value *Termio) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
557 err := ioctl(fd, req, uintptr(unsafe.Pointer(value)))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
558 runtime.KeepAlive(value)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
559 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
560 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
561
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
562 func IoctlGetTermio(fd int, req uint) (*Termio, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
563 var value Termio
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
564 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
565 return &value, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
566 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
567
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
568 //sys poll(fds *PollFd, nfds int, timeout int) (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
569
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
570 func Poll(fds []PollFd, timeout int) (n int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
571 if len(fds) == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
572 return poll(nil, 0, timeout)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
573 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
574 return poll(&fds[0], len(fds), timeout)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
575 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
576
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
577 func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
578 if raceenabled {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
579 raceReleaseMerge(unsafe.Pointer(&ioSync))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
580 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
581 return sendfile(outfd, infd, offset, count)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
582 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
583
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
584 /*
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
585 * Exposed directly
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
586 */
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
587 //sys Access(path string, mode uint32) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
588 //sys Adjtime(delta *Timeval, olddelta *Timeval) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
589 //sys Chdir(path string) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
590 //sys Chmod(path string, mode uint32) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
591 //sys Chown(path string, uid int, gid int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
592 //sys Chroot(path string) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
593 //sys Close(fd int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
594 //sys Creat(path string, mode uint32) (fd int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
595 //sys Dup(fd int) (nfd int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
596 //sys Dup2(oldfd int, newfd int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
597 //sys Exit(code int)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
598 //sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
599 //sys Fchdir(fd int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
600 //sys Fchmod(fd int, mode uint32) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
601 //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
602 //sys Fchown(fd int, uid int, gid int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
603 //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
604 //sys Fdatasync(fd int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
605 //sys Flock(fd int, how int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
606 //sys Fpathconf(fd int, name int) (val int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
607 //sys Fstat(fd int, stat *Stat_t) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
608 //sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
609 //sys Fstatvfs(fd int, vfsstat *Statvfs_t) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
610 //sys Getdents(fd int, buf []byte, basep *uintptr) (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
611 //sysnb Getgid() (gid int)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
612 //sysnb Getpid() (pid int)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
613 //sysnb Getpgid(pid int) (pgid int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
614 //sysnb Getpgrp() (pgid int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
615 //sys Geteuid() (euid int)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
616 //sys Getegid() (egid int)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
617 //sys Getppid() (ppid int)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
618 //sys Getpriority(which int, who int) (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
619 //sysnb Getrlimit(which int, lim *Rlimit) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
620 //sysnb Getrusage(who int, rusage *Rusage) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
621 //sysnb Getsid(pid int) (sid int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
622 //sysnb Gettimeofday(tv *Timeval) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
623 //sysnb Getuid() (uid int)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
624 //sys Kill(pid int, signum syscall.Signal) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
625 //sys Lchown(path string, uid int, gid int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
626 //sys Link(path string, link string) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
627 //sys Listen(s int, backlog int) (err error) = libsocket.__xnet_llisten
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
628 //sys Lstat(path string, stat *Stat_t) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
629 //sys Madvise(b []byte, advice int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
630 //sys Mkdir(path string, mode uint32) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
631 //sys Mkdirat(dirfd int, path string, mode uint32) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
632 //sys Mkfifo(path string, mode uint32) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
633 //sys Mkfifoat(dirfd int, path string, mode uint32) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
634 //sys Mknod(path string, mode uint32, dev int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
635 //sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
636 //sys Mlock(b []byte) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
637 //sys Mlockall(flags int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
638 //sys Mprotect(b []byte, prot int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
639 //sys Msync(b []byte, flags int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
640 //sys Munlock(b []byte) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
641 //sys Munlockall() (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
642 //sys Nanosleep(time *Timespec, leftover *Timespec) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
643 //sys Open(path string, mode int, perm uint32) (fd int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
644 //sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
645 //sys Pathconf(path string, name int) (val int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
646 //sys Pause() (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
647 //sys pread(fd int, p []byte, offset int64) (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
648 //sys pwrite(fd int, p []byte, offset int64) (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
649 //sys read(fd int, p []byte) (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
650 //sys Readlink(path string, buf []byte) (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
651 //sys Rename(from string, to string) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
652 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
653 //sys Rmdir(path string) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
654 //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
655 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
656 //sysnb Setegid(egid int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
657 //sysnb Seteuid(euid int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
658 //sysnb Setgid(gid int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
659 //sys Sethostname(p []byte) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
660 //sysnb Setpgid(pid int, pgid int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
661 //sys Setpriority(which int, who int, prio int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
662 //sysnb Setregid(rgid int, egid int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
663 //sysnb Setreuid(ruid int, euid int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
664 //sysnb Setrlimit(which int, lim *Rlimit) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
665 //sysnb Setsid() (pid int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
666 //sysnb Setuid(uid int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
667 //sys Shutdown(s int, how int) (err error) = libsocket.shutdown
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
668 //sys Stat(path string, stat *Stat_t) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
669 //sys Statvfs(path string, vfsstat *Statvfs_t) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
670 //sys Symlink(path string, link string) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
671 //sys Sync() (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
672 //sys Sysconf(which int) (n int64, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
673 //sysnb Times(tms *Tms) (ticks uintptr, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
674 //sys Truncate(path string, length int64) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
675 //sys Fsync(fd int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
676 //sys Ftruncate(fd int, length int64) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
677 //sys Umask(mask int) (oldmask int)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
678 //sysnb Uname(buf *Utsname) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
679 //sys Unmount(target string, flags int) (err error) = libc.umount
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
680 //sys Unlink(path string) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
681 //sys Unlinkat(dirfd int, path string, flags int) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
682 //sys Ustat(dev int, ubuf *Ustat_t) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
683 //sys Utime(path string, buf *Utimbuf) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
684 //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_bind
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
685 //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_connect
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
686 //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
687 //sys munmap(addr uintptr, length uintptr) (err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
688 //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = libsendfile.sendfile
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
689 //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_sendto
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
690 //sys socket(domain int, typ int, proto int) (fd int, err error) = libsocket.__xnet_socket
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
691 //sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) = libsocket.__xnet_socketpair
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
692 //sys write(fd int, p []byte) (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
693 //sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) = libsocket.__xnet_getsockopt
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
694 //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getpeername
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
695 //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) = libsocket.setsockopt
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
696 //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = libsocket.recvfrom
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
697
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
698 func readlen(fd int, buf *byte, nbuf int) (n int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
699 r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
700 n = int(r0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
701 if e1 != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
702 err = e1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
703 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
704 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
705 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
706
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
707 func writelen(fd int, buf *byte, nbuf int) (n int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
708 r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
709 n = int(r0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
710 if e1 != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
711 err = e1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
712 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
713 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
714 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
715
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
716 var mapper = &mmapper{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
717 active: make(map[*byte][]byte),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
718 mmap: mmap,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
719 munmap: munmap,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
720 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
721
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
722 func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
723 return mapper.Mmap(fd, offset, length, prot, flags)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
724 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
725
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
726 func Munmap(b []byte) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
727 return mapper.Munmap(b)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
728 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
729
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
730 // Event Ports
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
731
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
732 type fileObjCookie struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
733 fobj *fileObj
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
734 cookie interface{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
735 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
736
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
737 // EventPort provides a safe abstraction on top of Solaris/illumos Event Ports.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
738 type EventPort struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
739 port int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
740 mu sync.Mutex
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
741 fds map[uintptr]*fileObjCookie
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
742 paths map[string]*fileObjCookie
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
743 // The user cookie presents an interesting challenge from a memory management perspective.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
744 // There are two paths by which we can discover that it is no longer in use:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
745 // 1. The user calls port_dissociate before any events fire
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
746 // 2. An event fires and we return it to the user
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
747 // The tricky situation is if the event has fired in the kernel but
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
748 // the user hasn't requested/received it yet.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
749 // If the user wants to port_dissociate before the event has been processed,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
750 // we should handle things gracefully. To do so, we need to keep an extra
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
751 // reference to the cookie around until the event is processed
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
752 // thus the otherwise seemingly extraneous "cookies" map
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
753 // The key of this map is a pointer to the corresponding &fCookie.cookie
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
754 cookies map[*interface{}]*fileObjCookie
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
755 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
756
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
757 // PortEvent is an abstraction of the port_event C struct.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
758 // Compare Source against PORT_SOURCE_FILE or PORT_SOURCE_FD
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
759 // to see if Path or Fd was the event source. The other will be
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
760 // uninitialized.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
761 type PortEvent struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
762 Cookie interface{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
763 Events int32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
764 Fd uintptr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
765 Path string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
766 Source uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
767 fobj *fileObj
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
768 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
769
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
770 // NewEventPort creates a new EventPort including the
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
771 // underlying call to port_create(3c).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
772 func NewEventPort() (*EventPort, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
773 port, err := port_create()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
774 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
775 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
776 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
777 e := &EventPort{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
778 port: port,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
779 fds: make(map[uintptr]*fileObjCookie),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
780 paths: make(map[string]*fileObjCookie),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
781 cookies: make(map[*interface{}]*fileObjCookie),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
782 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
783 return e, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
784 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
785
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
786 //sys port_create() (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
787 //sys port_associate(port int, source int, object uintptr, events int, user *byte) (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
788 //sys port_dissociate(port int, source int, object uintptr) (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
789 //sys port_get(port int, pe *portEvent, timeout *Timespec) (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
790 //sys port_getn(port int, pe *portEvent, max uint32, nget *uint32, timeout *Timespec) (n int, err error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
791
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
792 // Close closes the event port.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
793 func (e *EventPort) Close() error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
794 e.mu.Lock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
795 defer e.mu.Unlock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
796 err := Close(e.port)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
797 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
798 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
799 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
800 e.fds = nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
801 e.paths = nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
802 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
803 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
804
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
805 // PathIsWatched checks to see if path is associated with this EventPort.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
806 func (e *EventPort) PathIsWatched(path string) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
807 e.mu.Lock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
808 defer e.mu.Unlock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
809 _, found := e.paths[path]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
810 return found
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
811 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
812
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
813 // FdIsWatched checks to see if fd is associated with this EventPort.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
814 func (e *EventPort) FdIsWatched(fd uintptr) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
815 e.mu.Lock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
816 defer e.mu.Unlock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
817 _, found := e.fds[fd]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
818 return found
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
819 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
820
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
821 // AssociatePath wraps port_associate(3c) for a filesystem path including
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
822 // creating the necessary file_obj from the provided stat information.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
823 func (e *EventPort) AssociatePath(path string, stat os.FileInfo, events int, cookie interface{}) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
824 e.mu.Lock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
825 defer e.mu.Unlock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
826 if _, found := e.paths[path]; found {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
827 return fmt.Errorf("%v is already associated with this Event Port", path)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
828 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
829 fobj, err := createFileObj(path, stat)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
830 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
831 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
832 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
833 fCookie := &fileObjCookie{fobj, cookie}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
834 _, err = port_associate(e.port, PORT_SOURCE_FILE, uintptr(unsafe.Pointer(fobj)), events, (*byte)(unsafe.Pointer(&fCookie.cookie)))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
835 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
836 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
837 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
838 e.paths[path] = fCookie
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
839 e.cookies[&fCookie.cookie] = fCookie
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
840 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
841 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
842
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
843 // DissociatePath wraps port_dissociate(3c) for a filesystem path.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
844 func (e *EventPort) DissociatePath(path string) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
845 e.mu.Lock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
846 defer e.mu.Unlock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
847 f, ok := e.paths[path]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
848 if !ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
849 return fmt.Errorf("%v is not associated with this Event Port", path)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
850 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
851 _, err := port_dissociate(e.port, PORT_SOURCE_FILE, uintptr(unsafe.Pointer(f.fobj)))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
852 // If the path is no longer associated with this event port (ENOENT)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
853 // we should delete it from our map. We can still return ENOENT to the caller.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
854 // But we need to save the cookie
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
855 if err != nil && err != ENOENT {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
856 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
857 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
858 if err == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
859 // dissociate was successful, safe to delete the cookie
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
860 fCookie := e.paths[path]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
861 delete(e.cookies, &fCookie.cookie)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
862 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
863 delete(e.paths, path)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
864 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
865 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
866
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
867 // AssociateFd wraps calls to port_associate(3c) on file descriptors.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
868 func (e *EventPort) AssociateFd(fd uintptr, events int, cookie interface{}) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
869 e.mu.Lock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
870 defer e.mu.Unlock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
871 if _, found := e.fds[fd]; found {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
872 return fmt.Errorf("%v is already associated with this Event Port", fd)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
873 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
874 fCookie := &fileObjCookie{nil, cookie}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
875 _, err := port_associate(e.port, PORT_SOURCE_FD, fd, events, (*byte)(unsafe.Pointer(&fCookie.cookie)))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
876 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
877 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
878 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
879 e.fds[fd] = fCookie
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
880 e.cookies[&fCookie.cookie] = fCookie
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
881 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
882 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
883
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
884 // DissociateFd wraps calls to port_dissociate(3c) on file descriptors.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
885 func (e *EventPort) DissociateFd(fd uintptr) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
886 e.mu.Lock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
887 defer e.mu.Unlock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
888 _, ok := e.fds[fd]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
889 if !ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
890 return fmt.Errorf("%v is not associated with this Event Port", fd)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
891 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
892 _, err := port_dissociate(e.port, PORT_SOURCE_FD, fd)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
893 if err != nil && err != ENOENT {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
894 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
895 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
896 if err == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
897 // dissociate was successful, safe to delete the cookie
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
898 fCookie := e.fds[fd]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
899 delete(e.cookies, &fCookie.cookie)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
900 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
901 delete(e.fds, fd)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
902 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
903 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
904
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
905 func createFileObj(name string, stat os.FileInfo) (*fileObj, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
906 fobj := new(fileObj)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
907 bs, err := ByteSliceFromString(name)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
908 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
909 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
910 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
911 fobj.Name = (*int8)(unsafe.Pointer(&bs[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
912 s := stat.Sys().(*syscall.Stat_t)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
913 fobj.Atim.Sec = s.Atim.Sec
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
914 fobj.Atim.Nsec = s.Atim.Nsec
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
915 fobj.Mtim.Sec = s.Mtim.Sec
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
916 fobj.Mtim.Nsec = s.Mtim.Nsec
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
917 fobj.Ctim.Sec = s.Ctim.Sec
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
918 fobj.Ctim.Nsec = s.Ctim.Nsec
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
919 return fobj, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
920 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
921
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
922 // GetOne wraps port_get(3c) and returns a single PortEvent.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
923 func (e *EventPort) GetOne(t *Timespec) (*PortEvent, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
924 pe := new(portEvent)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
925 _, err := port_get(e.port, pe, t)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
926 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
927 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
928 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
929 p := new(PortEvent)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
930 e.mu.Lock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
931 defer e.mu.Unlock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
932 e.peIntToExt(pe, p)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
933 return p, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
934 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
935
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
936 // peIntToExt converts a cgo portEvent struct into the friendlier PortEvent
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
937 // NOTE: Always call this function while holding the e.mu mutex
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
938 func (e *EventPort) peIntToExt(peInt *portEvent, peExt *PortEvent) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
939 peExt.Events = peInt.Events
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
940 peExt.Source = peInt.Source
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
941 cookie := (*interface{})(unsafe.Pointer(peInt.User))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
942 peExt.Cookie = *cookie
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
943 switch peInt.Source {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
944 case PORT_SOURCE_FD:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
945 delete(e.cookies, cookie)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
946 peExt.Fd = uintptr(peInt.Object)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
947 // Only remove the fds entry if it exists and this cookie matches
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
948 if fobj, ok := e.fds[peExt.Fd]; ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
949 if &fobj.cookie == cookie {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
950 delete(e.fds, peExt.Fd)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
951 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
952 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
953 case PORT_SOURCE_FILE:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
954 if fCookie, ok := e.cookies[cookie]; ok && uintptr(unsafe.Pointer(fCookie.fobj)) == uintptr(peInt.Object) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
955 // Use our stashed reference rather than using unsafe on what we got back
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
956 // the unsafe version would be (*fileObj)(unsafe.Pointer(uintptr(peInt.Object)))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
957 peExt.fobj = fCookie.fobj
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
958 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
959 panic("mismanaged memory")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
960 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
961 delete(e.cookies, cookie)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
962 peExt.Path = BytePtrToString((*byte)(unsafe.Pointer(peExt.fobj.Name)))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
963 // Only remove the paths entry if it exists and this cookie matches
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
964 if fobj, ok := e.paths[peExt.Path]; ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
965 if &fobj.cookie == cookie {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
966 delete(e.paths, peExt.Path)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
967 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
968 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
969 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
970 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
971
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
972 // Pending wraps port_getn(3c) and returns how many events are pending.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
973 func (e *EventPort) Pending() (int, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
974 var n uint32 = 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
975 _, err := port_getn(e.port, nil, 0, &n, nil)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
976 return int(n), err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
977 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
978
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
979 // Get wraps port_getn(3c) and fills a slice of PortEvent.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
980 // It will block until either min events have been received
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
981 // or the timeout has been exceeded. It will return how many
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
982 // events were actually received along with any error information.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
983 func (e *EventPort) Get(s []PortEvent, min int, timeout *Timespec) (int, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
984 if min == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
985 return 0, fmt.Errorf("need to request at least one event or use Pending() instead")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
986 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
987 if len(s) < min {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
988 return 0, fmt.Errorf("len(s) (%d) is less than min events requested (%d)", len(s), min)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
989 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
990 got := uint32(min)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
991 max := uint32(len(s))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
992 var err error
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
993 ps := make([]portEvent, max, max)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
994 _, err = port_getn(e.port, &ps[0], max, &got, timeout)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
995 // got will be trustworthy with ETIME, but not any other error.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
996 if err != nil && err != ETIME {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
997 return 0, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
998 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
999 e.mu.Lock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1000 defer e.mu.Unlock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1001 for i := 0; i < int(got); i++ {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1002 e.peIntToExt(&ps[i], &s[i])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1003 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1004 return int(got), err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1005 }