+ if (!dbus_message_get_args(
+ m, &error,
+ DBUS_TYPE_INT32, &interface,
+ DBUS_TYPE_INT32, &protocol,
+ DBUS_TYPE_STRING, &name,
+ DBUS_TYPE_STRING, &type,
+ DBUS_TYPE_STRING, &domain,
+ DBUS_TYPE_INT32, &aprotocol,
+ DBUS_TYPE_UINT32, &flags,
+ DBUS_TYPE_INVALID) || !type) {
+ avahi_log_warn("Error parsing Server::ServiceResolverNew message");
+ goto fail;
+ }
+
+ if (!(client = client_get(dbus_message_get_sender(m), TRUE))) {
+ avahi_log_warn(__FILE__": Too many clients, client request failed.");
+ return respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
+ }
+
+ if (client->n_objects >= MAX_OBJECTS_PER_CLIENT) {
+ avahi_log_warn(__FILE__": Too many objects for client '%s', client request failed.", client->name);
+ return respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
+ }
+
+ if (!*domain)
+ domain = NULL;
+
+ if (!*name)
+ name = NULL;
+
+ i = avahi_new(AsyncServiceResolverInfo, 1);
+ i->id = ++client->current_id;
+ i->client = client;
+ i->path = avahi_strdup_printf("/Client%u/ServiceResolver%u", client->id, i->id);
+ AVAHI_LLIST_PREPEND(AsyncServiceResolverInfo, async_service_resolvers, client->async_service_resolvers, i);
+ client->n_objects++;
+
+ if (!(i->service_resolver = avahi_s_service_resolver_new(avahi_server, (AvahiIfIndex) interface, (AvahiProtocol) protocol, name, type, domain, (AvahiProtocol) aprotocol, (AvahiLookupFlags) flags, async_service_resolver_callback, i))) {
+ async_service_resolver_free(i);
+ return respond_error(c, m, avahi_server_errno(avahi_server), NULL);
+ }
+
+/* avahi_log_debug(__FILE__": [%s], new service resolver for <%s.%s.%s>", i->path, name, type, domain); */
+
+ dbus_connection_register_object_path(c, i->path, &vtable, i);
+ return respond_path(c, m, i->path);
+
+ } else if (dbus_message_is_method_call(m, AVAHI_DBUS_INTERFACE_SERVER, "HostNameResolverNew")) {
+ Client *client;
+ int32_t interface, protocol, aprotocol;
+ uint32_t flags;
+ char *name;
+ AsyncHostNameResolverInfo *i;
+ static const DBusObjectPathVTable vtable = {
+ NULL,
+ msg_async_host_name_resolver_impl,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ };
+
+ if (!dbus_message_get_args(
+ m, &error,
+ DBUS_TYPE_INT32, &interface,
+ DBUS_TYPE_INT32, &protocol,
+ DBUS_TYPE_STRING, &name,
+ DBUS_TYPE_INT32, &aprotocol,
+ DBUS_TYPE_UINT32, &flags,
+ DBUS_TYPE_INVALID) || !name) {
+ avahi_log_warn("Error parsing Server::HostNameResolverNew message");
+ goto fail;
+ }
+
+ if (!(client = client_get(dbus_message_get_sender(m), TRUE))) {
+ avahi_log_warn(__FILE__": Too many clients, client request failed.");
+ return respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
+ }
+
+ if (client->n_objects >= MAX_OBJECTS_PER_CLIENT) {
+ avahi_log_warn(__FILE__": Too many objects for client '%s', client request failed.", client->name);
+ return respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
+ }
+
+ i = avahi_new(AsyncHostNameResolverInfo, 1);
+ i->id = ++client->current_id;
+ i->client = client;
+ i->path = avahi_strdup_printf("/Client%u/HostNameResolver%u", client->id, i->id);
+ AVAHI_LLIST_PREPEND(AsyncHostNameResolverInfo, async_host_name_resolvers, client->async_host_name_resolvers, i);
+ client->n_objects++;
+
+ if (!(i->host_name_resolver = avahi_s_host_name_resolver_new(avahi_server, (AvahiIfIndex) interface, (AvahiProtocol) protocol, name, aprotocol, (AvahiLookupFlags) flags, async_host_name_resolver_callback, i))) {
+ async_host_name_resolver_free(i);
+ return respond_error(c, m, avahi_server_errno(avahi_server), NULL);
+ }
+
+ dbus_connection_register_object_path(c, i->path, &vtable, i);
+ return respond_path(c, m, i->path);
+
+ } else if (dbus_message_is_method_call(m, AVAHI_DBUS_INTERFACE_SERVER, "AddressResolverNew")) {
+ Client *client;
+ int32_t interface, protocol;
+ uint32_t flags;
+ char *address;
+ AsyncAddressResolverInfo *i;
+ AvahiAddress a;
+ static const DBusObjectPathVTable vtable = {
+ NULL,
+ msg_async_address_resolver_impl,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ };
+
+ if (!dbus_message_get_args(
+ m, &error,
+ DBUS_TYPE_INT32, &interface,
+ DBUS_TYPE_INT32, &protocol,
+ DBUS_TYPE_STRING, &address,
+ DBUS_TYPE_UINT32, &flags,
+ DBUS_TYPE_INVALID) || !address) {
+ avahi_log_warn("Error parsing Server::AddressResolverNew message");
+ goto fail;
+ }
+
+ if (!avahi_address_parse(address, AVAHI_PROTO_UNSPEC, &a))
+ return respond_error(c, m, AVAHI_ERR_INVALID_ADDRESS, NULL);
+
+ if (!(client = client_get(dbus_message_get_sender(m), TRUE))) {
+ avahi_log_warn(__FILE__": Too many clients, client request failed.");
+ return respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
+ }
+
+ if (client->n_objects >= MAX_OBJECTS_PER_CLIENT) {
+ avahi_log_warn(__FILE__": Too many objects for client '%s', client request failed.", client->name);
+ return respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
+ }
+
+ i = avahi_new(AsyncAddressResolverInfo, 1);
+ i->id = ++client->current_id;
+ i->client = client;
+ i->path = avahi_strdup_printf("/Client%u/AddressResolver%u", client->id, i->id);
+ AVAHI_LLIST_PREPEND(AsyncAddressResolverInfo, async_address_resolvers, client->async_address_resolvers, i);
+ client->n_objects++;
+
+ if (!(i->address_resolver = avahi_s_address_resolver_new(avahi_server, (AvahiIfIndex) interface, (AvahiProtocol) protocol, &a, (AvahiLookupFlags) flags, async_address_resolver_callback, i))) {
+ async_address_resolver_free(i);
+ return respond_error(c, m, avahi_server_errno(avahi_server), NULL);
+ }
+
+ dbus_connection_register_object_path(c, i->path, &vtable, i);
+ return respond_path(c, m, i->path);
+ }