return n, 0, err
}
-func (ffd *fakeNetFD) writeMsgInet4(p []byte, oob []byte, sa *syscall.SockaddrInet4) (n int, oobn int, err error) {
+func (ffd *fakeNetFD) writeMsgInet4(p []byte, oob []byte, sa4 *syscall.SockaddrInet4) (n int, oobn int, err error) {
+ var sa syscall.Sockaddr
+ if sa4 != nil {
+ sa = sa4
+ }
return ffd.writeMsg(p, oob, sa)
}
-func (ffd *fakeNetFD) writeMsgInet6(p []byte, oob []byte, sa *syscall.SockaddrInet6) (n int, oobn int, err error) {
+func (ffd *fakeNetFD) writeMsgInet6(p []byte, oob []byte, sa6 *syscall.SockaddrInet6) (n int, oobn int, err error) {
+ var sa syscall.Sockaddr
+ if sa6 != nil {
+ sa = sa6
+ }
return ffd.writeMsg(p, oob, sa)
}
switch c.fd.family {
case syscall.AF_INET:
- sa, err := addrPortToSockaddrInet4(addr)
- if err != nil {
- return 0, 0, err
+ var sap *syscall.SockaddrInet4
+ if addr.IsValid() {
+ sa, err := addrPortToSockaddrInet4(addr)
+ if err != nil {
+ return 0, 0, err
+ }
+ sap = &sa
}
- return c.fd.writeMsgInet4(b, oob, &sa)
+ return c.fd.writeMsgInet4(b, oob, sap)
case syscall.AF_INET6:
- sa, err := addrPortToSockaddrInet6(addr)
- if err != nil {
- return 0, 0, err
+ var sap *syscall.SockaddrInet6
+ if addr.IsValid() {
+ sa, err := addrPortToSockaddrInet6(addr)
+ if err != nil {
+ return 0, 0, err
+ }
+ sap = &sa
}
- return c.fd.writeMsgInet6(b, oob, &sa)
+ return c.fd.writeMsgInet6(b, oob, sap)
default:
return 0, 0, &AddrError{Err: "invalid address family", Addr: addr.Addr().String()}
}
if err != nil {
t.Fatal(err)
}
+ rap := ra.AddrPort()
+
+ assertErrWriteToConnected := func(t *testing.T, err error) {
+ t.Helper()
+ if e, ok := err.(*OpError); !ok || e.Err != ErrWriteToConnected {
+ t.Errorf("got %v; want ErrWriteToConnected", err)
+ }
+ }
b := []byte("CONNECTED-MODE SOCKET")
+ _, err = c.(*UDPConn).WriteToUDPAddrPort(b, rap)
+ assertErrWriteToConnected(t, err)
_, err = c.(*UDPConn).WriteToUDP(b, ra)
- if err == nil {
- t.Fatal("should fail")
- }
- if err != nil && err.(*OpError).Err != ErrWriteToConnected {
- t.Fatalf("should fail as ErrWriteToConnected: %v", err)
- }
+ assertErrWriteToConnected(t, err)
_, err = c.(*UDPConn).WriteTo(b, ra)
- if err == nil {
- t.Fatal("should fail")
- }
- if err != nil && err.(*OpError).Err != ErrWriteToConnected {
- t.Fatalf("should fail as ErrWriteToConnected: %v", err)
- }
+ assertErrWriteToConnected(t, err)
_, err = c.Write(b)
if err != nil {
- t.Fatal(err)
+ t.Errorf("c.Write(b) = %v; want nil", err)
}
_, _, err = c.(*UDPConn).WriteMsgUDP(b, nil, ra)
- if err == nil {
- t.Fatal("should fail")
- }
- if err != nil && err.(*OpError).Err != ErrWriteToConnected {
- t.Fatalf("should fail as ErrWriteToConnected: %v", err)
- }
+ assertErrWriteToConnected(t, err)
_, _, err = c.(*UDPConn).WriteMsgUDP(b, nil, nil)
if err != nil {
- t.Fatal(err)
+ t.Errorf("c.WriteMsgUDP(b, nil, nil) = %v; want nil", err)
+ }
+ _, _, err = c.(*UDPConn).WriteMsgUDPAddrPort(b, nil, rap)
+ assertErrWriteToConnected(t, err)
+ _, _, err = c.(*UDPConn).WriteMsgUDPAddrPort(b, nil, netip.AddrPort{})
+ if err != nil {
+ t.Errorf("c.WriteMsgUDPAddrPort(b, nil, netip.AddrPort{}) = %v; want nil", err)
}
}