diff options
author | Lennart Poettering <lennart@poettering.net> | 2005-09-10 00:22:30 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2005-09-10 00:22:30 +0000 |
commit | e8edcf439d2ce1593af11c357893681b6b3c0bb4 (patch) | |
tree | d630ac06209abd27e352cef664394bc0cb9b904e /avahi-client | |
parent | a9566d5dcac080d7fa91546823277c57a5d09a5f (diff) |
* add magic identification cookies to service TXT records automatically
* add an API to query the local service cookie
* add a DBUS interface to query the local service cookie
* wrap that in avahi-client
git-svn-id: file:///home/lennart/svn/public/avahi/trunk@555 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
Diffstat (limited to 'avahi-client')
-rw-r--r-- | avahi-client/client-test.c | 4 | ||||
-rw-r--r-- | avahi-client/client.c | 52 | ||||
-rw-r--r-- | avahi-client/client.h | 3 | ||||
-rw-r--r-- | avahi-client/internal.h | 2 |
4 files changed, 60 insertions, 1 deletions
diff --git a/avahi-client/client-test.c b/avahi-client/client-test.c index a65a925..96c9f1e 100644 --- a/avahi-client/client-test.c +++ b/avahi-client/client-test.c @@ -164,6 +164,7 @@ int main (int argc, char *argv[]) { AvahiHostNameResolver *hnr; const char *ret; int error; + uint32_t cookie; struct timeval tv; simple_poll = avahi_simple_poll_new(); @@ -188,6 +189,9 @@ int main (int argc, char *argv[]) { ret = avahi_client_get_host_name_fqdn (avahi); printf("FQDN: %s (Error Return: %s)\n", ret, ret ? "OK" : avahi_strerror(avahi_client_errno(avahi))); + cookie = avahi_client_get_local_service_cookie(avahi); + printf("Local service cookie: %u (Error Return: %s)\n", cookie, cookie != AVAHI_SERVICE_COOKIE_INVALID ? "OK" : avahi_strerror(avahi_client_errno(avahi))); + group = avahi_entry_group_new (avahi, avahi_entry_group_callback, "omghai"); printf("Creating entry group: %s\n", group ? "OK" : avahi_strerror(avahi_client_errno (avahi))); diff --git a/avahi-client/client.c b/avahi-client/client.c index b536beb..31bfcdc 100644 --- a/avahi-client/client.c +++ b/avahi-client/client.c @@ -303,7 +303,8 @@ AvahiClient *avahi_client_new(const AvahiPoll *poll_api, AvahiClientCallback cal client->host_name_fqdn = NULL; client->domain_name = NULL; client->version_string = NULL; - + client->local_service_cookie_valid = 0; + AVAHI_LLIST_HEAD_INIT(AvahiEntryGroup, client->groups); AVAHI_LLIST_HEAD_INIT(AvahiDomainBrowser, client->domain_browsers); AVAHI_LLIST_HEAD_INIT(AvahiServiceBrowser, client->service_browsers); @@ -594,3 +595,52 @@ fail: return r; } +uint32_t avahi_client_get_local_service_cookie(AvahiClient *client) { + DBusMessage *message = NULL, *reply = NULL; + DBusError error; + assert(client); + + if (client->state == AVAHI_CLIENT_DISCONNECTED) { + avahi_client_set_errno(client, AVAHI_ERR_BAD_STATE); + return AVAHI_SERVICE_COOKIE_INVALID; + } + + if (client->local_service_cookie_valid) + return client->local_service_cookie; + + dbus_error_init (&error); + + if (!(message = dbus_message_new_method_call(AVAHI_DBUS_NAME, AVAHI_DBUS_PATH_SERVER, AVAHI_DBUS_INTERFACE_SERVER, "GetLocalServiceCookie"))) { + avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); + 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_UINT32, &client->local_service_cookie, DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) + goto fail; + + dbus_message_unref(message); + dbus_message_unref(reply); + + client->local_service_cookie_valid = 1; + return client->local_service_cookie; + +fail: + + if (message) + dbus_message_unref(message); + if (reply) + dbus_message_unref(reply); + + if (dbus_error_is_set(&error)) { + avahi_client_set_dbus_error(client, &error); + dbus_error_free(&error); + } + + return AVAHI_SERVICE_COOKIE_INVALID; +} diff --git a/avahi-client/client.h b/avahi-client/client.h index 2d8f41b..f92f4bf 100644 --- a/avahi-client/client.h +++ b/avahi-client/client.h @@ -317,6 +317,9 @@ AvahiClient* avahi_address_resolver_get_client (AvahiAddressResolver *); /** Free a AvahiAddressResolver resolver object */ int avahi_address_resolver_free(AvahiAddressResolver *r); +/** Return the local service cookie. returns AVAHI_SERVICE_COOKIE_INVALID on failure. */ +uint32_t avahi_client_get_local_service_cookie(AvahiClient *client); + #ifndef DOXYGEN_SHOULD_SKIP_THIS AVAHI_C_DECL_END #endif diff --git a/avahi-client/internal.h b/avahi-client/internal.h index b826175..b05835f 100644 --- a/avahi-client/internal.h +++ b/avahi-client/internal.h @@ -33,6 +33,8 @@ struct AvahiClient { /* Cache for some seldom changing server data */ char *version_string, *host_name, *host_name_fqdn, *domain_name; + uint32_t local_service_cookie; + int local_service_cookie_valid; AvahiClientCallback callback; void *userdata; |