efl_net_dialer: emit 'resolved' even if connection failed.
authorGustavo Sverzut Barbieri <barbieri@profusion.mobi>
Fri, 9 Dec 2016 14:08:29 +0000 (12:08 -0200)
committerGustavo Sverzut Barbieri <barbieri@profusion.mobi>
Fri, 9 Dec 2016 15:47:04 +0000 (13:47 -0200)
If we resolved the address but couldn't connect, use
efl_net_socket_address_remote_set() and emit
EFL_NET_DIALER_EVENT_RESOLVED.

src/lib/ecore_con/ecore_con.c
src/lib/ecore_con/efl_net_dialer_tcp.c
src/lib/ecore_con/efl_net_dialer_udp.c

index 84f639d85f480b0e03dd94704d8b7f3a46785e16..e9dfd7621a9e75da3a8fe23a131b5345f22649fe 100644 (file)
@@ -3867,7 +3867,14 @@ _efl_net_ip_resolve_and_connect(const char *host, const char *port, int type, in
                }
           }
         if (ret != 0)
-          ret = EFL_NET_DIALER_ERROR_COULDNT_CONNECT;
+          {
+             if (results)
+               {
+                  memcpy(addr, results->ai_addr, results->ai_addrlen);
+                  *p_addrlen = results->ai_addrlen;
+               }
+             ret = EFL_NET_DIALER_ERROR_COULDNT_CONNECT;
+          }
         EINA_THREAD_CLEANUP_POP(EINA_TRUE);
      }
    return ret;
index e04707412daa1d0938e05fc0d1157eb87b9f4271..70aa4219cd5345dd897ed3e325e6e30fb75eed9f 100644 (file)
@@ -120,6 +120,15 @@ _efl_net_dialer_tcp_connected(void *data, const struct sockaddr *addr, socklen_t
  error:
    if (err)
      {
+        if (addr && addr->sa_family)
+          {
+             char buf[INET6_ADDRSTRLEN + sizeof("[]:65536")] = "";
+             if (efl_net_ip_port_fmt(buf, sizeof(buf), addr))
+               {
+                  efl_net_socket_address_remote_set(o, buf);
+                  efl_event_callback_call(o, EFL_NET_DIALER_EVENT_RESOLVED, NULL);
+               }
+          }
         efl_io_reader_eos_set(o, EINA_TRUE);
         efl_event_callback_call(o, EFL_NET_DIALER_EVENT_ERROR, &err);
      }
index 327a629fe8e71a3ce04bbad87a879eb4ad948db5..9b7e68775842f8d09768e74a3301e569a9ef232f 100644 (file)
@@ -198,14 +198,24 @@ _efl_net_dialer_udp_resolved(void *data, const char *host EINA_UNUSED, const cha
         err = _efl_net_dialer_udp_resolved_bind(o, pd, addr);
         if (err == 0) break;
      }
-   freeaddrinfo(result);
 
  end:
    if (err)
      {
+        if (result)
+          {
+             char buf[INET6_ADDRSTRLEN + sizeof("[]:65536")] = "";
+             if (efl_net_ip_port_fmt(buf, sizeof(buf), result->ai_addr))
+               {
+                  efl_net_socket_address_remote_set(o, buf);
+                  efl_event_callback_call(o, EFL_NET_DIALER_EVENT_RESOLVED, NULL);
+               }
+          }
+
         efl_io_reader_eos_set(o, EINA_TRUE);
         efl_event_callback_call(o, EFL_NET_DIALER_EVENT_ERROR, &err);
      }
+   freeaddrinfo(result);
 
    efl_unref(o);
 }