X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-daemon%2Fdbus-protocol.c;h=f01837a478898560e61362d8ad41e46f54d75dff;hb=56b987d1cdbccbd803cf5cca9211ffbbcb2b3672;hp=517b95413223c42e27d0a3bc3c9ee3c7e9da889e;hpb=fd25072a95549aff47d5abafd712fb14de55e172;p=catta diff --git a/avahi-daemon/dbus-protocol.c b/avahi-daemon/dbus-protocol.c index 517b954..f01837a 100644 --- a/avahi-daemon/dbus-protocol.c +++ b/avahi-daemon/dbus-protocol.c @@ -63,6 +63,8 @@ Server *server = NULL; +static int disable_user_service_publishing = 0; + static void client_free(Client *c) { assert(server); @@ -98,6 +100,9 @@ static void client_free(Client *c) { while (c->async_service_resolvers) avahi_dbus_async_service_resolver_free(c->async_service_resolvers); + while (c->record_browsers) + avahi_dbus_record_browser_free(c->record_browsers); + assert(c->n_objects == 0); avahi_free(c->name); @@ -141,6 +146,7 @@ static Client *client_get(const char *name, int create) { AVAHI_LLIST_HEAD_INIT(ServiceBrowserInfo, client->service_browsers); AVAHI_LLIST_HEAD_INIT(SyncServiceResolverInfo, client->sync_service_resolvers); AVAHI_LLIST_HEAD_INIT(AsyncServiceResolverInfo, client->async_service_resolvers); + AVAHI_LLIST_HEAD_INIT(RecordBrowserInfo, client->record_browsers); AVAHI_LLIST_PREPEND(Client, clients, server->clients, client); @@ -386,6 +392,9 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH goto fail; } + if (disable_user_service_publishing) + return avahi_dbus_respond_error(c, m, AVAHI_ERR_NOT_PERMITTED, NULL); + if (!(client = client_get(dbus_message_get_sender(m), TRUE))) { avahi_log_warn("Too many clients, client request failed."); return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL); @@ -641,7 +650,6 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL); } - if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) { avahi_log_warn("Too many objects for client '%s', client request failed.", client->name); return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL); @@ -881,6 +889,70 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH return avahi_dbus_respond_error(c, m, avahi_server_errno(avahi_server), NULL); } + dbus_connection_register_object_path(c, i->path, &vtable, i); + return avahi_dbus_respond_path(c, m, i->path); + + } else if (dbus_message_is_method_call(m, AVAHI_DBUS_INTERFACE_SERVER, "RecordBrowserNew")) { + Client *client; + RecordBrowserInfo *i; + static const DBusObjectPathVTable vtable = { + NULL, + avahi_dbus_msg_record_browser_impl, + NULL, + NULL, + NULL, + NULL + }; + int32_t interface, protocol; + uint32_t flags; + char *name; + uint16_t type, clazz; + AvahiKey *key; + + if (!dbus_message_get_args( + m, &error, + DBUS_TYPE_INT32, &interface, + DBUS_TYPE_INT32, &protocol, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_UINT16, &clazz, + DBUS_TYPE_UINT16, &type, + DBUS_TYPE_UINT32, &flags, + DBUS_TYPE_INVALID) || !name) { + avahi_log_warn("Error parsing Server::RecordBrowserNew message"); + goto fail; + } + + if (!avahi_is_valid_domain_name(name)) + return avahi_dbus_respond_error(c, m, AVAHI_ERR_INVALID_DOMAIN_NAME, NULL); + + if (!(client = client_get(dbus_message_get_sender(m), TRUE))) { + avahi_log_warn("Too many clients, client request failed."); + return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL); + } + + if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) { + avahi_log_warn("Too many objects for client '%s', client request failed.", client->name); + return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL); + } + + i = avahi_new(RecordBrowserInfo, 1); + i->id = ++client->current_id; + i->client = client; + i->path = avahi_strdup_printf("/Client%u/RecordBrowser%u", client->id, i->id); + AVAHI_LLIST_PREPEND(RecordBrowserInfo, record_browsers, client->record_browsers, i); + client->n_objects++; + + key = avahi_key_new(name, clazz, type); + assert(key); + + if (!(i->record_browser = avahi_s_record_browser_new(avahi_server, (AvahiIfIndex) interface, (AvahiProtocol) protocol, key, (AvahiLookupFlags) flags, avahi_dbus_record_browser_callback, i))) { + avahi_key_unref(key); + avahi_dbus_record_browser_free(i); + return avahi_dbus_respond_error(c, m, avahi_server_errno(avahi_server), NULL); + } + + avahi_key_unref(key); + dbus_connection_register_object_path(c, i->path, &vtable, i); return avahi_dbus_respond_path(c, m, i->path); } @@ -917,7 +989,7 @@ void dbus_protocol_server_state_changed(AvahiServerState state) { dbus_message_unref(m); } -int dbus_protocol_setup(const AvahiPoll *poll_api) { +int dbus_protocol_setup(const AvahiPoll *poll_api, int _disable_user_service_publishing) { DBusError error; static const DBusObjectPathVTable server_vtable = { @@ -931,6 +1003,8 @@ int dbus_protocol_setup(const AvahiPoll *poll_api) { dbus_error_init(&error); + disable_user_service_publishing = _disable_user_service_publishing; + server = avahi_new(Server, 1); AVAHI_LLIST_HEAD_INIT(Clients, server->clients); server->current_id = 0;