X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-client%2Fclient.c;h=b536beb5ee9a8d37bed4c8d9526a12f67c1962cb;hb=a9566d5dcac080d7fa91546823277c57a5d09a5f;hp=27f746206670a13fe28722d94ef91d6aa810e7e1;hpb=bb421d3a4e8e9bbf99c340f5559e6fd76dac5196;p=catta diff --git a/avahi-client/client.c b/avahi-client/client.c index 27f7462..b536beb 100644 --- a/avahi-client/client.c +++ b/avahi-client/client.c @@ -185,6 +185,22 @@ static DBusHandlerResult filter_func(DBusConnection *bus, DBusMessage *message, else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_SERVICE_BROWSER, "ItemRemove")) return avahi_service_browser_event (client, AVAHI_BROWSER_REMOVE, message); + else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_SERVICE_RESOLVER, "Found")) + return avahi_service_resolver_event (client, AVAHI_RESOLVER_FOUND, message); + else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_SERVICE_RESOLVER, "Timeout")) + return avahi_service_resolver_event (client, AVAHI_RESOLVER_TIMEOUT, message); + + else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_HOST_NAME_RESOLVER, "Found")) + return avahi_host_name_resolver_event (client, AVAHI_RESOLVER_FOUND, message); + else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_HOST_NAME_RESOLVER, "Timeout")) + return avahi_host_name_resolver_event (client, AVAHI_RESOLVER_TIMEOUT, message); + + else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_ADDRESS_RESOLVER, "Found")) + return avahi_address_resolver_event (client, AVAHI_RESOLVER_FOUND, message); + else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_ADDRESS_RESOLVER, "Timeout")) + return avahi_address_resolver_event (client, AVAHI_RESOLVER_TIMEOUT, message); + + return DBUS_HANDLER_RESULT_HANDLED; fail: @@ -235,14 +251,14 @@ fail: /* This function acts like dbus_bus_get but creates a private * connection instead */ static DBusConnection* -avahi_dbus_bus_get (DBusBusType type, DBusError *error) +avahi_dbus_bus_get (DBusError *error) { DBusConnection *conn; - char *env_addr; + const char *env_addr; env_addr = getenv ("DBUS_SYSTEM_BUS_ADDRESS"); - if (env_addr == NULL || (strcmp (env_addr, "") == 0)) + if (env_addr == NULL || (*env_addr == 0)) { env_addr = DBUS_SYSTEM_BUS_DEFAULT_ADDRESS; } @@ -250,16 +266,12 @@ avahi_dbus_bus_get (DBusBusType type, DBusError *error) conn = dbus_connection_open_private (env_addr, error); if (!conn) - { - printf ("Failed to open private connection: %s\n", error->message); return NULL; - } - dbus_connection_set_exit_on_disconnect (conn, TRUE); + dbus_connection_set_exit_on_disconnect (conn, FALSE); if (!dbus_bus_register (conn, error)) { - printf ("Failed to register connection\n"); dbus_connection_close (conn); dbus_connection_unref (conn); @@ -297,8 +309,10 @@ AvahiClient *avahi_client_new(const AvahiPoll *poll_api, AvahiClientCallback cal AVAHI_LLIST_HEAD_INIT(AvahiServiceBrowser, client->service_browsers); AVAHI_LLIST_HEAD_INIT(AvahiServiceTypeBrowser, client->service_type_browsers); AVAHI_LLIST_HEAD_INIT(AvahiServiceResolver, client->service_resolvers); + AVAHI_LLIST_HEAD_INIT(AvahiHostNameResolver, client->host_name_resolvers); + AVAHI_LLIST_HEAD_INIT(AvahiAddressResolver, client->address_resolvers); - if (!(client->bus = avahi_dbus_bus_get(DBUS_BUS_SYSTEM, &error)) || + if (!(client->bus = avahi_dbus_bus_get(&error)) || dbus_error_is_set (&error)) goto fail; @@ -529,3 +543,54 @@ int avahi_client_errno(AvahiClient *client) { return client->error; } + +/* Just for internal use */ +int avahi_client_simple_method_call(AvahiClient *client, const char *path, const char *interface, const char *method) { + DBusMessage *message = NULL, *reply = NULL; + DBusError error; + int r = AVAHI_OK; + + dbus_error_init(&error); + + assert(client); + assert(path); + assert(interface); + assert(method); + + if (!(message = dbus_message_new_method_call(AVAHI_DBUS_NAME, path, interface, method))) { + r = avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); + goto fail; + } + + if (!(reply = dbus_connection_send_with_reply_and_block(client->bus, message, -1, &error)) || + dbus_error_is_set (&error)) { + r = avahi_client_set_errno(client, AVAHI_ERR_DBUS_ERROR); + goto fail; + } + + if (!dbus_message_get_args(reply, &error, DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) { + r = avahi_client_set_errno(client, AVAHI_ERR_DBUS_ERROR); + goto fail; + } + + dbus_message_unref(message); + dbus_message_unref(reply); + + return AVAHI_OK; + +fail: + if (dbus_error_is_set(&error)) { + r = avahi_client_set_dbus_error(client, &error); + dbus_error_free(&error); + } + + if (message) + dbus_message_unref(message); + + if (reply) + dbus_message_unref(reply); + + return r; +} +