X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;ds=inline;f=avahi-client%2Fclient.c;h=90686fc6fabc8d635db35e9b700ce8909aaf0581;hb=f458280b1aa97dbfcbf51cab006058b44c848654;hp=3c86bd689403646d78739281d3cd2e6268828f6a;hpb=3632da5dea3a2e961729664d17808d98bfc2b325;p=catta diff --git a/avahi-client/client.c b/avahi-client/client.c index 3c86bd6..90686fc 100644 --- a/avahi-client/client.c +++ b/avahi-client/client.c @@ -39,6 +39,8 @@ #include "client.h" #include "internal.h" +#define AVAHI_CLIENT_DBUS_API_SUPPORTED ((uint32_t) 0x0201) + static int init_server(AvahiClient *client, int *ret_error); int avahi_client_set_errno (AvahiClient *client, int error) { @@ -345,26 +347,57 @@ fail: static int check_version(AvahiClient *client, int *ret_error) { DBusMessage *message = NULL, *reply = NULL; DBusError error; - char *version; + uint32_t version; int e = AVAHI_ERR_NO_MEMORY; assert(client); dbus_error_init(&error); - if (!(message = dbus_message_new_method_call(AVAHI_DBUS_NAME, AVAHI_DBUS_PATH_SERVER, AVAHI_DBUS_INTERFACE_SERVER, "GetVersionString"))) + if (!(message = dbus_message_new_method_call(AVAHI_DBUS_NAME, AVAHI_DBUS_PATH_SERVER, AVAHI_DBUS_INTERFACE_SERVER, "GetAPIVersion"))) goto fail; reply = dbus_connection_send_with_reply_and_block (client->bus, message, -1, &error); - if (!reply || dbus_error_is_set (&error)) - goto fail; + if (!reply || dbus_error_is_set (&error)) { + char *version_str; - if (!dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &version, DBUS_TYPE_INVALID) || - dbus_error_is_set (&error)) - goto fail; + if (!dbus_error_is_set(&error) || strcmp(error.name, DBUS_ERROR_UNKNOWN_METHOD)) + goto fail; + + /* If the method GetAPIVersion is not known, we look if + * GetVersionString matches "avahi 0.6" which is the only + * version we support which doesn't have GetAPIVersion() .*/ + + dbus_message_unref(message); + if (reply) dbus_message_unref(reply); + dbus_error_free(&error); + + if (!(message = dbus_message_new_method_call(AVAHI_DBUS_NAME, AVAHI_DBUS_PATH_SERVER, AVAHI_DBUS_INTERFACE_SERVER, "GetVersionString"))) + goto fail; + + reply = dbus_connection_send_with_reply_and_block (client->bus, message, -1, &error); + + if (!reply || dbus_error_is_set (&error)) + goto fail; + + if (!dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &version_str, DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) + goto fail; + + version = strcmp(version_str, "avahi 0.6") == 0 ? 0x0201 : 0x0000; + + } else { + + if (!dbus_message_get_args (reply, &error, DBUS_TYPE_UINT32, &version, DBUS_TYPE_INVALID) || + dbus_error_is_set(&error)) + goto fail; + } - if (strcmp(version, PACKAGE_STRING) != 0) { + /*fprintf(stderr, "API Version 0x%04x\n", version);*/ + + if ((version & 0xFF00) != (AVAHI_CLIENT_DBUS_API_SUPPORTED & 0xFF00) || + (version & 0x00FF) < (AVAHI_CLIENT_DBUS_API_SUPPORTED & 0x00FF)) { e = AVAHI_ERR_VERSION_MISMATCH; goto fail; } @@ -404,7 +437,8 @@ static int init_server(AvahiClient *client, int *ret_error) { } /* This function acts like dbus_bus_get but creates a private - * connection instead */ + * connection instead. Eventually this should be replaced by a DBUS + * provided version. */ static DBusConnection* avahi_dbus_bus_get(DBusError *error) { DBusConnection *c; const char *a; @@ -561,6 +595,11 @@ fail: void avahi_client_free(AvahiClient *client) { assert(client); + if (client->bus) + /* Disconnect in advance, so that the free() functions won't + * issue needless server calls */ + dbus_connection_disconnect(client->bus); + while (client->groups) avahi_entry_group_free(client->groups); @@ -585,10 +624,8 @@ void avahi_client_free(AvahiClient *client) { while (client->record_browsers) avahi_record_browser_free(client->record_browsers); - if (client->bus) { - dbus_connection_disconnect(client->bus); + if (client->bus) dbus_connection_unref(client->bus); - } avahi_free(client->version_string); avahi_free(client->host_name); @@ -825,5 +862,8 @@ fail: int avahi_client_is_connected(AvahiClient *client) { assert(client); - return client->state == AVAHI_CLIENT_S_RUNNING || client->state == AVAHI_CLIENT_S_REGISTERING || client->state == AVAHI_CLIENT_S_COLLISION; + return + client->bus && + dbus_connection_get_is_connected(client->bus) && + (client->state == AVAHI_CLIENT_S_RUNNING || client->state == AVAHI_CLIENT_S_REGISTERING || client->state == AVAHI_CLIENT_S_COLLISION); }