175 raceReadRange(unsafe.Pointer(&p[0]), n) |
175 raceReadRange(unsafe.Pointer(&p[0]), n) |
176 } |
176 } |
177 return |
177 return |
178 } |
178 } |
179 |
179 |
|
180 func Pread(fd int, p []byte, offset int64) (n int, err error) { |
|
181 n, err = pread(fd, p, offset) |
|
182 if raceenabled { |
|
183 if n > 0 { |
|
184 raceWriteRange(unsafe.Pointer(&p[0]), n) |
|
185 } |
|
186 if err == nil { |
|
187 raceAcquire(unsafe.Pointer(&ioSync)) |
|
188 } |
|
189 } |
|
190 return |
|
191 } |
|
192 |
|
193 func Pwrite(fd int, p []byte, offset int64) (n int, err error) { |
|
194 if raceenabled { |
|
195 raceReleaseMerge(unsafe.Pointer(&ioSync)) |
|
196 } |
|
197 n, err = pwrite(fd, p, offset) |
|
198 if raceenabled && n > 0 { |
|
199 raceReadRange(unsafe.Pointer(&p[0]), n) |
|
200 } |
|
201 return |
|
202 } |
|
203 |
180 // For testing: clients can set this flag to force |
204 // For testing: clients can set this flag to force |
181 // creation of IPv6 sockets to return EAFNOSUPPORT. |
205 // creation of IPv6 sockets to return EAFNOSUPPORT. |
182 var SocketDisableIPv6 bool |
206 var SocketDisableIPv6 bool |
183 |
207 |
184 // Sockaddr represents a socket address. |
208 // Sockaddr represents a socket address. |
309 } |
333 } |
310 if rsa.Addr.Family != AF_UNSPEC { |
334 if rsa.Addr.Family != AF_UNSPEC { |
311 from, err = anyToSockaddr(fd, &rsa) |
335 from, err = anyToSockaddr(fd, &rsa) |
312 } |
336 } |
313 return |
337 return |
|
338 } |
|
339 |
|
340 func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { |
|
341 var iov [1]Iovec |
|
342 if len(p) > 0 { |
|
343 iov[0].Base = &p[0] |
|
344 iov[0].SetLen(len(p)) |
|
345 } |
|
346 var rsa RawSockaddrAny |
|
347 n, oobn, recvflags, err = recvmsgRaw(fd, iov[:], oob, flags, &rsa) |
|
348 // source address is only specified if the socket is unconnected |
|
349 if rsa.Addr.Family != AF_UNSPEC { |
|
350 from, err = anyToSockaddr(fd, &rsa) |
|
351 } |
|
352 return |
|
353 } |
|
354 |
|
355 // RecvmsgBuffers receives a message from a socket using the recvmsg |
|
356 // system call. The flags are passed to recvmsg. Any non-control data |
|
357 // read is scattered into the buffers slices. The results are: |
|
358 // - n is the number of non-control data read into bufs |
|
359 // - oobn is the number of control data read into oob; this may be interpreted using [ParseSocketControlMessage] |
|
360 // - recvflags is flags returned by recvmsg |
|
361 // - from is the address of the sender |
|
362 func RecvmsgBuffers(fd int, buffers [][]byte, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { |
|
363 iov := make([]Iovec, len(buffers)) |
|
364 for i := range buffers { |
|
365 if len(buffers[i]) > 0 { |
|
366 iov[i].Base = &buffers[i][0] |
|
367 iov[i].SetLen(len(buffers[i])) |
|
368 } else { |
|
369 iov[i].Base = (*byte)(unsafe.Pointer(&_zero)) |
|
370 } |
|
371 } |
|
372 var rsa RawSockaddrAny |
|
373 n, oobn, recvflags, err = recvmsgRaw(fd, iov, oob, flags, &rsa) |
|
374 if err == nil && rsa.Addr.Family != AF_UNSPEC { |
|
375 from, err = anyToSockaddr(fd, &rsa) |
|
376 } |
|
377 return |
|
378 } |
|
379 |
|
380 func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { |
|
381 _, err = SendmsgN(fd, p, oob, to, flags) |
|
382 return |
|
383 } |
|
384 |
|
385 func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { |
|
386 var iov [1]Iovec |
|
387 if len(p) > 0 { |
|
388 iov[0].Base = &p[0] |
|
389 iov[0].SetLen(len(p)) |
|
390 } |
|
391 var ptr unsafe.Pointer |
|
392 var salen _Socklen |
|
393 if to != nil { |
|
394 ptr, salen, err = to.sockaddr() |
|
395 if err != nil { |
|
396 return 0, err |
|
397 } |
|
398 } |
|
399 return sendmsgN(fd, iov[:], oob, ptr, salen, flags) |
|
400 } |
|
401 |
|
402 // SendmsgBuffers sends a message on a socket to an address using the sendmsg |
|
403 // system call. The flags are passed to sendmsg. Any non-control data written |
|
404 // is gathered from buffers. The function returns the number of bytes written |
|
405 // to the socket. |
|
406 func SendmsgBuffers(fd int, buffers [][]byte, oob []byte, to Sockaddr, flags int) (n int, err error) { |
|
407 iov := make([]Iovec, len(buffers)) |
|
408 for i := range buffers { |
|
409 if len(buffers[i]) > 0 { |
|
410 iov[i].Base = &buffers[i][0] |
|
411 iov[i].SetLen(len(buffers[i])) |
|
412 } else { |
|
413 iov[i].Base = (*byte)(unsafe.Pointer(&_zero)) |
|
414 } |
|
415 } |
|
416 var ptr unsafe.Pointer |
|
417 var salen _Socklen |
|
418 if to != nil { |
|
419 ptr, salen, err = to.sockaddr() |
|
420 if err != nil { |
|
421 return 0, err |
|
422 } |
|
423 } |
|
424 return sendmsgN(fd, iov, oob, ptr, salen, flags) |
|
425 } |
|
426 |
|
427 func Send(s int, buf []byte, flags int) (err error) { |
|
428 return sendto(s, buf, flags, nil, 0) |
314 } |
429 } |
315 |
430 |
316 func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) { |
431 func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) { |
317 ptr, n, err := to.sockaddr() |
432 ptr, n, err := to.sockaddr() |
318 if err != nil { |
433 if err != nil { |