diff options
author | Lennart Poettering <lennart@poettering.net> | 2005-10-17 02:07:26 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2005-10-17 02:07:26 +0000 |
commit | 0c54764cf19428a0c52724a75ddf3368e3899209 (patch) | |
tree | c75465bb36f99d179b65fea6c4daee856f67435a /avahi-client | |
parent | 41f2725b37437a585ce285051bdae06f4919dc3b (diff) |
* split client.h into client.h, lookup.h and publish.h just like we did on the server side
* Wrap avahi_server_update_txt() as DBUS function UpdateServiceTxt
* Add client side API avahi_entry_group_update_service_txt() and friends
* handle AVAHI_PUBLISH_UPDATE semantics in DBUS protocol
* minor cleanups
git-svn-id: file:///home/lennart/svn/public/avahi/trunk@791 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
Diffstat (limited to 'avahi-client')
-rw-r--r-- | avahi-client/client-test.c | 13 | ||||
-rw-r--r-- | avahi-client/client.h | 263 | ||||
-rw-r--r-- | avahi-client/entrygroup.c | 211 | ||||
-rw-r--r-- | avahi-client/internal.h | 3 | ||||
-rw-r--r-- | avahi-client/lookup.h | 229 | ||||
-rw-r--r-- | avahi-client/publish.h | 160 | ||||
-rw-r--r-- | avahi-client/srv-test.c | 1 |
7 files changed, 578 insertions, 302 deletions
diff --git a/avahi-client/client-test.c b/avahi-client/client-test.c index c7789ba..14b9e84 100644 --- a/avahi-client/client-test.c +++ b/avahi-client/client-test.c @@ -27,6 +27,9 @@ #include <assert.h> #include <avahi-client/client.h> +#include <avahi-client/lookup.h> +#include <avahi-client/publish.h> + #include <avahi-common/error.h> #include <avahi-common/simple-watch.h> #include <avahi-common/malloc.h> @@ -191,6 +194,14 @@ static void test_entry_group_reset (AvahiTimeout *timeout, void* userdata) avahi_entry_group_commit (g); } +static void test_entry_group_update(AvahiTimeout *timeout, void* userdata) { + AvahiEntryGroup *g = userdata; + + printf ("Updating entry group\n"); + + avahi_entry_group_update_service_txt(g, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, "Lathiat's Site", "_http._tcp", NULL, "foo=bar3", NULL); +} + static void terminate(AvahiTimeout *timeout, void *userdata) { avahi_simple_poll_quit(simple_poll); @@ -272,6 +283,8 @@ int main (int argc, char *argv[]) { avahi_elapse_time(&tv, 8000, 0); poll_api->timeout_new(poll_api, &tv, test_entry_group_reset, group); + avahi_elapse_time(&tv, 15000, 0); + poll_api->timeout_new(poll_api, &tv, test_entry_group_update, group); avahi_elapse_time(&tv, 20000, 0); poll_api->timeout_new(poll_api, &tv, test_free_entry_group, group); avahi_elapse_time(&tv, 25000, 0); diff --git a/avahi-client/client.h b/avahi-client/client.h index bad0789..8a59ca1 100644 --- a/avahi-client/client.h +++ b/avahi-client/client.h @@ -33,16 +33,8 @@ /** \file client.h Definitions and functions for the client API over D-Bus */ -/** \example client-publish-service.c Example how to register a DNS-SD - * service using the client interface to avahi-daemon. It behaves like a network - * printer registering both an IPP and a BSD LPR service. */ - -/** \example client-browse-services.c Example how to browse for DNS-SD - * services using the client interface to avahi-daemon. */ - /** \example glib-integration.c Example of how to integrate * avahi use with GLIB/GTK applications */ - #ifndef DOXYGEN_SHOULD_SKIP_THIS AVAHI_C_DECL_BEGIN @@ -51,27 +43,6 @@ AVAHI_C_DECL_BEGIN /** A connection context */ typedef struct AvahiClient AvahiClient; -/** An entry group object */ -typedef struct AvahiEntryGroup AvahiEntryGroup; - -/** A domain browser object */ -typedef struct AvahiDomainBrowser AvahiDomainBrowser; - -/** A service browser object */ -typedef struct AvahiServiceBrowser AvahiServiceBrowser; - -/** A service type browser object */ -typedef struct AvahiServiceTypeBrowser AvahiServiceTypeBrowser; - -/** A service resolver object */ -typedef struct AvahiServiceResolver AvahiServiceResolver; - -/** A service resolver object */ -typedef struct AvahiHostNameResolver AvahiHostNameResolver; - -/** An address resolver object */ -typedef struct AvahiAddressResolver AvahiAddressResolver; - /** States of a client object, a superset of AvahiServerState */ typedef enum { AVAHI_CLIENT_S_INVALID = AVAHI_SERVER_INVALID, @@ -84,57 +55,6 @@ typedef enum { /** The function prototype for the callback of an AvahiClient */ typedef void (*AvahiClientCallback) (AvahiClient *s, AvahiClientState state, void* userdata); -/** The function prototype for the callback of an AvahiEntryGroup */ -typedef void (*AvahiEntryGroupCallback) (AvahiEntryGroup *g, AvahiEntryGroupState state, void* userdata); - -/** The function prototype for the callback of an AvahiDomainBrowser */ -typedef void (*AvahiDomainBrowserCallback) (AvahiDomainBrowser *b, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *domain, AvahiLookupResultFlags flags, void *userdata); - -/** The function prototype for the callback of an AvahiServiceBrowser */ -typedef void (*AvahiServiceBrowserCallback) (AvahiServiceBrowser *b, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *name, const char *type, const char *domain, AvahiLookupResultFlags flags, void *userdata); - -/** The function prototype for the callback of an AvahiServiceTypeBrowser */ -typedef void (*AvahiServiceTypeBrowserCallback) (AvahiServiceTypeBrowser *b, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *type, const char *domain, AvahiLookupResultFlags flags, void *userdata); - -/** The function prototype for the callback of an AvahiServiceResolver */ -typedef void (*AvahiServiceResolverCallback) ( - AvahiServiceResolver *r, - AvahiIfIndex interface, - AvahiProtocol protocol, - AvahiResolverEvent event, - const char *name, - const char *type, - const char *domain, - const char *host_name, - const AvahiAddress *a, - uint16_t port, - AvahiStringList *txt, - AvahiLookupResultFlags flags, - void *userdata); - -/** The function prototype for the callback of an AvahiHostNameResolver */ -typedef void (*AvahiHostNameResolverCallback) ( - AvahiHostNameResolver *r, - AvahiIfIndex interface, - AvahiProtocol protocol, - AvahiResolverEvent event, - const char *name, - const AvahiAddress *a, - AvahiLookupResultFlags flags, - void *userdata); - -/** The function prototype for the callback of an AvahiAddressResolver */ -typedef void (*AvahiAddressResolverCallback) ( - AvahiAddressResolver *r, - AvahiIfIndex interface, - AvahiProtocol protocol, - AvahiResolverEvent event, - AvahiProtocol aprotocol, - const AvahiAddress *a, - const char *name, - AvahiLookupResultFlags flags, - void *userdata); - /** Creates a new client instance */ AvahiClient* avahi_client_new (const AvahiPoll *poll_api, AvahiClientCallback callback, void *userdata, int *error); @@ -159,189 +79,6 @@ AvahiClientState avahi_client_get_state(AvahiClient *client); /** Get the last error number */ int avahi_client_errno (AvahiClient*); -/** Create a new AvahiEntryGroup object */ -AvahiEntryGroup* avahi_entry_group_new (AvahiClient*, AvahiEntryGroupCallback callback, void *userdata); - -/** Clean up and free an AvahiEntryGroup object */ -int avahi_entry_group_free (AvahiEntryGroup *); - -/** Commit an AvahiEntryGroup */ -int avahi_entry_group_commit (AvahiEntryGroup*); - -/** Reset an AvahiEntryGroup */ -int avahi_entry_group_reset (AvahiEntryGroup*); - -/** Get an AvahiEntryGroup's state */ -int avahi_entry_group_get_state (AvahiEntryGroup*); - -/** Check if an AvahiEntryGroup is empty */ -int avahi_entry_group_is_empty (AvahiEntryGroup*); - -/** Get an AvahiEntryGroup's owning client instance */ -AvahiClient* avahi_entry_group_get_client (AvahiEntryGroup*); - -/** Add a service, takes a variable NULL terminated list of text records */ -int avahi_entry_group_add_service( - AvahiEntryGroup *group, - AvahiIfIndex interface, - AvahiProtocol protocol, - AvahiPublishFlags flags, - const char *name, - const char *type, - const char *domain, - const char *host, - uint16_t port, - ...) AVAHI_GCC_SENTINEL; - -/** Add a service, takes an AvahiStringList for text records */ -int avahi_entry_group_add_service_strlst( - AvahiEntryGroup *group, - AvahiIfIndex interface, - AvahiProtocol protocol, - AvahiPublishFlags flags, - const char *name, - const char *type, - const char *domain, - const char *host, - uint16_t port, - AvahiStringList *txt); - -/** Add a service, takes a NULL terminated va_list for text records */ -int avahi_entry_group_add_service_va( - AvahiEntryGroup *group, - AvahiIfIndex interface, - AvahiProtocol protocol, - AvahiPublishFlags flags, - const char *name, - const char *type, - const char *domain, - const char *host, - uint16_t port, - va_list va); - -/** Add a subtype for a service */ -int avahi_entry_group_add_service_subtype( - AvahiEntryGroup *group, - AvahiIfIndex interface, - AvahiProtocol protocol, - AvahiPublishFlags flags, - const char *name, - const char *type, - const char *domain, - const char *subtype); - -/** Browse for domains on the local network */ -AvahiDomainBrowser* avahi_domain_browser_new ( - AvahiClient *client, - AvahiIfIndex interface, - AvahiProtocol protocol, - const char *domain, - AvahiDomainBrowserType btype, - AvahiLookupFlags flags, - AvahiDomainBrowserCallback callback, - void *userdata); - -/** Get the parent client of an AvahiDomainBrowser object */ -AvahiClient* avahi_domain_browser_get_client (AvahiDomainBrowser *); - -/** Cleans up and frees an AvahiDomainBrowser object */ -int avahi_domain_browser_free (AvahiDomainBrowser *); - -/** Browse for service types on the local network */ -AvahiServiceTypeBrowser* avahi_service_type_browser_new ( - AvahiClient *client, - AvahiIfIndex interface, - AvahiProtocol protocol, - const char *domain, - AvahiLookupFlags flags, - AvahiServiceTypeBrowserCallback callback, - void *userdata); - -/** Get the parent client of an AvahiServiceTypeBrowser object */ -AvahiClient* avahi_service_type_browser_get_client (AvahiServiceTypeBrowser *); - -/** Cleans up and frees an AvahiServiceTypeBrowser object */ -int avahi_service_type_browser_free (AvahiServiceTypeBrowser *); - -/** Browse for services of a type on the local network */ -AvahiServiceBrowser* avahi_service_browser_new ( - AvahiClient *client, - AvahiIfIndex interface, - AvahiProtocol protocol, - const char *type, - const char *domain, - AvahiLookupFlags flags, - AvahiServiceBrowserCallback callback, - void *userdata); - -/** Get the parent client of an AvahiServiceBrowser object */ -AvahiClient* avahi_service_browser_get_client (AvahiServiceBrowser *); - -/* Cleans up and frees an AvahiServiceBrowser object */ -int avahi_service_browser_free (AvahiServiceBrowser *); - -/** Create a new service resolver object */ -AvahiServiceResolver * avahi_service_resolver_new( - AvahiClient *client, - AvahiIfIndex interface, - AvahiProtocol protocol, - const char *name, - const char *type, - const char *domain, - AvahiProtocol aprotocol, - AvahiLookupFlags flags, - AvahiServiceResolverCallback callback, - void *userdata); - -/** Get the parent client of an AvahiServiceResolver object */ -AvahiClient* avahi_service_resolver_get_client (AvahiServiceResolver *); - -/** Free a service resolver object */ -int avahi_service_resolver_free(AvahiServiceResolver *r); - -/** Create a new hostname resolver object */ -AvahiHostNameResolver * avahi_host_name_resolver_new( - AvahiClient *client, - AvahiIfIndex interface, - AvahiProtocol protocol, - const char *name, - AvahiProtocol aprotocol, - AvahiLookupFlags flags, - AvahiHostNameResolverCallback callback, - void *userdata); - -/** Get the parent client of an AvahiHostNameResolver object */ -AvahiClient* avahi_host_name_resolver_get_client (AvahiHostNameResolver *); - -/** Free a hostname resolver object */ -int avahi_host_name_resolver_free(AvahiHostNameResolver *r); - -/** Create a new address resolver object from an address string. Set aprotocol to AF_UNSPEC for protocol detection. */ -AvahiAddressResolver * avahi_address_resolver_new( - AvahiClient *client, - AvahiIfIndex interface, - AvahiProtocol protocol, - const char *address, - AvahiLookupFlags flags, - AvahiAddressResolverCallback callback, - void *userdata); - -/** Create a new address resolver object from an AvahiAddress object */ -AvahiAddressResolver* avahi_address_resolver_new_a( - AvahiClient *client, - AvahiIfIndex interface, - AvahiProtocol protocol, - const AvahiAddress *a, - AvahiLookupFlags flags, - AvahiAddressResolverCallback callback, - void *userdata); - -/** Get the parent client of an AvahiAddressResolver object */ -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); diff --git a/avahi-client/entrygroup.c b/avahi-client/entrygroup.c index d2526e0..2d882e6 100644 --- a/avahi-client/entrygroup.c +++ b/avahi-client/entrygroup.c @@ -330,6 +330,46 @@ fail: return r; } +static int append_string_list(DBusMessage *message, AvahiStringList *txt) { + DBusMessageIter iter, sub; + int r = -1; + AvahiStringList *p; + + assert(message); + assert(txt); + + dbus_message_iter_init_append(message, &iter); + + /* Reverse the string list, so that we can pass it in-order to the server */ + txt = avahi_string_list_reverse(txt); + + if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "ay", &sub)) + goto fail; + + /* Assemble the AvahiStringList into an Array of Array of Bytes to send over dbus */ + for (p = txt; p != NULL; p = p->next) { + DBusMessageIter sub2; + const uint8_t *data = p->text; + + if (!(dbus_message_iter_open_container(&sub, DBUS_TYPE_ARRAY, "y", &sub2)) || + !(dbus_message_iter_append_fixed_array(&sub2, DBUS_TYPE_BYTE, &data, p->size)) || + !(dbus_message_iter_close_container(&sub, &sub2))) + goto fail; + } + + if (!dbus_message_iter_close_container(&iter, &sub)) + goto fail; + + r = 0; + +fail: + + /* Reverse the string list to the original state */ + txt = avahi_string_list_reverse(txt); + + return r; +} + int avahi_entry_group_add_service_strlst( AvahiEntryGroup *group, AvahiIfIndex interface, @@ -343,9 +383,7 @@ int avahi_entry_group_add_service_strlst( AvahiStringList *txt) { DBusMessage *message = NULL, *reply = NULL; - DBusMessageIter iter, sub; - AvahiStringList *p; - int reverse = 0, r = AVAHI_OK; + int r = AVAHI_OK; DBusError error; AvahiClient *client; int32_t i_interface, i_protocol; @@ -387,44 +425,12 @@ int avahi_entry_group_add_service_strlst( DBUS_TYPE_STRING, &domain, DBUS_TYPE_STRING, &host, DBUS_TYPE_UINT16, &port, - DBUS_TYPE_INVALID)) { + DBUS_TYPE_INVALID) || + append_string_list(message, txt) < 0) { r = avahi_client_set_errno(group->client, AVAHI_ERR_NO_MEMORY); goto fail; } - dbus_message_iter_init_append(message, &iter); - - /* Reverse the string list, so that we can pass it in-order to the server */ - txt = avahi_string_list_reverse(txt); - reverse = 1; - - if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "ay", &sub)) { - r = avahi_client_set_errno(group->client, AVAHI_ERR_NO_MEMORY); - goto fail; - } - - /* Assemble the AvahiStringList into an Array of Array of Bytes to send over dbus */ - for (p = txt; p != NULL; p = p->next) { - DBusMessageIter sub2; - const uint8_t *data = p->text; - - if (!(dbus_message_iter_open_container(&sub, DBUS_TYPE_ARRAY, "y", &sub2)) || - !(dbus_message_iter_append_fixed_array(&sub2, DBUS_TYPE_BYTE, &data, p->size)) || - !(dbus_message_iter_close_container(&sub, &sub2))) { - r = avahi_client_set_errno(group->client, AVAHI_ERR_NO_MEMORY); - goto fail; - } - } - - if (!dbus_message_iter_close_container(&iter, &sub)) { - r = avahi_client_set_errno(group->client, AVAHI_ERR_NO_MEMORY); - goto fail; - } - - /* Reverse the string list to the original state */ - txt = avahi_string_list_reverse(txt); - reverse = 0; - 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); @@ -443,8 +449,6 @@ int avahi_entry_group_add_service_strlst( return AVAHI_OK; fail: - if (reverse) - txt = avahi_string_list_reverse(txt); if (dbus_error_is_set(&error)) { r = avahi_client_set_dbus_error(client, &error); @@ -595,3 +599,132 @@ fail: return r; } + +int avahi_entry_group_update_service_txt( + AvahiEntryGroup *group, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiPublishFlags flags, + const char *name, + const char *type, + const char *domain, + ...) { + + va_list va; + int r; + + va_start(va, domain); + r = avahi_entry_group_update_service_txt_va(group, interface, protocol, flags, name, type, domain, va); + va_end(va); + return r; +} + +int avahi_entry_group_update_service_txt_va( + AvahiEntryGroup *group, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiPublishFlags flags, + const char *name, + const char *type, + const char *domain, + va_list va) { + + int r; + AvahiStringList *txt; + + txt = avahi_string_list_new_va(va); + r = avahi_entry_group_update_service_txt_strlst(group, interface, protocol, flags, name, type, domain, txt); + avahi_string_list_free(txt); + + return r; +} + +int avahi_entry_group_update_service_txt_strlst( + AvahiEntryGroup *group, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiPublishFlags flags, + const char *name, + const char *type, + const char *domain, + AvahiStringList *txt) { + + DBusMessage *message = NULL, *reply = NULL; + int r = AVAHI_OK; + DBusError error; + AvahiClient *client; + int32_t i_interface, i_protocol; + uint32_t u_flags; + + assert(group); + assert(name); + assert(type); + + client = group->client; + + if (!group->path || group->client->state == AVAHI_CLIENT_DISCONNECTED) + return avahi_client_set_errno(group->client, AVAHI_ERR_BAD_STATE); + + if (!domain) + domain = ""; + + dbus_error_init(&error); + + if (!(message = dbus_message_new_method_call (AVAHI_DBUS_NAME, group->path, AVAHI_DBUS_INTERFACE_ENTRY_GROUP, "UpdateServiceTxt"))) { + r = avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); + goto fail; + } + + i_interface = (int32_t) interface; + i_protocol = (int32_t) protocol; + u_flags = (uint32_t) flags; + + if (!dbus_message_append_args( + message, + DBUS_TYPE_INT32, &i_interface, + DBUS_TYPE_INT32, &i_protocol, + DBUS_TYPE_UINT32, &u_flags, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_STRING, &type, + DBUS_TYPE_STRING, &domain, + DBUS_TYPE_INVALID) || + append_string_list(message, txt) < 0) { + r = avahi_client_set_errno(group->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; + + +} + diff --git a/avahi-client/internal.h b/avahi-client/internal.h index b05835f..56aaaae 100644 --- a/avahi-client/internal.h +++ b/avahi-client/internal.h @@ -23,7 +23,10 @@ ***/ #include <dbus/dbus.h> + #include "client.h" +#include "lookup.h" +#include "publish.h" struct AvahiClient { const AvahiPoll *poll_api; diff --git a/avahi-client/lookup.h b/avahi-client/lookup.h new file mode 100644 index 0000000..659700e --- /dev/null +++ b/avahi-client/lookup.h @@ -0,0 +1,229 @@ +#ifndef fooclientlookuphfoo +#define fooclientlookuphfoo + +/* $Id$ */ + +/*** + This file is part of avahi. + + avahi is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + avahi is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General + Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with avahi; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#include <inttypes.h> + +#include <avahi-common/cdecl.h> +#include <avahi-common/address.h> +#include <avahi-common/strlst.h> +#include <avahi-common/defs.h> +#include <avahi-common/watch.h> +#include <avahi-common/gccmacro.h> + +#include <avahi-client/client.h> + +/** \file avahi-client/lookup.h Lookup Client API */ + +/** \example client-browse-services.c Example how to browse for DNS-SD + * services using the client interface to avahi-daemon. */ + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +AVAHI_C_DECL_BEGIN +#endif + +/** A domain browser object */ +typedef struct AvahiDomainBrowser AvahiDomainBrowser; + +/** A service browser object */ +typedef struct AvahiServiceBrowser AvahiServiceBrowser; + +/** A service type browser object */ +typedef struct AvahiServiceTypeBrowser AvahiServiceTypeBrowser; + +/** A service resolver object */ +typedef struct AvahiServiceResolver AvahiServiceResolver; + +/** A service resolver object */ +typedef struct AvahiHostNameResolver AvahiHostNameResolver; + +/** An address resolver object */ +typedef struct AvahiAddressResolver AvahiAddressResolver; + +/** The function prototype for the callback of an AvahiDomainBrowser */ +typedef void (*AvahiDomainBrowserCallback) (AvahiDomainBrowser *b, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *domain, AvahiLookupResultFlags flags, void *userdata); + +/** The function prototype for the callback of an AvahiServiceBrowser */ +typedef void (*AvahiServiceBrowserCallback) (AvahiServiceBrowser *b, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *name, const char *type, const char *domain, AvahiLookupResultFlags flags, void *userdata); + +/** The function prototype for the callback of an AvahiServiceTypeBrowser */ +typedef void (*AvahiServiceTypeBrowserCallback) (AvahiServiceTypeBrowser *b, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *type, const char *domain, AvahiLookupResultFlags flags, void *userdata); + +/** The function prototype for the callback of an AvahiServiceResolver */ +typedef void (*AvahiServiceResolverCallback) ( + AvahiServiceResolver *r, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiResolverEvent event, + const char *name, + const char *type, + const char *domain, + const char *host_name, + const AvahiAddress *a, + uint16_t port, + AvahiStringList *txt, + AvahiLookupResultFlags flags, + void *userdata); + +/** The function prototype for the callback of an AvahiHostNameResolver */ +typedef void (*AvahiHostNameResolverCallback) ( + AvahiHostNameResolver *r, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiResolverEvent event, + const char *name, + const AvahiAddress *a, + AvahiLookupResultFlags flags, + void *userdata); + +/** The function prototype for the callback of an AvahiAddressResolver */ +typedef void (*AvahiAddressResolverCallback) ( + AvahiAddressResolver *r, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiResolverEvent event, + AvahiProtocol aprotocol, + const AvahiAddress *a, + const char *name, + AvahiLookupResultFlags flags, + void *userdata); + + +/** Browse for domains on the local network */ +AvahiDomainBrowser* avahi_domain_browser_new ( + AvahiClient *client, + AvahiIfIndex interface, + AvahiProtocol protocol, + const char *domain, + AvahiDomainBrowserType btype, + AvahiLookupFlags flags, + AvahiDomainBrowserCallback callback, + void *userdata); + +/** Get the parent client of an AvahiDomainBrowser object */ +AvahiClient* avahi_domain_browser_get_client (AvahiDomainBrowser *); + +/** Cleans up and frees an AvahiDomainBrowser object */ +int avahi_domain_browser_free (AvahiDomainBrowser *); + +/** Browse for service types on the local network */ +AvahiServiceTypeBrowser* avahi_service_type_browser_new ( + AvahiClient *client, + AvahiIfIndex interface, + AvahiProtocol protocol, + const char *domain, + AvahiLookupFlags flags, + AvahiServiceTypeBrowserCallback callback, + void *userdata); + +/** Get the parent client of an AvahiServiceTypeBrowser object */ +AvahiClient* avahi_service_type_browser_get_client (AvahiServiceTypeBrowser *); + +/** Cleans up and frees an AvahiServiceTypeBrowser object */ +int avahi_service_type_browser_free (AvahiServiceTypeBrowser *); + +/** Browse for services of a type on the local network */ +AvahiServiceBrowser* avahi_service_browser_new ( + AvahiClient *client, + AvahiIfIndex interface, + AvahiProtocol protocol, + const char *type, + const char *domain, + AvahiLookupFlags flags, + AvahiServiceBrowserCallback callback, + void *userdata); + +/** Get the parent client of an AvahiServiceBrowser object */ +AvahiClient* avahi_service_browser_get_client (AvahiServiceBrowser *); + +/* Cleans up and frees an AvahiServiceBrowser object */ +int avahi_service_browser_free (AvahiServiceBrowser *); + +/** Create a new service resolver object */ +AvahiServiceResolver * avahi_service_resolver_new( + AvahiClient *client, + AvahiIfIndex interface, + AvahiProtocol protocol, + const char *name, + const char *type, + const char *domain, + AvahiProtocol aprotocol, + AvahiLookupFlags flags, + AvahiServiceResolverCallback callback, + void *userdata); + +/** Get the parent client of an AvahiServiceResolver object */ +AvahiClient* avahi_service_resolver_get_client (AvahiServiceResolver *); + +/** Free a service resolver object */ +int avahi_service_resolver_free(AvahiServiceResolver *r); + +/** Create a new hostname resolver object */ +AvahiHostNameResolver * avahi_host_name_resolver_new( + AvahiClient *client, + AvahiIfIndex interface, + AvahiProtocol protocol, + const char *name, + AvahiProtocol aprotocol, + AvahiLookupFlags flags, + AvahiHostNameResolverCallback callback, + void *userdata); + +/** Get the parent client of an AvahiHostNameResolver object */ +AvahiClient* avahi_host_name_resolver_get_client (AvahiHostNameResolver *); + +/** Free a hostname resolver object */ +int avahi_host_name_resolver_free(AvahiHostNameResolver *r); + +/** Create a new address resolver object from an address string. Set aprotocol to AF_UNSPEC for protocol detection. */ +AvahiAddressResolver * avahi_address_resolver_new( + AvahiClient *client, + AvahiIfIndex interface, + AvahiProtocol protocol, + const char *address, + AvahiLookupFlags flags, + AvahiAddressResolverCallback callback, + void *userdata); + +/** Create a new address resolver object from an AvahiAddress object */ +AvahiAddressResolver* avahi_address_resolver_new_a( + AvahiClient *client, + AvahiIfIndex interface, + AvahiProtocol protocol, + const AvahiAddress *a, + AvahiLookupFlags flags, + AvahiAddressResolverCallback callback, + void *userdata); + +/** Get the parent client of an AvahiAddressResolver object */ +AvahiClient* avahi_address_resolver_get_client (AvahiAddressResolver *); + +/** Free a AvahiAddressResolver resolver object */ +int avahi_address_resolver_free(AvahiAddressResolver *r); + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +AVAHI_C_DECL_END +#endif + + +#endif diff --git a/avahi-client/publish.h b/avahi-client/publish.h new file mode 100644 index 0000000..7c678a9 --- /dev/null +++ b/avahi-client/publish.h @@ -0,0 +1,160 @@ +#ifndef fooclientpublishhfoo +#define fooclientpublishhfoo + +/* $Id$ */ + +/*** + This file is part of avahi. + + avahi is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + avahi is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General + Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with avahi; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#include <inttypes.h> + +#include <avahi-common/cdecl.h> +#include <avahi-common/address.h> +#include <avahi-common/strlst.h> +#include <avahi-common/defs.h> +#include <avahi-common/watch.h> +#include <avahi-common/gccmacro.h> + +#include <avahi-client/client.h> + +/** \file avahi-client/publish.h Publishing Client API */ + +/** \example client-publish-service.c Example how to register a DNS-SD + * service using the client interface to avahi-daemon. It behaves like a network + * printer registering both an IPP and a BSD LPR service. */ + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +AVAHI_C_DECL_BEGIN +#endif + +/** An entry group object */ +typedef struct AvahiEntryGroup AvahiEntryGroup; + +/** The function prototype for the callback of an AvahiEntryGroup */ +typedef void (*AvahiEntryGroupCallback) (AvahiEntryGroup *g, AvahiEntryGroupState state, void* userdata); + +/** Create a new AvahiEntryGroup object */ +AvahiEntryGroup* avahi_entry_group_new (AvahiClient*, AvahiEntryGroupCallback callback, void *userdata); + +/** Clean up and free an AvahiEntryGroup object */ +int avahi_entry_group_free (AvahiEntryGroup *); + +/** Commit an AvahiEntryGroup */ +int avahi_entry_group_commit (AvahiEntryGroup*); + +/** Reset an AvahiEntryGroup */ +int avahi_entry_group_reset (AvahiEntryGroup*); + +/** Get an AvahiEntryGroup's state */ +int avahi_entry_group_get_state (AvahiEntryGroup*); + +/** Check if an AvahiEntryGroup is empty */ +int avahi_entry_group_is_empty (AvahiEntryGroup*); + +/** Get an AvahiEntryGroup's owning client instance */ +AvahiClient* avahi_entry_group_get_client (AvahiEntryGroup*); + +/** Add a service, takes a variable NULL terminated list of text records */ +int avahi_entry_group_add_service( + AvahiEntryGroup *group, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiPublishFlags flags, + const char *name, + const char *type, + const char *domain, + const char *host, + uint16_t port, + ...) AVAHI_GCC_SENTINEL; + +/** Add a service, takes an AvahiStringList for text records */ +int avahi_entry_group_add_service_strlst( + AvahiEntryGroup *group, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiPublishFlags flags, + const char *name, + const char *type, + const char *domain, + const char *host, + uint16_t port, + AvahiStringList *txt); + +/** Add a service, takes a NULL terminated va_list for text records */ +int avahi_entry_group_add_service_va( + AvahiEntryGroup *group, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiPublishFlags flags, + const char *name, + const char *type, + const char *domain, + const char *host, + uint16_t port, + va_list va); + +/** Add a subtype for a service */ +int avahi_entry_group_add_service_subtype( + AvahiEntryGroup *group, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiPublishFlags flags, + const char *name, + const char *type, + const char *domain, + const char *subtype); + +/** Update a TXT record for an existing service */ +int avahi_entry_group_update_service_txt( + AvahiEntryGroup *g, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiPublishFlags flags, + const char *name, + const char *type, + const char *domain, + ...) AVAHI_GCC_SENTINEL; + +/** Update a TXT record for an existing service */ +int avahi_entry_group_update_service_txt_strlst( + AvahiEntryGroup *g, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiPublishFlags flags, + const char *name, + const char *type, + const char *domain, + AvahiStringList *strlst); + +/** Update a TXT record for an existing service */ +int avahi_entry_group_update_service_txt_va( + AvahiEntryGroup *g, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiPublishFlags flags, + const char *name, + const char *type, + const char *domain, + va_list va); + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +AVAHI_C_DECL_END +#endif + +#endif diff --git a/avahi-client/srv-test.c b/avahi-client/srv-test.c index 1a453bc..4e0959e 100644 --- a/avahi-client/srv-test.c +++ b/avahi-client/srv-test.c @@ -27,6 +27,7 @@ #include <assert.h> #include <avahi-client/client.h> +#include <avahi-client/lookup.h> #include <avahi-common/error.h> #include <avahi-common/simple-watch.h> #include <avahi-common/malloc.h> |