summaryrefslogtreecommitdiffstats
path: root/avahi-client
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2005-09-10 00:22:30 +0000
committerLennart Poettering <lennart@poettering.net>2005-09-10 00:22:30 +0000
commite8edcf439d2ce1593af11c357893681b6b3c0bb4 (patch)
treed630ac06209abd27e352cef664394bc0cb9b904e /avahi-client
parenta9566d5dcac080d7fa91546823277c57a5d09a5f (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.c4
-rw-r--r--avahi-client/client.c52
-rw-r--r--avahi-client/client.h3
-rw-r--r--avahi-client/internal.h2
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;