+ env_addr = DBUS_SYSTEM_BUS_DEFAULT_ADDRESS;
+ }
+
+ conn = dbus_connection_open_private (env_addr, error);
+
+ if (!conn)
+ return NULL;
+
+ dbus_connection_set_exit_on_disconnect (conn, FALSE);
+
+ if (!dbus_bus_register (conn, error))
+ {
+ 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 */