annotate vendor/golang.org/x/sys/unix/syscall_unix.go @ 68:4b79810863f6 draft

Ready to release 0.6.0 Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Wed, 13 Sep 2023 10:49:50 +0000
parents 787b5ee0289d
children
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 //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 package unix
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 import (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 "bytes"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 "sort"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 "sync"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14 "syscall"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 "unsafe"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 var (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 Stdin = 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 Stdout = 1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 Stderr = 2
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 // Do the interface allocations only once for common
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 // Errno values.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 var (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 errEAGAIN error = syscall.EAGAIN
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28 errEINVAL error = syscall.EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 errENOENT error = syscall.ENOENT
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 var (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33 signalNameMapOnce sync.Once
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 signalNameMap map[string]syscall.Signal
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 // errnoErr returns common boxed Errno values, to prevent
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 // allocations at runtime.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 func errnoErr(e syscall.Errno) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 switch e {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 case 0:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 case EAGAIN:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 return errEAGAIN
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 case EINVAL:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46 return errEINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47 case ENOENT:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 return errENOENT
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 return e
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 // ErrnoName returns the error name for error number e.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 func ErrnoName(e syscall.Errno) string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55 i := sort.Search(len(errorList), func(i int) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 return errorList[i].num >= e
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57 })
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 if i < len(errorList) && errorList[i].num == e {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 return errorList[i].name
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61 return ""
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 // SignalName returns the signal name for signal number s.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65 func SignalName(s syscall.Signal) string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66 i := sort.Search(len(signalList), func(i int) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 return signalList[i].num >= s
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 })
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69 if i < len(signalList) && signalList[i].num == s {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 return signalList[i].name
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 return ""
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 // SignalNum returns the syscall.Signal for signal named s,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76 // or 0 if a signal with such name is not found.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 // The signal name should start with "SIG".
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 func SignalNum(s string) syscall.Signal {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 signalNameMapOnce.Do(func() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 signalNameMap = make(map[string]syscall.Signal, len(signalList))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81 for _, signal := range signalList {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82 signalNameMap[signal.name] = signal.num
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84 })
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 return signalNameMap[s]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 // clen returns the index of the first NULL byte in n or len(n) if n contains no NULL byte.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 func clen(n []byte) int {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90 i := bytes.IndexByte(n, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91 if i == -1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92 i = len(n)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94 return i
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 // Mmap manager, for use by operating system-specific implementations.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99 type mmapper struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100 sync.Mutex
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101 active map[*byte][]byte // active mappings; key is last byte in mapping
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102 mmap func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 munmap func(addr uintptr, length uintptr) error
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107 if length <= 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 return nil, EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 // Map the requested memory.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112 addr, errno := m.mmap(0, uintptr(length), prot, flags, fd, offset)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113 if errno != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 return nil, errno
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
116
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
117 // Use unsafe to convert addr into a []byte.
68
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
118 b := unsafe.Slice((*byte)(unsafe.Pointer(addr)), length)
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
119
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
120 // Register mapping in m and return it.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
121 p := &b[cap(b)-1]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
122 m.Lock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
123 defer m.Unlock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
124 m.active[p] = b
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
125 return b, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
126 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
127
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
128 func (m *mmapper) Munmap(data []byte) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
129 if len(data) == 0 || len(data) != cap(data) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
130 return EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
131 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
132
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
133 // Find the base of the mapping.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
134 p := &data[cap(data)-1]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
135 m.Lock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
136 defer m.Unlock()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
137 b := m.active[p]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
138 if b == nil || &b[0] != &data[0] {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
139 return EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
140 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
141
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
142 // Unmap the memory and update m.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
143 if errno := m.munmap(uintptr(unsafe.Pointer(&b[0])), uintptr(len(b))); errno != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
144 return errno
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
145 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
146 delete(m.active, p)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
147 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
148 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
149
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
150 func Read(fd int, p []byte) (n int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
151 n, err = read(fd, p)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
152 if raceenabled {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
153 if n > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
154 raceWriteRange(unsafe.Pointer(&p[0]), n)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
155 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
156 if err == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
157 raceAcquire(unsafe.Pointer(&ioSync))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
158 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
159 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
160 return
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 func Write(fd int, p []byte) (n int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
164 if raceenabled {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
165 raceReleaseMerge(unsafe.Pointer(&ioSync))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
166 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
167 n, err = write(fd, p)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
168 if raceenabled && n > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
169 raceReadRange(unsafe.Pointer(&p[0]), n)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
170 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
171 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
172 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
173
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
174 func Pread(fd int, p []byte, offset int64) (n int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
175 n, err = pread(fd, p, offset)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
176 if raceenabled {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
177 if n > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
178 raceWriteRange(unsafe.Pointer(&p[0]), n)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
179 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
180 if err == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
181 raceAcquire(unsafe.Pointer(&ioSync))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
182 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
183 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
184 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
185 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
186
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
187 func Pwrite(fd int, p []byte, offset int64) (n int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
188 if raceenabled {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
189 raceReleaseMerge(unsafe.Pointer(&ioSync))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
190 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
191 n, err = pwrite(fd, p, offset)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
192 if raceenabled && n > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
193 raceReadRange(unsafe.Pointer(&p[0]), n)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
194 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
195 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
196 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
197
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
198 // For testing: clients can set this flag to force
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
199 // creation of IPv6 sockets to return EAFNOSUPPORT.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
200 var SocketDisableIPv6 bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
201
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
202 // Sockaddr represents a socket address.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
203 type Sockaddr interface {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
204 sockaddr() (ptr unsafe.Pointer, len _Socklen, err error) // lowercase; only we can define Sockaddrs
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
205 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
206
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
207 // SockaddrInet4 implements the Sockaddr interface for AF_INET type sockets.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
208 type SockaddrInet4 struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
209 Port int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
210 Addr [4]byte
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
211 raw RawSockaddrInet4
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
212 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
213
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
214 // SockaddrInet6 implements the Sockaddr interface for AF_INET6 type sockets.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
215 type SockaddrInet6 struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
216 Port int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
217 ZoneId uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
218 Addr [16]byte
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
219 raw RawSockaddrInet6
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
220 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
221
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
222 // SockaddrUnix implements the Sockaddr interface for AF_UNIX type sockets.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
223 type SockaddrUnix struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
224 Name string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
225 raw RawSockaddrUnix
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
226 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
227
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
228 func Bind(fd int, sa Sockaddr) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
229 ptr, n, err := sa.sockaddr()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
230 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
231 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
232 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
233 return bind(fd, ptr, n)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
234 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
235
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
236 func Connect(fd int, sa Sockaddr) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
237 ptr, n, err := sa.sockaddr()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
238 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
239 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
240 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
241 return connect(fd, ptr, n)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
242 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
243
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
244 func Getpeername(fd int) (sa Sockaddr, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
245 var rsa RawSockaddrAny
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
246 var len _Socklen = SizeofSockaddrAny
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
247 if err = getpeername(fd, &rsa, &len); err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
248 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
249 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
250 return anyToSockaddr(fd, &rsa)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
251 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
252
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
253 func GetsockoptByte(fd, level, opt int) (value byte, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
254 var n byte
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
255 vallen := _Socklen(1)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
256 err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
257 return n, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
258 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
259
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
260 func GetsockoptInt(fd, level, opt int) (value int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
261 var n int32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
262 vallen := _Socklen(4)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
263 err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
264 return int(n), err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
265 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
266
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
267 func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
268 vallen := _Socklen(4)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
269 err = getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
270 return value, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
271 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
272
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
273 func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
274 var value IPMreq
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
275 vallen := _Socklen(SizeofIPMreq)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
276 err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
277 return &value, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
278 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
279
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
280 func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
281 var value IPv6Mreq
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
282 vallen := _Socklen(SizeofIPv6Mreq)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
283 err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
284 return &value, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
285 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
286
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
287 func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
288 var value IPv6MTUInfo
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
289 vallen := _Socklen(SizeofIPv6MTUInfo)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
290 err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
291 return &value, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
292 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
293
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
294 func GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
295 var value ICMPv6Filter
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
296 vallen := _Socklen(SizeofICMPv6Filter)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
297 err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
298 return &value, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
299 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
300
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
301 func GetsockoptLinger(fd, level, opt int) (*Linger, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
302 var linger Linger
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
303 vallen := _Socklen(SizeofLinger)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
304 err := getsockopt(fd, level, opt, unsafe.Pointer(&linger), &vallen)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
305 return &linger, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
306 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
307
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
308 func GetsockoptTimeval(fd, level, opt int) (*Timeval, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
309 var tv Timeval
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
310 vallen := _Socklen(unsafe.Sizeof(tv))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
311 err := getsockopt(fd, level, opt, unsafe.Pointer(&tv), &vallen)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
312 return &tv, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
313 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
314
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
315 func GetsockoptUint64(fd, level, opt int) (value uint64, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
316 var n uint64
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
317 vallen := _Socklen(8)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
318 err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
319 return n, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
320 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
321
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
322 func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
323 var rsa RawSockaddrAny
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
324 var len _Socklen = SizeofSockaddrAny
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
325 if n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
326 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
327 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
328 if rsa.Addr.Family != AF_UNSPEC {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
329 from, err = anyToSockaddr(fd, &rsa)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
330 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
331 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
332 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
333
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
334 func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
335 var iov [1]Iovec
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
336 if len(p) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
337 iov[0].Base = &p[0]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
338 iov[0].SetLen(len(p))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
339 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
340 var rsa RawSockaddrAny
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
341 n, oobn, recvflags, err = recvmsgRaw(fd, iov[:], oob, flags, &rsa)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
342 // source address is only specified if the socket is unconnected
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
343 if rsa.Addr.Family != AF_UNSPEC {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
344 from, err = anyToSockaddr(fd, &rsa)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
345 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
346 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
347 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
348
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
349 // RecvmsgBuffers receives a message from a socket using the recvmsg
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
350 // system call. The flags are passed to recvmsg. Any non-control data
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
351 // read is scattered into the buffers slices. The results are:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
352 // - n is the number of non-control data read into bufs
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
353 // - oobn is the number of control data read into oob; this may be interpreted using [ParseSocketControlMessage]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
354 // - recvflags is flags returned by recvmsg
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
355 // - from is the address of the sender
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
356 func RecvmsgBuffers(fd int, buffers [][]byte, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
357 iov := make([]Iovec, len(buffers))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
358 for i := range buffers {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
359 if len(buffers[i]) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
360 iov[i].Base = &buffers[i][0]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
361 iov[i].SetLen(len(buffers[i]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
362 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
363 iov[i].Base = (*byte)(unsafe.Pointer(&_zero))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
364 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
365 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
366 var rsa RawSockaddrAny
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
367 n, oobn, recvflags, err = recvmsgRaw(fd, iov, oob, flags, &rsa)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
368 if err == nil && rsa.Addr.Family != AF_UNSPEC {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
369 from, err = anyToSockaddr(fd, &rsa)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
370 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
371 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
372 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
373
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
374 func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
375 _, err = SendmsgN(fd, p, oob, to, flags)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
376 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
377 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
378
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
379 func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
380 var iov [1]Iovec
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
381 if len(p) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
382 iov[0].Base = &p[0]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
383 iov[0].SetLen(len(p))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
384 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
385 var ptr unsafe.Pointer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
386 var salen _Socklen
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
387 if to != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
388 ptr, salen, err = to.sockaddr()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
389 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
390 return 0, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
391 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
392 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
393 return sendmsgN(fd, iov[:], oob, ptr, salen, flags)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
394 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
395
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
396 // SendmsgBuffers sends a message on a socket to an address using the sendmsg
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
397 // system call. The flags are passed to sendmsg. Any non-control data written
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
398 // is gathered from buffers. The function returns the number of bytes written
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
399 // to the socket.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
400 func SendmsgBuffers(fd int, buffers [][]byte, oob []byte, to Sockaddr, flags int) (n int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
401 iov := make([]Iovec, len(buffers))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
402 for i := range buffers {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
403 if len(buffers[i]) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
404 iov[i].Base = &buffers[i][0]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
405 iov[i].SetLen(len(buffers[i]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
406 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
407 iov[i].Base = (*byte)(unsafe.Pointer(&_zero))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
408 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
409 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
410 var ptr unsafe.Pointer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
411 var salen _Socklen
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
412 if to != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
413 ptr, salen, err = to.sockaddr()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
414 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
415 return 0, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
416 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
417 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
418 return sendmsgN(fd, iov, oob, ptr, salen, flags)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
419 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
420
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
421 func Send(s int, buf []byte, flags int) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
422 return sendto(s, buf, flags, nil, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
423 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
424
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
425 func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) {
68
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
426 var ptr unsafe.Pointer
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
427 var salen _Socklen
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
428 if to != nil {
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
429 ptr, salen, err = to.sockaddr()
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
430 if err != nil {
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
431 return err
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
432 }
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
433 }
68
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
434 return sendto(fd, p, flags, ptr, salen)
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
435 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
436
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
437 func SetsockoptByte(fd, level, opt int, value byte) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
438 return setsockopt(fd, level, opt, unsafe.Pointer(&value), 1)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
439 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
440
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
441 func SetsockoptInt(fd, level, opt int, value int) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
442 var n = int32(value)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
443 return setsockopt(fd, level, opt, unsafe.Pointer(&n), 4)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
444 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
445
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
446 func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
447 return setsockopt(fd, level, opt, unsafe.Pointer(&value[0]), 4)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
448 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
449
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
450 func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
451 return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPMreq)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
452 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
453
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
454 func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
455 return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPv6Mreq)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
456 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
457
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
458 func SetsockoptICMPv6Filter(fd, level, opt int, filter *ICMPv6Filter) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
459 return setsockopt(fd, level, opt, unsafe.Pointer(filter), SizeofICMPv6Filter)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
460 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
461
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
462 func SetsockoptLinger(fd, level, opt int, l *Linger) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
463 return setsockopt(fd, level, opt, unsafe.Pointer(l), SizeofLinger)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
464 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
465
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
466 func SetsockoptString(fd, level, opt int, s string) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
467 var p unsafe.Pointer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
468 if len(s) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
469 p = unsafe.Pointer(&[]byte(s)[0])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
470 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
471 return setsockopt(fd, level, opt, p, uintptr(len(s)))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
472 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
473
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
474 func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
475 return setsockopt(fd, level, opt, unsafe.Pointer(tv), unsafe.Sizeof(*tv))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
476 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
477
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
478 func SetsockoptUint64(fd, level, opt int, value uint64) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
479 return setsockopt(fd, level, opt, unsafe.Pointer(&value), 8)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
480 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
481
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
482 func Socket(domain, typ, proto int) (fd int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
483 if domain == AF_INET6 && SocketDisableIPv6 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
484 return -1, EAFNOSUPPORT
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
485 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
486 fd, err = socket(domain, typ, proto)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
487 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
488 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
489
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
490 func Socketpair(domain, typ, proto int) (fd [2]int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
491 var fdx [2]int32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
492 err = socketpair(domain, typ, proto, &fdx)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
493 if err == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
494 fd[0] = int(fdx[0])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
495 fd[1] = int(fdx[1])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
496 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
497 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
498 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
499
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
500 var ioSync int64
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
501
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
502 func CloseOnExec(fd int) { fcntl(fd, F_SETFD, FD_CLOEXEC) }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
503
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
504 func SetNonblock(fd int, nonblocking bool) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
505 flag, err := fcntl(fd, F_GETFL, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
506 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
507 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
508 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
509 if nonblocking {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
510 flag |= O_NONBLOCK
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
511 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
512 flag &= ^O_NONBLOCK
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
513 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
514 _, err = fcntl(fd, F_SETFL, flag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
515 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
516 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
517
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
518 // Exec calls execve(2), which replaces the calling executable in the process
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
519 // tree. argv0 should be the full path to an executable ("/bin/ls") and the
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
520 // executable name should also be the first argument in argv (["ls", "-l"]).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
521 // envv are the environment variables that should be passed to the new
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
522 // process (["USER=go", "PWD=/tmp"]).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
523 func Exec(argv0 string, argv []string, envv []string) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
524 return syscall.Exec(argv0, argv, envv)
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 // Lutimes sets the access and modification times tv on path. If path refers to
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
528 // a symlink, it is not dereferenced and the timestamps are set on the symlink.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
529 // If tv is nil, the access and modification times are set to the current time.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
530 // Otherwise tv must contain exactly 2 elements, with access time as the first
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
531 // element and modification time as the second element.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
532 func Lutimes(path string, tv []Timeval) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
533 if tv == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
534 return UtimesNanoAt(AT_FDCWD, path, nil, AT_SYMLINK_NOFOLLOW)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
535 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
536 if len(tv) != 2 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
537 return EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
538 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
539 ts := []Timespec{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
540 NsecToTimespec(TimevalToNsec(tv[0])),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
541 NsecToTimespec(TimevalToNsec(tv[1])),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
542 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
543 return UtimesNanoAt(AT_FDCWD, path, ts, AT_SYMLINK_NOFOLLOW)
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 // emptyIovec reports whether there are no bytes in the slice of Iovec.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
547 func emptyIovecs(iov []Iovec) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
548 for i := range iov {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
549 if iov[i].Len > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
550 return false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
551 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
552 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
553 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
554 }