`bind()` directly from `netresolve_backend_add_path()`
authorPavel Šimerda <pavlix@pavlix.net>
Wed, 13 Nov 2013 19:12:39 +0000 (20:12 +0100)
committerPavel Šimerda <pavlix@pavlix.net>
Wed, 13 Nov 2013 19:15:59 +0000 (20:15 +0100)
lib/backend.c
lib/netresolve-private.h
lib/resolver.c
lib/socket.c

index 3e99ce13dfb1c3d8d69ade1d566c73ec21c3314d..ef5df85f6303da523f7e677f99970b717b222405 100644 (file)
@@ -101,6 +101,9 @@ netresolve_backend_add_path(netresolve_backend_t resolver, int family, const voi
 
        response->paths = realloc(response->paths, (response->pathcount + 1) * sizeof path);
        memcpy(&response->paths[response->pathcount++], &path, sizeof path);
+
+       if (resolver->callbacks.on_bind)
+               _netresolve_bind_path(resolver, &response->paths[response->pathcount - 1]);
 }
 
 typedef struct {
index cec5bb88a69eb794941f6215de7375e68ead90cb..9632d06adf452a8ab60ba671f3a757c41318148d 100644 (file)
@@ -121,7 +121,7 @@ void _netresolve_watch_fd(netresolve_t resolver, int fd, int events);
 
 void _netresolve_backend_cleanup(netresolve_t resolver);
 
-void _netresolve_bind(netresolve_t resolver);
+void _netresolve_bind_path(netresolve_t resolver, struct netresolve_path *path);
 void _netresolve_connect(netresolve_t resolver);
 
 void _netresolve_get_service_info(void (*callback)(int, int, int, void *), void *user_data,
index 69f1ef83467bea42be5f46d6c3025fbd09cdc6dd..d5d8a30b42a8121375fea814617c71f357c5fab6 100644 (file)
@@ -273,8 +273,6 @@ _netresolve_set_state(netresolve_t resolver, enum netresolve_state state)
                _netresolve_start(resolver);
                break;
        case NETRESOLVE_STATE_FINISHED:
-               if (resolver->callbacks.on_bind)
-                       _netresolve_bind(resolver);
                if (resolver->callbacks.on_connect)
                        _netresolve_connect(resolver);
                if (resolver->callbacks.on_success)
index 0f8a2c6d4f9806c316fbc61be1a9e7c7a002de51..354baaef9ac83c9f6fd04f4a0f21487ef8f89251 100644 (file)
 #include "netresolve-private.h"
 
 void
-_netresolve_bind(netresolve_t resolver)
+_netresolve_bind_path(netresolve_t resolver, struct netresolve_path *path)
 {
        int flags = O_NONBLOCK;
-       size_t npaths = netresolve_get_path_count(resolver);
-       size_t i;
-
-       for (i = 0; i < npaths; i++) {
-               int socktype;
-               int protocol;
-               const struct sockaddr *sa;
-               socklen_t salen;
-               int sock;
+       int socktype;
+       int protocol;
+       const struct sockaddr *sa;
+       socklen_t salen;
+       int sock;
 
-               sa = netresolve_get_path_sockaddr(resolver, i, &socktype, &protocol, &salen);
-               if (!sa)
-                       continue;
-               sock = socket(sa->sa_family, socktype | flags, protocol);
-               if (sock == -1)
-                       continue;
-               if (bind(sock, sa, salen) == -1) {
-                       close(sock);
-                       continue;
-               }
-
-               resolver->callbacks.on_bind(resolver, sock, resolver->callbacks.user_data_sock);
+       sa = netresolve_get_path_sockaddr(resolver, path - resolver->response.paths, &socktype, &protocol, &salen);
+       if (!sa)
+               return;
+       sock = socket(sa->sa_family, socktype | flags, protocol);
+       if (sock == -1)
+               return;
+       if (bind(sock, sa, salen) == -1) {
+               close(sock);
+               return;
        }
+
+       resolver->callbacks.on_bind(resolver, sock, resolver->callbacks.user_data_sock);
 }
 
 void
This page took 0.065768 seconds and 5 git commands to generate.