vendor/golang.org/x/sys/unix/syscall_unix.go
changeset 260 445e01aede7e
parent 256 6d9efbef00a9
child 262 8d3354485fc3
equal deleted inserted replaced
259:db4911b0c721 260:445e01aede7e
   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 {
   427 		NsecToTimespec(TimevalToNsec(tv[0])),
   542 		NsecToTimespec(TimevalToNsec(tv[0])),
   428 		NsecToTimespec(TimevalToNsec(tv[1])),
   543 		NsecToTimespec(TimevalToNsec(tv[1])),
   429 	}
   544 	}
   430 	return UtimesNanoAt(AT_FDCWD, path, ts, AT_SYMLINK_NOFOLLOW)
   545 	return UtimesNanoAt(AT_FDCWD, path, ts, AT_SYMLINK_NOFOLLOW)
   431 }
   546 }
       
   547 
       
   548 // emptyIovec reports whether there are no bytes in the slice of Iovec.
       
   549 func emptyIovecs(iov []Iovec) bool {
       
   550 	for i := range iov {
       
   551 		if iov[i].Len > 0 {
       
   552 			return false
       
   553 		}
       
   554 	}
       
   555 	return true
       
   556 }