68
68
return fd.net + ":" + ls + "->" + rs
71
func (fd *netFD) connect(la, ra syscall.Sockaddr) error {
71
func (fd *netFD) connect(la, ra syscall.Sockaddr, deadline time.Time) error {
72
72
// Do not need to call fd.writeLock here,
73
73
// because fd is not yet accessible to user,
74
74
// so no concurrent operations are possible.
75
if err := fd.pd.PrepareWrite(); err != nil {
75
switch err := syscall.Connect(fd.sysfd, ra); err {
76
case syscall.EINPROGRESS, syscall.EALREADY, syscall.EINTR:
77
case nil, syscall.EISCONN:
78
if !deadline.IsZero() && deadline.Before(time.Now()) {
81
if err := fd.init(); err != nil {
86
// On Solaris we can see EINVAL if the socket has
87
// already been accepted and closed by the server.
88
// Treat this as a successful connection--writes to
89
// the socket will see EOF. For details and a test
90
// case in C see http://golang.org/issue/6828.
91
if runtime.GOOS == "solaris" {
98
if err := fd.init(); err != nil {
101
if !deadline.IsZero() {
102
fd.setWriteDeadline(deadline)
103
defer fd.setWriteDeadline(noDeadline)
79
err := syscall.Connect(fd.sysfd, ra)
80
if err == nil || err == syscall.EISCONN {
83
if err != syscall.EINPROGRESS && err != syscall.EALREADY && err != syscall.EINTR {
86
if err = fd.pd.WaitWrite(); err != nil {
106
// Performing multiple connect system calls on a
107
// non-blocking socket under Unix variants does not
108
// necessarily result in earlier errors being
109
// returned. Instead, once runtime-integrated network
110
// poller tells us that the socket is ready, get the
111
// SO_ERROR socket option to see if the connection
112
// succeeded or failed. See issue 7474 for further
114
if err := fd.pd.WaitWrite(); err != nil {
117
nerr, err := syscall.GetsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_ERROR)
121
switch err := syscall.Errno(nerr); err {
122
case syscall.EINPROGRESS, syscall.EALREADY, syscall.EINTR:
123
case syscall.Errno(0), syscall.EISCONN:
93
131
func (fd *netFD) destroy() {
245
func (fd *netFD) ReadMsg(p []byte, oob []byte) (n, oobn, flags int, sa syscall.Sockaddr, err error) {
283
func (fd *netFD) readMsg(p []byte, oob []byte) (n, oobn, flags int, sa syscall.Sockaddr, err error) {
246
284
if err := fd.readLock(); err != nil {
247
285
return 0, 0, 0, nil, err
341
func (fd *netFD) WriteMsg(p []byte, oob []byte, sa syscall.Sockaddr) (n int, oobn int, err error) {
379
func (fd *netFD) writeMsg(p []byte, oob []byte, sa syscall.Sockaddr) (n int, oobn int, err error) {
342
380
if err := fd.writeLock(); err != nil {
347
385
return 0, 0, &OpError{"write", fd.net, fd.raddr, err}
350
err = syscall.Sendmsg(fd.sysfd, p, oob, sa, 0)
388
n, err = syscall.SendmsgN(fd.sysfd, p, oob, sa, 0)
351
389
if err == syscall.EAGAIN {
352
390
if err = fd.pd.WaitWrite(); err == nil {
455
492
func (fd *netFD) dup() (f *os.File, err error) {
456
493
ns, err := dupCloseOnExec(fd.sysfd)
458
syscall.ForkLock.RUnlock()
459
495
return nil, &OpError{"dup", fd.net, fd.laddr, err}