+ dbus_connection_close (conn);
+ dbus_connection_unref (conn);
+
+ return NULL;
+ }
+
+ return conn;
+}
+
+AvahiClient *avahi_client_new(const AvahiPoll *poll_api, AvahiClientCallback callback, void *userdata, int *ret_error) {
+ AvahiClient *client = NULL;
+ DBusError error;
+
+ dbus_error_init (&error);
+
+ if (!(client = avahi_new(AvahiClient, 1))) {
+ if (ret_error)
+ *ret_error = AVAHI_ERR_NO_MEMORY;
+ goto fail;
+ }
+
+ client->poll_api = poll_api;
+ client->error = AVAHI_OK;
+ client->callback = callback;
+ client->userdata = userdata;
+ client->state = AVAHI_CLIENT_DISCONNECTED;
+
+ client->host_name = NULL;
+ 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);
+ AVAHI_LLIST_HEAD_INIT(AvahiServiceTypeBrowser, client->service_type_browsers);
+ AVAHI_LLIST_HEAD_INIT(AvahiServiceResolver, client->service_resolvers);
+ AVAHI_LLIST_HEAD_INIT(AvahiHostNameResolver, client->host_name_resolvers);
+ AVAHI_LLIST_HEAD_INIT(AvahiAddressResolver, client->address_resolvers);
+
+ if (!(client->bus = avahi_dbus_bus_get(&error)) ||
+ dbus_error_is_set (&error))
+ goto fail;
+
+ if (avahi_dbus_connection_glue(client->bus, poll_api) < 0) {
+ if (ret_error)
+ *ret_error = AVAHI_ERR_NO_MEMORY; /* Not optimal */
+ goto fail;
+ }
+
+ if (!dbus_connection_add_filter (client->bus, filter_func, client, NULL)) {
+ if (ret_error)
+ *ret_error = AVAHI_ERR_NO_MEMORY;