vendor/golang.org/x/sys/unix/syscall_bsd.go
changeset 260 445e01aede7e
parent 256 6d9efbef00a9
equal deleted inserted replaced
259:db4911b0c721 260:445e01aede7e
   161 	sa.raw.Len = SizeofSockaddrInet4
   161 	sa.raw.Len = SizeofSockaddrInet4
   162 	sa.raw.Family = AF_INET
   162 	sa.raw.Family = AF_INET
   163 	p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
   163 	p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
   164 	p[0] = byte(sa.Port >> 8)
   164 	p[0] = byte(sa.Port >> 8)
   165 	p[1] = byte(sa.Port)
   165 	p[1] = byte(sa.Port)
   166 	for i := 0; i < len(sa.Addr); i++ {
   166 	sa.raw.Addr = sa.Addr
   167 		sa.raw.Addr[i] = sa.Addr[i]
       
   168 	}
       
   169 	return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
   167 	return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
   170 }
   168 }
   171 
   169 
   172 func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) {
   170 func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) {
   173 	if sa.Port < 0 || sa.Port > 0xFFFF {
   171 	if sa.Port < 0 || sa.Port > 0xFFFF {
   177 	sa.raw.Family = AF_INET6
   175 	sa.raw.Family = AF_INET6
   178 	p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
   176 	p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
   179 	p[0] = byte(sa.Port >> 8)
   177 	p[0] = byte(sa.Port >> 8)
   180 	p[1] = byte(sa.Port)
   178 	p[1] = byte(sa.Port)
   181 	sa.raw.Scope_id = sa.ZoneId
   179 	sa.raw.Scope_id = sa.ZoneId
   182 	for i := 0; i < len(sa.Addr); i++ {
   180 	sa.raw.Addr = sa.Addr
   183 		sa.raw.Addr[i] = sa.Addr[i]
       
   184 	}
       
   185 	return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
   181 	return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
   186 }
   182 }
   187 
   183 
   188 func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {
   184 func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {
   189 	name := sa.Name
   185 	name := sa.Name
   208 	sa.raw.Index = sa.Index
   204 	sa.raw.Index = sa.Index
   209 	sa.raw.Type = sa.Type
   205 	sa.raw.Type = sa.Type
   210 	sa.raw.Nlen = sa.Nlen
   206 	sa.raw.Nlen = sa.Nlen
   211 	sa.raw.Alen = sa.Alen
   207 	sa.raw.Alen = sa.Alen
   212 	sa.raw.Slen = sa.Slen
   208 	sa.raw.Slen = sa.Slen
   213 	for i := 0; i < len(sa.raw.Data); i++ {
   209 	sa.raw.Data = sa.Data
   214 		sa.raw.Data[i] = sa.Data[i]
       
   215 	}
       
   216 	return unsafe.Pointer(&sa.raw), SizeofSockaddrDatalink, nil
   210 	return unsafe.Pointer(&sa.raw), SizeofSockaddrDatalink, nil
   217 }
   211 }
   218 
   212 
   219 func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
   213 func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
   220 	switch rsa.Addr.Family {
   214 	switch rsa.Addr.Family {
   226 		sa.Index = pp.Index
   220 		sa.Index = pp.Index
   227 		sa.Type = pp.Type
   221 		sa.Type = pp.Type
   228 		sa.Nlen = pp.Nlen
   222 		sa.Nlen = pp.Nlen
   229 		sa.Alen = pp.Alen
   223 		sa.Alen = pp.Alen
   230 		sa.Slen = pp.Slen
   224 		sa.Slen = pp.Slen
   231 		for i := 0; i < len(sa.Data); i++ {
   225 		sa.Data = pp.Data
   232 			sa.Data[i] = pp.Data[i]
       
   233 		}
       
   234 		return sa, nil
   226 		return sa, nil
   235 
   227 
   236 	case AF_UNIX:
   228 	case AF_UNIX:
   237 		pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
   229 		pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
   238 		if pp.Len < 2 || pp.Len > SizeofSockaddrUnix {
   230 		if pp.Len < 2 || pp.Len > SizeofSockaddrUnix {
   260 	case AF_INET:
   252 	case AF_INET:
   261 		pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
   253 		pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
   262 		sa := new(SockaddrInet4)
   254 		sa := new(SockaddrInet4)
   263 		p := (*[2]byte)(unsafe.Pointer(&pp.Port))
   255 		p := (*[2]byte)(unsafe.Pointer(&pp.Port))
   264 		sa.Port = int(p[0])<<8 + int(p[1])
   256 		sa.Port = int(p[0])<<8 + int(p[1])
   265 		for i := 0; i < len(sa.Addr); i++ {
   257 		sa.Addr = pp.Addr
   266 			sa.Addr[i] = pp.Addr[i]
       
   267 		}
       
   268 		return sa, nil
   258 		return sa, nil
   269 
   259 
   270 	case AF_INET6:
   260 	case AF_INET6:
   271 		pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
   261 		pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
   272 		sa := new(SockaddrInet6)
   262 		sa := new(SockaddrInet6)
   273 		p := (*[2]byte)(unsafe.Pointer(&pp.Port))
   263 		p := (*[2]byte)(unsafe.Pointer(&pp.Port))
   274 		sa.Port = int(p[0])<<8 + int(p[1])
   264 		sa.Port = int(p[0])<<8 + int(p[1])
   275 		sa.ZoneId = pp.Scope_id
   265 		sa.ZoneId = pp.Scope_id
   276 		for i := 0; i < len(sa.Addr); i++ {
   266 		sa.Addr = pp.Addr
   277 			sa.Addr[i] = pp.Addr[i]
       
   278 		}
       
   279 		return sa, nil
   267 		return sa, nil
   280 	}
   268 	}
   281 	return anyToSockaddrGOOS(fd, rsa)
   269 	return anyToSockaddrGOOS(fd, rsa)
   282 }
   270 }
   283 
   271 
   335 
   323 
   336 //sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
   324 //sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
   337 //sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
   325 //sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
   338 //sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
   326 //sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
   339 
   327 
   340 func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
   328 func recvmsgRaw(fd int, iov []Iovec, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) {
   341 	var msg Msghdr
   329 	var msg Msghdr
   342 	var rsa RawSockaddrAny
   330 	msg.Name = (*byte)(unsafe.Pointer(rsa))
   343 	msg.Name = (*byte)(unsafe.Pointer(&rsa))
       
   344 	msg.Namelen = uint32(SizeofSockaddrAny)
   331 	msg.Namelen = uint32(SizeofSockaddrAny)
   345 	var iov Iovec
       
   346 	if len(p) > 0 {
       
   347 		iov.Base = (*byte)(unsafe.Pointer(&p[0]))
       
   348 		iov.SetLen(len(p))
       
   349 	}
       
   350 	var dummy byte
   332 	var dummy byte
   351 	if len(oob) > 0 {
   333 	if len(oob) > 0 {
   352 		// receive at least one normal byte
   334 		// receive at least one normal byte
   353 		if len(p) == 0 {
   335 		if emptyIovecs(iov) {
   354 			iov.Base = &dummy
   336 			var iova [1]Iovec
   355 			iov.SetLen(1)
   337 			iova[0].Base = &dummy
       
   338 			iova[0].SetLen(1)
       
   339 			iov = iova[:]
   356 		}
   340 		}
   357 		msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
   341 		msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
   358 		msg.SetControllen(len(oob))
   342 		msg.SetControllen(len(oob))
   359 	}
   343 	}
   360 	msg.Iov = &iov
   344 	if len(iov) > 0 {
   361 	msg.Iovlen = 1
   345 		msg.Iov = &iov[0]
       
   346 		msg.SetIovlen(len(iov))
       
   347 	}
   362 	if n, err = recvmsg(fd, &msg, flags); err != nil {
   348 	if n, err = recvmsg(fd, &msg, flags); err != nil {
   363 		return
   349 		return
   364 	}
   350 	}
   365 	oobn = int(msg.Controllen)
   351 	oobn = int(msg.Controllen)
   366 	recvflags = int(msg.Flags)
   352 	recvflags = int(msg.Flags)
   367 	// source address is only specified if the socket is unconnected
       
   368 	if rsa.Addr.Family != AF_UNSPEC {
       
   369 		from, err = anyToSockaddr(fd, &rsa)
       
   370 	}
       
   371 	return
   353 	return
   372 }
   354 }
   373 
   355 
   374 //sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
   356 //sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
   375 
   357 
   376 func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
   358 func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) {
   377 	_, err = SendmsgN(fd, p, oob, to, flags)
       
   378 	return
       
   379 }
       
   380 
       
   381 func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
       
   382 	var ptr unsafe.Pointer
       
   383 	var salen _Socklen
       
   384 	if to != nil {
       
   385 		ptr, salen, err = to.sockaddr()
       
   386 		if err != nil {
       
   387 			return 0, err
       
   388 		}
       
   389 	}
       
   390 	var msg Msghdr
   359 	var msg Msghdr
   391 	msg.Name = (*byte)(unsafe.Pointer(ptr))
   360 	msg.Name = (*byte)(unsafe.Pointer(ptr))
   392 	msg.Namelen = uint32(salen)
   361 	msg.Namelen = uint32(salen)
   393 	var iov Iovec
       
   394 	if len(p) > 0 {
       
   395 		iov.Base = (*byte)(unsafe.Pointer(&p[0]))
       
   396 		iov.SetLen(len(p))
       
   397 	}
       
   398 	var dummy byte
   362 	var dummy byte
       
   363 	var empty bool
   399 	if len(oob) > 0 {
   364 	if len(oob) > 0 {
   400 		// send at least one normal byte
   365 		// send at least one normal byte
   401 		if len(p) == 0 {
   366 		empty = emptyIovecs(iov)
   402 			iov.Base = &dummy
   367 		if empty {
   403 			iov.SetLen(1)
   368 			var iova [1]Iovec
       
   369 			iova[0].Base = &dummy
       
   370 			iova[0].SetLen(1)
       
   371 			iov = iova[:]
   404 		}
   372 		}
   405 		msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
   373 		msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
   406 		msg.SetControllen(len(oob))
   374 		msg.SetControllen(len(oob))
   407 	}
   375 	}
   408 	msg.Iov = &iov
   376 	if len(iov) > 0 {
   409 	msg.Iovlen = 1
   377 		msg.Iov = &iov[0]
       
   378 		msg.SetIovlen(len(iov))
       
   379 	}
   410 	if n, err = sendmsg(fd, &msg, flags); err != nil {
   380 	if n, err = sendmsg(fd, &msg, flags); err != nil {
   411 		return 0, err
   381 		return 0, err
   412 	}
   382 	}
   413 	if len(oob) > 0 && len(p) == 0 {
   383 	if len(oob) > 0 && empty {
   414 		n = 0
   384 		n = 0
   415 	}
   385 	}
   416 	return n, nil
   386 	return n, nil
   417 }
   387 }
   418 
   388 
   581 		return utimes(path, nil)
   551 		return utimes(path, nil)
   582 	}
   552 	}
   583 	if len(ts) != 2 {
   553 	if len(ts) != 2 {
   584 		return EINVAL
   554 		return EINVAL
   585 	}
   555 	}
   586 	// Darwin setattrlist can set nanosecond timestamps
   556 	err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
   587 	err := setattrlistTimes(path, ts, 0)
       
   588 	if err != ENOSYS {
       
   589 		return err
       
   590 	}
       
   591 	err = utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
       
   592 	if err != ENOSYS {
   557 	if err != ENOSYS {
   593 		return err
   558 		return err
   594 	}
   559 	}
   595 	// Not as efficient as it could be because Timespec and
   560 	// Not as efficient as it could be because Timespec and
   596 	// Timeval have different types in the different OSes
   561 	// Timeval have different types in the different OSes
   605 	if ts == nil {
   570 	if ts == nil {
   606 		return utimensat(dirfd, path, nil, flags)
   571 		return utimensat(dirfd, path, nil, flags)
   607 	}
   572 	}
   608 	if len(ts) != 2 {
   573 	if len(ts) != 2 {
   609 		return EINVAL
   574 		return EINVAL
   610 	}
       
   611 	err := setattrlistTimes(path, ts, flags)
       
   612 	if err != ENOSYS {
       
   613 		return err
       
   614 	}
   575 	}
   615 	return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)
   576 	return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)
   616 }
   577 }
   617 
   578 
   618 //sys	futimes(fd int, timeval *[2]Timeval) (err error)
   579 //sys	futimes(fd int, timeval *[2]Timeval) (err error)