/[hurd]/hurd/pflocal/socket.c
ViewVC logotype

Diff of /hurd/pflocal/socket.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.23 by neal, Mon Aug 29 08:29:35 2005 UTC revision 1.24 by neal, Mon Aug 29 09:41:21 2005 UTC
# Line 1  Line 1 
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    
# Line 110  S_socket_connect (struct sock_user *user Line 110  S_socket_connect (struct sock_user *user
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
# Line 118  S_socket_connect (struct sock_user *user Line 118  S_socket_connect (struct sock_user *user
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
# Line 176  S_socket_accept (struct sock_user *user, Line 157  S_socket_accept (struct sock_user *user,
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    

Legend:
Removed from v.1.23  
changed lines
  Added in v.1.24

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26