1 |
/* Socket-specific operations |
/* Socket-specific operations |
2 |
|
|
3 |
Copyright (C) 1995, 2005 Free Software Foundation, Inc. |
Copyright (C) 1995 Free Software Foundation, Inc. |
4 |
|
|
5 |
Written by Miles Bader <miles@gnu.ai.mit.edu> |
Written by Miles Bader <miles@gnu.ai.mit.edu> |
6 |
|
|
110 |
else if (sock->flags & SOCK_CONNECTED) |
else if (sock->flags & SOCK_CONNECTED) |
111 |
/* SOCK_CONNECTED is only set for connection-oriented sockets, |
/* SOCK_CONNECTED is only set for connection-oriented sockets, |
112 |
which can only ever connect once. [If we didn't do this test |
which can only ever connect once. [If we didn't do this test |
113 |
here, it would eventually fail when the listening socket |
here, it would eventually fail when it the listening socket |
114 |
tried to accept our connection request.] */ |
tried to accept our connection request.] */ |
115 |
err = EISCONN; |
err = EISCONN; |
116 |
else |
else |
118 |
/* Assert that we're trying to connect, so anyone else trying |
/* Assert that we're trying to connect, so anyone else trying |
119 |
to do so will fail with EALREADY. */ |
to do so will fail with EALREADY. */ |
120 |
sock->connect_queue = cq; |
sock->connect_queue = cq; |
121 |
/* Unlock SOCK while waiting. */ |
mutex_unlock (&sock->lock); /* Unlock SOCK while waiting. */ |
|
mutex_unlock (&sock->lock); |
|
122 |
|
|
123 |
err = connq_connect (peer->listen_queue, |
/* Try to connect. */ |
124 |
sock->flags & SOCK_NONBLOCK); |
err = connq_connect (cq, sock->flags & SOCK_NONBLOCK, sock); |
|
if (!err) |
|
|
{ |
|
|
struct sock *server; |
|
|
|
|
|
err = sock_clone (peer, &server); |
|
|
if (!err) |
|
|
{ |
|
|
err = sock_connect (sock, server); |
|
|
if (!err) |
|
|
connq_connect_complete (peer->listen_queue, server); |
|
|
else |
|
|
sock_free (server); |
|
|
} |
|
|
|
|
|
mutex_lock (&sock->lock); |
|
|
if (err) |
|
|
connq_connect_cancel (peer->listen_queue); |
|
|
} |
|
125 |
|
|
126 |
/* We must set CONNECT_QUEUE to NULL, as no one else can |
/* We can safely set CONNECT_QUEUE to NULL, as no one else can |
127 |
set it until we've done so. */ |
set it until we've done so. */ |
128 |
|
mutex_lock (&sock->lock); |
129 |
sock->connect_queue = NULL; |
sock->connect_queue = NULL; |
130 |
} |
} |
|
|
|
131 |
mutex_unlock (&sock->lock); |
mutex_unlock (&sock->lock); |
132 |
} |
} |
133 |
else |
else |
157 |
err = ensure_connq (sock); |
err = ensure_connq (sock); |
158 |
if (!err) |
if (!err) |
159 |
{ |
{ |
160 |
|
struct connq_request *req; |
161 |
struct sock *peer_sock; |
struct sock *peer_sock; |
162 |
|
|
163 |
err = connq_listen (sock->listen_queue, sock->flags & SOCK_NONBLOCK, |
err = |
164 |
&peer_sock); |
connq_listen (sock->listen_queue, sock->flags & SOCK_NONBLOCK, |
165 |
|
&req, &peer_sock); |
166 |
if (!err) |
if (!err) |
167 |
{ |
{ |
168 |
struct addr *peer_addr; |
struct sock *conn_sock; |
169 |
*port_type = MACH_MSG_TYPE_MAKE_SEND; |
|
170 |
err = sock_create_port (peer_sock, port); |
err = sock_clone (sock, &conn_sock); |
|
if (!err) |
|
|
err = sock_get_addr (peer_sock, &peer_addr); |
|
171 |
if (!err) |
if (!err) |
172 |
{ |
{ |
173 |
*peer_addr_port = ports_get_right (peer_addr); |
err = sock_connect (conn_sock, peer_sock); |
174 |
*peer_addr_port_type = MACH_MSG_TYPE_MAKE_SEND; |
if (!err) |
175 |
ports_port_deref (peer_addr); |
{ |
176 |
|
struct addr *peer_addr; |
177 |
|
*port_type = MACH_MSG_TYPE_MAKE_SEND; |
178 |
|
err = sock_create_port (conn_sock, port); |
179 |
|
if (!err) |
180 |
|
err = sock_get_addr (peer_sock, &peer_addr); |
181 |
|
if (!err) |
182 |
|
{ |
183 |
|
*peer_addr_port = ports_get_right (peer_addr); |
184 |
|
*peer_addr_port_type = MACH_MSG_TYPE_MAKE_SEND; |
185 |
|
ports_port_deref (peer_addr); |
186 |
|
} |
187 |
|
else |
188 |
|
/* TEAR DOWN THE CONNECTION XXX */; |
189 |
|
} |
190 |
|
if (err) |
191 |
|
sock_free (conn_sock); |
192 |
} |
} |
193 |
else |
|
194 |
/* TEAR DOWN THE CONNECTION XXX */; |
/* Communicate any error (or success) to the connecting thread. */ |
195 |
|
connq_request_complete (req, err); |
196 |
} |
} |
197 |
} |
} |
198 |
|
|