summaryrefslogtreecommitdiffstats
path: root/avahi-daemon
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2005-10-17 02:07:26 +0000
committerLennart Poettering <lennart@poettering.net>2005-10-17 02:07:26 +0000
commit0c54764cf19428a0c52724a75ddf3368e3899209 (patch)
treec75465bb36f99d179b65fea6c4daee856f67435a /avahi-daemon
parent41f2725b37437a585ce285051bdae06f4919dc3b (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-daemon')
-rw-r--r--avahi-daemon/EntryGroup.introspect10
-rw-r--r--avahi-daemon/dbus-protocol.c153
2 files changed, 110 insertions, 53 deletions
diff --git a/avahi-daemon/EntryGroup.introspect b/avahi-daemon/EntryGroup.introspect
index ef3fb5f..b5c2382 100644
--- a/avahi-daemon/EntryGroup.introspect
+++ b/avahi-daemon/EntryGroup.introspect
@@ -49,6 +49,16 @@
<arg name="subtype" type="s" direction="in"/>
</method>
+ <method name="UpdateServiceTxt">
+ <arg name="interface" type="i" direction="in"/>
+ <arg name="protocol" type="i" direction="in"/>
+ <arg name="flags" type="u" direction="in"/>
+ <arg name="name" type="s" direction="in"/>
+ <arg name="type" type="s" direction="in"/>
+ <arg name="domain" type="s" direction="in"/>
+ <arg name="txt" type="aay" direction="in"/>
+ </method>
+
<method name="AddAddress">
<arg name="interface" type="i" direction="in"/>
<arg name="protocol" type="i" direction="in"/>
diff --git a/avahi-daemon/dbus-protocol.c b/avahi-daemon/dbus-protocol.c
index ce21521..3b2c76a 100644
--- a/avahi-daemon/dbus-protocol.c
+++ b/avahi-daemon/dbus-protocol.c
@@ -697,6 +697,58 @@ static void entry_group_callback(AvahiServer *s, AvahiSEntryGroup *g, AvahiEntry
dbus_message_unref(m);
}
+static int read_strlst(DBusMessage *m, int idx, AvahiStringList **l) {
+ DBusMessageIter iter, sub;
+ int j;
+ AvahiStringList *strlst = NULL;
+
+ assert(m);
+ assert(l);
+
+ dbus_message_iter_init(m, &iter);
+
+ for (j = 0; j < idx; j++)
+ dbus_message_iter_next(&iter);
+
+ if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
+ dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_ARRAY)
+ goto fail;
+
+ dbus_message_iter_recurse(&iter, &sub);
+
+ for (;;) {
+ DBusMessageIter sub2;
+ int at, n;
+ uint8_t *k;
+
+ if ((at = dbus_message_iter_get_arg_type(&sub)) == DBUS_TYPE_INVALID)
+ break;
+
+ assert(at == DBUS_TYPE_ARRAY);
+
+ if (dbus_message_iter_get_element_type(&sub) != DBUS_TYPE_BYTE)
+ goto fail;
+
+ dbus_message_iter_recurse(&sub, &sub2);
+ dbus_message_iter_get_fixed_array(&sub2, &k, &n);
+ strlst = avahi_string_list_add_arbitrary(strlst, k, n);
+
+ dbus_message_iter_next(&sub);
+ }
+
+ *l = strlst;
+
+ return 0;
+
+fail:
+ avahi_log_warn("Error parsing TXT data");
+
+ avahi_string_list_free(strlst);
+ *l = NULL;
+ return -1;
+}
+
+
static DBusHandlerResult msg_entry_group_impl(DBusConnection *c, DBusMessage *m, void *userdata) {
DBusError error;
EntryGroupInfo *i = userdata;
@@ -786,9 +838,7 @@ static DBusHandlerResult msg_entry_group_impl(DBusConnection *c, DBusMessage *m,
uint32_t flags;
char *type, *name, *domain, *host;
uint16_t port;
- AvahiStringList *strlst;
- DBusMessageIter iter, sub;
- int j;
+ AvahiStringList *strlst = NULL;
if (!dbus_message_get_args(
m, &error,
@@ -800,50 +850,15 @@ static DBusHandlerResult msg_entry_group_impl(DBusConnection *c, DBusMessage *m,
DBUS_TYPE_STRING, &domain,
DBUS_TYPE_STRING, &host,
DBUS_TYPE_UINT16, &port,
- DBUS_TYPE_INVALID) || !type || !name) {
+ DBUS_TYPE_INVALID) ||
+ !type || !name ||
+ read_strlst(m, 8, &strlst) < 0) {
avahi_log_warn("Error parsing EntryGroup::AddService message");
goto fail;
}
- dbus_message_iter_init(m, &iter);
-
- for (j = 0; j < 8; j++)
- dbus_message_iter_next(&iter);
-
- if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
- dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_ARRAY) {
- avahi_log_warn("Error parsing EntryGroup::AddService message 2");
- goto fail;
- }
-
- strlst = NULL;
- dbus_message_iter_recurse(&iter, &sub);
-
- for (;;) {
- DBusMessageIter sub2;
- int at, n;
- uint8_t *k;
-
- if ((at = dbus_message_iter_get_arg_type(&sub)) == DBUS_TYPE_INVALID)
- break;
-
- assert(at == DBUS_TYPE_ARRAY);
-
- if (dbus_message_iter_get_element_type(&sub) != DBUS_TYPE_BYTE) {
- avahi_log_warn("Error parsing EntryGroup::AddService message");
- goto fail;
- }
-
- dbus_message_iter_recurse(&sub, &sub2);
- dbus_message_iter_get_fixed_array(&sub2, &k, &n);
- strlst = avahi_string_list_add_arbitrary(strlst, k, n);
-
- dbus_message_iter_next(&sub);
- }
-
- if (i->n_entries >= MAX_ENTRIES_PER_ENTRY_GROUP) {
+ if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= MAX_ENTRIES_PER_ENTRY_GROUP) {
avahi_string_list_free(strlst);
- avahi_log_warn("Too many entries per entry group, client request failed.");
return respond_error(c, m, AVAHI_ERR_TOO_MANY_ENTRIES, NULL);
}
@@ -858,7 +873,9 @@ static DBusHandlerResult msg_entry_group_impl(DBusConnection *c, DBusMessage *m,
return respond_error(c, m, avahi_server_errno(avahi_server), NULL);
}
- i->n_entries ++;
+ if (!(flags & AVAHI_PUBLISH_UPDATE))
+ i->n_entries ++;
+
avahi_string_list_free(strlst);
return respond_ok(c, m);
@@ -883,10 +900,8 @@ static DBusHandlerResult msg_entry_group_impl(DBusConnection *c, DBusMessage *m,
goto fail;
}
- if (i->n_entries >= MAX_ENTRIES_PER_ENTRY_GROUP) {
- avahi_log_warn("Too many entries per entry group, client request failed.");
+ if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= MAX_ENTRIES_PER_ENTRY_GROUP)
return respond_error(c, m, AVAHI_ERR_TOO_MANY_ENTRIES, NULL);
- }
if (domain && !*domain)
domain = NULL;
@@ -894,7 +909,41 @@ static DBusHandlerResult msg_entry_group_impl(DBusConnection *c, DBusMessage *m,
if (avahi_server_add_service_subtype(avahi_server, i->entry_group, (AvahiIfIndex) interface, (AvahiProtocol) protocol, (AvahiPublishFlags) flags, name, type, domain, subtype) < 0)
return respond_error(c, m, avahi_server_errno(avahi_server), NULL);
- i->n_entries ++;
+ if (!(flags & AVAHI_PUBLISH_UPDATE))
+ i->n_entries ++;
+
+ return respond_ok(c, m);
+
+ } else if (dbus_message_is_method_call(m, AVAHI_DBUS_INTERFACE_ENTRY_GROUP, "UpdateServiceTxt")) {
+ int32_t interface, protocol;
+ uint32_t flags;
+ char *type, *name, *domain;
+ AvahiStringList *strlst;
+
+ if (!dbus_message_get_args(
+ m, &error,
+ DBUS_TYPE_INT32, &interface,
+ DBUS_TYPE_INT32, &protocol,
+ DBUS_TYPE_UINT32, &flags,
+ DBUS_TYPE_STRING, &name,
+ DBUS_TYPE_STRING, &type,
+ DBUS_TYPE_STRING, &domain,
+ DBUS_TYPE_INVALID) ||
+ !type || !name ||
+ read_strlst(m, 6, &strlst)) {
+ avahi_log_warn("Error parsing EntryGroup::UpdateServiceTxt message");
+ goto fail;
+ }
+
+ if (domain && !*domain)
+ domain = NULL;
+
+ if (avahi_server_update_service_txt_strlst(avahi_server, i->entry_group, (AvahiIfIndex) interface, (AvahiProtocol) protocol, (AvahiPublishFlags) flags, name, type, domain, strlst) < 0) {
+ avahi_string_list_free(strlst);
+ return respond_error(c, m, avahi_server_errno(avahi_server), NULL);
+ }
+
+ avahi_string_list_free(strlst);
return respond_ok(c, m);
@@ -916,19 +965,17 @@ static DBusHandlerResult msg_entry_group_impl(DBusConnection *c, DBusMessage *m,
goto fail;
}
- if (i->n_entries >= MAX_ENTRIES_PER_ENTRY_GROUP) {
- avahi_log_warn("Too many entries per entry group, client request failed.");
+ if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= MAX_ENTRIES_PER_ENTRY_GROUP)
return respond_error(c, m, AVAHI_ERR_TOO_MANY_ENTRIES, NULL);
- }
- if (!(avahi_address_parse(address, AVAHI_PROTO_UNSPEC, &a))) {
+ if (!(avahi_address_parse(address, AVAHI_PROTO_UNSPEC, &a)))
return respond_error(c, m, AVAHI_ERR_INVALID_ADDRESS, NULL);
- }
if (avahi_server_add_address(avahi_server, i->entry_group, (AvahiIfIndex) interface, (AvahiProtocol) protocol, (AvahiPublishFlags) flags, name, &a) < 0)
return respond_error(c, m, avahi_server_errno(avahi_server), NULL);
- i->n_entries ++;
+ if (!(flags & AVAHI_PUBLISH_UPDATE))
+ i->n_entries ++;
return respond_ok(c, m);
}