diff --git a/tcpip.c b/tcpip.c index 4b7fe49b0ef86b51c403d3fe6c45f9c47737b22a..6fcf2e92b085b61f4f135bdf6de9ce9127b3c265 100644 --- a/tcpip.c +++ b/tcpip.c @@ -87,6 +87,42 @@ static int tcpip_connection_create(struct connection *conn) return 0; } +static void tcpip_hotplug(struct controller *ctrl, const char *host_name, + const AvahiAddress *address, uint16_t port) +{ + struct interface *intf; + struct tcpip_device *td; + + td = malloc(sizeof(*td)); + if (!td) + goto exit; + + td->port = port; + avahi_address_snprint(td->addr, sizeof(td->addr), address); + td->host_name = malloc(strlen(host_name) + 1); + if (!td->host_name) + goto err_free_td; + strcpy(td->host_name, host_name); + + /* FIXME: use real IDs */ + intf = interface_create(ctrl, 1, 1, 0x1234, td); + if (!intf) + goto err_free_host_name; + + if (interface_hotplug(intf)) + goto err_intf_destroy; + + return; + +err_intf_destroy: + interface_destroy(intf); +err_free_host_name: + free(td->host_name); +err_free_td: + free(td); +exit: + pr_err("Failed to hotplug of TCP/IP module\n"); +} static void resolve_callback(AvahiServiceResolver *r, AvahiIfIndex interface, @@ -103,7 +139,7 @@ static void resolve_callback(AvahiServiceResolver *r, void* userdata) { AvahiClient *c; - struct tcpip_device *td = userdata; + struct controller *ctrl = userdata; switch (event) { case AVAHI_RESOLVER_FAILURE: @@ -115,12 +151,7 @@ static void resolve_callback(AvahiServiceResolver *r, break; case AVAHI_RESOLVER_FOUND: - avahi_address_snprint(td->addr, sizeof(td->addr), address); - td->host_name = malloc(strlen(host_name) + 1); - if (!td->host_name) - return; - strcpy(td->host_name, host_name); - td->port = port; + tcpip_hotplug(ctrl, host_name, address, port); break; } @@ -141,8 +172,6 @@ static void browse_callback(AvahiServiceBrowser *b, struct tcpip_controller *tcpip_ctrl = ctrl->priv; AvahiClient *c = tcpip_ctrl->client; AvahiServiceResolver *r; - struct tcpip_device *td; - struct interface *intf; switch (event) { case AVAHI_BROWSER_FAILURE: @@ -153,28 +182,15 @@ static void browse_callback(AvahiServiceBrowser *b, return; case AVAHI_BROWSER_NEW: - td = malloc(sizeof(*td)); - if (!td) - return; - r = avahi_service_resolver_new(c, interface, protocol, name, type, domain, AVAHI_PROTO_UNSPEC, 0, - resolve_callback, td); + resolve_callback, userdata); if (!r) { pr_err("Failed to resolve service '%s': %s\n", name, avahi_strerror(avahi_client_errno(c))); - goto err_free_td; } - /* FIXME: use real IDs */ - intf = interface_create(ctrl, 1, 1, 0x1234, td); - if (!intf) - goto err_free_td; - - if (interface_hotplug(intf)) - goto err_intf_destroy; - return; case AVAHI_BROWSER_REMOVE: @@ -184,11 +200,6 @@ static void browse_callback(AvahiServiceBrowser *b, default: return; } - -err_intf_destroy: - interface_destroy(intf); -err_free_td: - free(td); } static void client_callback(AvahiClient *c,