summaryrefslogtreecommitdiffstats
path: root/devel/gnomevfs2
diff options
context:
space:
mode:
authormarcus <marcus@df743ca5-7f9a-e211-a948-0013205c9059>2005-12-05 06:15:46 +0800
committermarcus <marcus@df743ca5-7f9a-e211-a948-0013205c9059>2005-12-05 06:15:46 +0800
commit6814ad6a1e2840d7b6f4c6439dc6fe02cf1a7627 (patch)
treeab0d8a26976069c4999d1c8c729ca1f01a380ded /devel/gnomevfs2
parent7c578b66cbf70f889452bdbd4f4aae8108b4c960 (diff)
downloadmarcuscom-ports-6814ad6a1e2840d7b6f4c6439dc6fe02cf1a7627.tar
marcuscom-ports-6814ad6a1e2840d7b6f4c6439dc6fe02cf1a7627.tar.gz
marcuscom-ports-6814ad6a1e2840d7b6f4c6439dc6fe02cf1a7627.tar.bz2
marcuscom-ports-6814ad6a1e2840d7b6f4c6439dc6fe02cf1a7627.tar.lz
marcuscom-ports-6814ad6a1e2840d7b6f4c6439dc6fe02cf1a7627.tar.xz
marcuscom-ports-6814ad6a1e2840d7b6f4c6439dc6fe02cf1a7627.tar.zst
marcuscom-ports-6814ad6a1e2840d7b6f4c6439dc6fe02cf1a7627.zip
Fix build with Avahi 0.6.x.
Obtained from: GNOME CVS git-svn-id: svn://creme-brulee.marcuscom.com/ports/trunk@5252 df743ca5-7f9a-e211-a948-0013205c9059
Diffstat (limited to 'devel/gnomevfs2')
-rw-r--r--devel/gnomevfs2/files/patch-libgnomevfs_gnome-vfs-dns-sd.c591
-rw-r--r--devel/gnomevfs2/files/patch-modules_dns-sd-method.c58
2 files changed, 649 insertions, 0 deletions
diff --git a/devel/gnomevfs2/files/patch-libgnomevfs_gnome-vfs-dns-sd.c b/devel/gnomevfs2/files/patch-libgnomevfs_gnome-vfs-dns-sd.c
new file mode 100644
index 000000000..38820afa7
--- /dev/null
+++ b/devel/gnomevfs2/files/patch-libgnomevfs_gnome-vfs-dns-sd.c
@@ -0,0 +1,591 @@
+--- libgnomevfs/gnome-vfs-dns-sd.c 2005/11/14 11:41:13 1.16
++++ libgnomevfs/gnome-vfs-dns-sd.c 2005/11/22 10:55:30 1.18
+@@ -36,6 +36,15 @@
+ #include <gconf/gconf-client.h>
+ #include <unistd.h>
+
++#ifdef HAVE_AVAHI
++#include <avahi-client/client.h>
++#include <avahi-client/lookup.h>
++#include <avahi-common/error.h>
++#include <avahi-common/simple-watch.h>
++#include <avahi-common/timeval.h>
++#include <avahi-glib/glib-watch.h>
++#endif
++
+ #ifdef HAVE_HOWL
+ /* Need to work around howl exporting its config file... */
+ #undef PACKAGE
+@@ -722,6 +731,60 @@
+
+ /* multicast DNS functions */
+
++#ifdef HAVE_AVAHI
++static AvahiClient *global_client = NULL;
++static gboolean avahi_initialized = FALSE;
++
++static AvahiClient *get_global_avahi_client (void);
++
++/* Callback for state changes on the Client */
++static void
++avahi_client_callback (AvahiClient *client, AvahiClientState state, void *userdata)
++{
++ if (state == AVAHI_CLIENT_FAILURE) {
++ if (avahi_client_errno (client) == AVAHI_ERR_DISCONNECTED) {
++ /* Destroy old client */
++ avahi_client_free (client);
++ global_client = NULL;
++ avahi_initialized = FALSE;
++
++ /* Reconnect */
++ get_global_avahi_client ();
++ }
++ }
++}
++
++static AvahiClient *
++get_global_avahi_client (void) {
++ static AvahiGLibPoll *glib_poll = NULL;
++ int error;
++
++ if (!avahi_initialized) {
++ if (glib_poll == NULL) {
++ glib_poll = avahi_glib_poll_new (NULL, G_PRIORITY_DEFAULT);
++ }
++
++ /* Create a new AvahiClient instance */
++ global_client = avahi_client_new (avahi_glib_poll_get (glib_poll),
++ AVAHI_CLIENT_NO_FAIL,
++ avahi_client_callback,
++ glib_poll,
++ &error);
++
++ if (global_client == NULL) {
++ /* Print out the error string */
++ g_warning ("Error initializing Avahi: %s", avahi_strerror (error));
++ avahi_glib_poll_free (glib_poll);
++ glib_poll = NULL;
++ return NULL;
++ }
++ avahi_initialized = TRUE;
++ }
++
++ return global_client;
++}
++#endif
++
+ #ifdef HAVE_HOWL
+
+ static gboolean
+@@ -788,6 +851,10 @@
+
+ /* multicast: */
+
++#ifdef HAVE_AVAHI
++ AvahiServiceBrowser *avahi_sb;
++#endif
++
+ #ifdef HAVE_HOWL
+ sw_discovery_oid howl_id;
+ #endif
+@@ -864,6 +931,41 @@
+ return NULL;
+ }
+
++#ifdef HAVE_AVAHI
++static void
++avahi_browse_callback (AvahiServiceBrowser *b,
++ AvahiIfIndex interface,
++ AvahiProtocol protocol,
++ AvahiBrowserEvent event,
++ const char *name,
++ const char *type,
++ const char *domain,
++ AvahiLookupResultFlags flags,
++ void *userdata)
++{
++ GnomeVFSDNSSDBrowseHandle *handle;
++ GnomeVFSDNSSDService service;
++ handle = userdata;
++
++ service.name = (char *)name;
++ service.type = (char *)type;
++ service.domain = (char *)domain;
++
++ if (event == AVAHI_BROWSER_FAILURE ||
++ event == AVAHI_BROWSER_ALL_FOR_NOW ||
++ event == AVAHI_BROWSER_CACHE_EXHAUSTED) {
++ return;
++ }
++
++ if (!handle->cancelled) {
++ handle->callback (handle,
++ (event == AVAHI_BROWSER_NEW) ? GNOME_VFS_DNS_SD_SERVICE_ADDED : GNOME_VFS_DNS_SD_SERVICE_REMOVED,
++ &service,
++ handle->callback_data);
++ }
++}
++#endif
++
+ #ifdef HAVE_HOWL
+
+ struct howl_browse_idle_data {
+@@ -1012,7 +1114,25 @@
+ handle->callback_data_destroy_func = callback_data_destroy_func;
+
+ if (strcmp (domain, "local") == 0) {
+-#ifdef HAVE_HOWL
++#ifdef HAVE_AVAHI
++ AvahiClient *client;
++ AvahiServiceBrowser *sb;
++
++ handle->is_local = TRUE;
++ client = get_global_avahi_client ();
++ if (client) {
++ sb = avahi_service_browser_new (client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, type, NULL,
++ AVAHI_LOOKUP_USE_MULTICAST,
++ avahi_browse_callback, handle);
++ if (sb != NULL) {
++ handle->avahi_sb = sb;
++ *handle_out = handle;
++ return GNOME_VFS_OK;
++ }
++ g_warning ("Failed to create service browser: %s\n", avahi_strerror( avahi_client_errno (client)));
++ }
++ return GNOME_VFS_ERROR_GENERIC;
++#elif defined (HAVE_HOWL)
+ sw_result res;
+ sw_discovery session;
+
+@@ -1063,6 +1183,11 @@
+ gnome_vfs_dns_sd_stop_browse (GnomeVFSDNSSDBrowseHandle *handle)
+ {
+ if (handle->is_local) {
++#ifdef HAVE_AVAHI
++ handle->cancelled = TRUE;
++ avahi_service_browser_free (handle->avahi_sb);
++ free_browse_handle (handle);
++#endif
+ #ifdef HAVE_HOWL
+ handle->cancelled = TRUE;
+ sw_discovery_cancel (get_global_howl_session (), handle->howl_id);
+@@ -1093,6 +1218,10 @@
+ int text_len;
+
+ /* multicast: */
++#ifdef HAVE_AVAHI
++ AvahiServiceResolver *avahi_sr;
++#endif
++
+ #ifdef HAVE_HOWL
+ sw_discovery_oid howl_id;
+ guint timeout_tag;
+@@ -1174,6 +1303,71 @@
+ return NULL;
+ }
+
++#ifdef HAVE_AVAHI
++static void
++avahi_resolve_async_callback (AvahiServiceResolver *r,
++ AvahiIfIndex interface,
++ AvahiProtocol protocol,
++ AvahiResolverEvent event,
++ const char *name,
++ const char *type,
++ const char *domain,
++ const char *host_name,
++ const AvahiAddress *address,
++ uint16_t port,
++ AvahiStringList *txt,
++ AvahiLookupResultFlags flags,
++ void *user_data)
++{
++ GnomeVFSDNSSDResolveHandle *handle;
++ GnomeVFSDNSSDService service;
++ GHashTable *hash;
++ size_t text_len;
++ char *text;
++ char host[128];
++
++ handle = user_data;
++ if (event == AVAHI_RESOLVER_FOUND) {
++ text_len = avahi_string_list_serialize (txt, NULL, 0);
++ text = g_malloc (text_len);
++ text_len = avahi_string_list_serialize (txt, text, text_len);
++
++ hash = decode_txt_record (text, text_len);
++
++ service.name = (char *)name;
++ service.type = (char *)type;
++ service.domain = (char *)domain;
++
++ avahi_address_snprint (host, sizeof(host), address);
++ handle->callback (handle,
++ GNOME_VFS_OK,
++ &service,
++ host,
++ port,
++ hash,
++ handle->text_len,
++ handle->text,
++ handle->callback_data);
++ if (hash) {
++ g_hash_table_destroy (hash);
++ }
++ g_free (text);
++
++ } else if (event == AVAHI_RESOLVER_FAILURE) {
++ handle->callback (handle,
++ GNOME_VFS_ERROR_HOST_NOT_FOUND,
++ NULL,
++ NULL, 0,
++ NULL, 0, NULL,
++ handle->callback_data);
++ }
++
++ avahi_service_resolver_free (r);
++ free_resolve_handle (handle);
++}
++
++#endif
++
+
+ #ifdef HAVE_HOWL
+ static gboolean
+@@ -1329,7 +1523,25 @@
+ handle->callback_data_destroy_func = callback_data_destroy_func;
+
+ if (strcmp (domain, "local") == 0) {
+-#ifdef HAVE_HOWL
++#ifdef HAVE_AVAHI
++ AvahiClient *client;
++ AvahiServiceResolver *sr;
++
++ handle->is_local = TRUE;
++ client = get_global_avahi_client ();
++ if (client) {
++ sr = avahi_service_resolver_new (client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
++ name, type, domain, AVAHI_PROTO_UNSPEC,
++ AVAHI_LOOKUP_USE_MULTICAST,
++ avahi_resolve_async_callback, handle);
++ if (sr != NULL) {
++ handle->avahi_sr = sr;
++ *handle_out = handle;
++ return GNOME_VFS_OK;
++ }
++ }
++ return GNOME_VFS_ERROR_GENERIC;
++#elif defined (HAVE_HOWL)
+ sw_result res;
+ sw_discovery session;
+
+@@ -1386,6 +1598,10 @@
+ gnome_vfs_dns_sd_cancel_resolve (GnomeVFSDNSSDResolveHandle *handle)
+ {
+ if (handle->is_local) {
++#ifdef HAVE_AVAHI
++ avahi_service_resolver_free (handle->avahi_sr);
++ free_resolve_handle (handle);
++#endif
+ #ifdef HAVE_HOWL
+ g_source_remove (handle->timeout_tag);
+ if (handle->idle_tag) {
+@@ -1408,8 +1624,7 @@
+ }
+ }
+
+-
+-#ifdef HAVE_HOWL
++#if defined(HAVE_AVAHI) || defined(HAVE_HOWL)
+ static int
+ find_existing_service (GArray *array,
+ const char *name,
+@@ -1430,6 +1645,89 @@
+ return -1;
+
+ }
++#endif
++
++
++#ifdef HAVE_AVAHI
++struct sync_browse_data {
++ AvahiSimplePoll *poll;
++ GArray *array;
++};
++
++static void
++avahi_browse_sync_client_callback (AvahiClient *client, AvahiClientState state, void *user_data)
++{
++ struct sync_browse_data *data;
++
++ data = user_data;
++ if (state == AVAHI_CLIENT_FAILURE) {
++ avahi_simple_poll_quit (data->poll);
++ }
++}
++
++static void
++avahi_browse_sync_callback (AvahiServiceBrowser *b,
++ AvahiIfIndex interface,
++ AvahiProtocol protocol,
++ AvahiBrowserEvent event,
++ const char *name,
++ const char *type,
++ const char *domain,
++ AvahiLookupResultFlags flags,
++ void *user_data)
++{
++ struct sync_browse_data *data;
++ GnomeVFSDNSSDService service, *existing;
++ int i;
++ gboolean free_service;
++
++ data = user_data;
++
++ free_service = TRUE;
++ service.name = g_strdup (name);
++ service.type = g_strdup (type);
++ service.domain = g_strdup (domain);
++
++ if (event == AVAHI_BROWSER_NEW) {
++ if (find_existing_service (data->array, service.name, service.type,
++ service.domain) == -1) {
++ free_service = FALSE;
++ g_array_append_val (data->array, service);
++ }
++ } else if (event == AVAHI_BROWSER_REMOVE) {
++ i = find_existing_service (data->array, service.name, service.type,
++ service.domain);
++ if (i != -1) {
++ existing = &g_array_index (data->array, GnomeVFSDNSSDService, i);
++ g_free (existing->name);
++ g_free (existing->type);
++ g_free (existing->domain);
++ g_array_remove_index (data->array, i);
++ }
++ } else if (event == AVAHI_BROWSER_ALL_FOR_NOW) {
++ avahi_simple_poll_quit (data->poll);
++ }
++
++
++ if (free_service) {
++ g_free (service.name);
++ g_free (service.type);
++ g_free (service.domain);
++ }
++}
++
++static void
++stop_poll_timeout (AvahiTimeout *timeout, void *user_data)
++{
++ AvahiSimplePoll *poll = user_data;
++
++ avahi_simple_poll_quit (poll);
++}
++
++#endif
++
++
++#ifdef HAVE_HOWL
+
+
+ static sw_result
+@@ -1530,7 +1828,66 @@
+ *services = NULL;
+
+ if (strcmp (domain, "local") == 0) {
+-#ifdef HAVE_HOWL
++#ifdef HAVE_AVAHI
++ AvahiSimplePoll *simple_poll;
++ const AvahiPoll *poll;
++ AvahiClient *client = NULL;
++ AvahiServiceBrowser *sb;
++ int error;
++ GArray *array;
++ struct sync_browse_data data;
++ struct timeval tv;
++
++ simple_poll = avahi_simple_poll_new ();
++ data.poll = simple_poll;
++ if (simple_poll == NULL) {
++ g_warning ("Failed to create simple poll object");
++ return GNOME_VFS_ERROR_GENERIC;
++ }
++
++ poll = avahi_simple_poll_get (simple_poll);
++ client = avahi_client_new (poll, 0,
++ avahi_browse_sync_client_callback, &data, &error);
++
++ /* Check wether creating the client object succeeded */
++ if (client == NULL) {
++ g_warning ("Failed to create client: %s\n", avahi_strerror (error));
++ avahi_simple_poll_free (simple_poll);
++ return GNOME_VFS_ERROR_GENERIC;
++ }
++
++
++ array = g_array_new (FALSE, FALSE, sizeof (GnomeVFSDNSSDService));
++ data.array = array;
++ sb = avahi_service_browser_new (client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, type, NULL,
++ AVAHI_LOOKUP_USE_MULTICAST, avahi_browse_sync_callback, &data);
++ if (sb == NULL) {
++ g_warning ("Failed to create service browser: %s\n", avahi_strerror (avahi_client_errno (client)));
++ g_array_free (array, TRUE);
++ avahi_client_free (client);
++ avahi_simple_poll_free (simple_poll);
++ return GNOME_VFS_ERROR_GENERIC;
++ }
++
++
++ avahi_elapse_time (&tv, timeout_msec, 0);
++ poll->timeout_new (poll, &tv, stop_poll_timeout, (void *)simple_poll);
++
++ /* Run the main loop util reply or timeout */
++ for (;;)
++ if (avahi_simple_poll_iterate (simple_poll, -1) != 0)
++ break;
++
++
++ avahi_service_browser_free (sb);
++ avahi_client_free (client);
++ avahi_simple_poll_free (simple_poll);
++
++ *n_services = array->len;
++ *services = (GnomeVFSDNSSDService *)g_array_free (array, FALSE);
++
++ return GNOME_VFS_OK;
++#elif defined (HAVE_HOWL)
+ sw_discovery session;
+ sw_salt salt;
+ sw_result res;
+@@ -1599,6 +1956,63 @@
+ }
+ }
+
++#ifdef HAVE_AVAHI
++struct sync_resolve_data {
++ AvahiSimplePoll *poll;
++ gboolean got_data;
++ char *host;
++ int port;
++ char *text;
++ int text_len;
++};
++
++
++static void
++avahi_resolve_sync_client_callback (AvahiClient *c, AvahiClientState state, void *user_data)
++{
++ struct sync_resolve_data *data;
++
++ data = user_data;
++ if (state == AVAHI_CLIENT_FAILURE) {
++ avahi_simple_poll_quit (data->poll);
++ }
++}
++
++static void
++avahi_resolve_sync_callback (AvahiServiceResolver *r,
++ AvahiIfIndex interface,
++ AvahiProtocol protocol,
++ AvahiResolverEvent event,
++ const char *name,
++ const char *type,
++ const char *domain,
++ const char *host_name,
++ const AvahiAddress *address,
++ uint16_t port,
++ AvahiStringList *txt,
++ AvahiLookupResultFlags flags,
++ void *user_data)
++{
++ struct sync_resolve_data *data;
++ char a[128];
++
++ data = user_data;
++ if (event == AVAHI_RESOLVER_FOUND) {
++ data->got_data = TRUE;
++ avahi_address_snprint (a, sizeof(a), address);
++ data->host = g_strdup (a);
++ data->port = port;
++ data->text_len = avahi_string_list_serialize (txt, NULL, 0);
++ data->text = g_malloc (data->text_len);
++ avahi_string_list_serialize (txt, data->text, data->text_len);
++ }
++
++ avahi_service_resolver_free (r);
++ avahi_simple_poll_quit (data->poll);
++}
++
++#endif
++
+ #ifdef HAVE_HOWL
+ struct sync_resolve_data {
+ gboolean got_data;
+@@ -1672,7 +2086,65 @@
+ GnomeVFSResult res;
+
+ if (strcmp (domain, "local") == 0) {
+-#ifdef HAVE_HOWL
++#ifdef HAVE_AVAHI
++ AvahiSimplePoll *simple_poll;
++ AvahiClient *client = NULL;
++ AvahiServiceResolver *sr;
++ int error;
++ struct sync_resolve_data resolve_data = {0};
++
++ simple_poll = avahi_simple_poll_new ();
++ resolve_data.poll = simple_poll;
++ if (simple_poll == NULL) {
++ g_warning ("Failed to create simple poll object");
++ return GNOME_VFS_ERROR_GENERIC;
++ }
++
++ client = avahi_client_new (avahi_simple_poll_get (simple_poll), 0,
++ avahi_resolve_sync_client_callback, &resolve_data, &error);
++
++ /* Check wether creating the client object succeeded */
++ if (client == NULL) {
++ g_warning ("Failed to create client: %s\n", avahi_strerror (error));
++ avahi_simple_poll_free (simple_poll);
++ return GNOME_VFS_ERROR_GENERIC;
++ }
++
++ sr = avahi_service_resolver_new (client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
++ name, type, domain, AVAHI_PROTO_UNSPEC,
++ AVAHI_LOOKUP_USE_MULTICAST,
++ avahi_resolve_sync_callback, &resolve_data);
++ if (sr == NULL) {
++ g_warning ("Failed to resolve service '%s': %s\n", name, avahi_strerror (avahi_client_errno (client)));
++ avahi_client_free (client);
++ avahi_simple_poll_free (simple_poll);
++ return GNOME_VFS_ERROR_GENERIC;
++ }
++
++ /* Run the main loop util reply or timeout */
++ for (;;)
++ if (avahi_simple_poll_iterate (simple_poll, -1) != 0)
++ break;
++
++ avahi_client_free (client);
++ avahi_simple_poll_free (simple_poll);
++
++ if (resolve_data.got_data) {
++ *host = resolve_data.host;
++ *port = resolve_data.port;
++ if (text != NULL)
++ *text = decode_txt_record (resolve_data.text, resolve_data.text_len);
++ if (text_raw_len_out != NULL && text_raw_out) {
++ *text_raw_len_out = resolve_data.text_len;
++ *text_raw_out = resolve_data.text;
++ } else {
++ g_free (resolve_data.text);
++ }
++ return GNOME_VFS_OK;
++ }
++
++ return GNOME_VFS_ERROR_HOST_NOT_FOUND;
++#elif defined (HAVE_HOWL)
+ sw_discovery session;
+ sw_salt salt;
+ sw_result res;
diff --git a/devel/gnomevfs2/files/patch-modules_dns-sd-method.c b/devel/gnomevfs2/files/patch-modules_dns-sd-method.c
new file mode 100644
index 000000000..3a14e2144
--- /dev/null
+++ b/devel/gnomevfs2/files/patch-modules_dns-sd-method.c
@@ -0,0 +1,58 @@
+--- modules/dns-sd-method.c.orig Sun Dec 4 16:49:28 2005
++++ modules/dns-sd-method.c Sun Dec 4 16:51:37 2005
+@@ -31,7 +31,9 @@
+
+ #ifdef HAVE_AVAHI
+ #include <avahi-client/client.h>
++#include <avahi-client/lookup.h>
+ #include <avahi-common/error.h>
++#include <avahi-common/timeval.h>
+ #include <avahi-common/simple-watch.h>
+ #include <avahi-glib/glib-watch.h>
+ #endif
+@@ -320,7 +322,7 @@ avahi_client_callback (AvahiClient *clie
+ AvahiSimplePoll *poll;
+
+ poll = user_data;
+- if (state == AVAHI_CLIENT_DISCONNECTED) {
++ if (state == AVAHI_CLIENT_FAILURE) {
+ avahi_simple_poll_quit (poll);
+ }
+ }
+@@ -333,12 +335,17 @@ local_browse_callback_sync (AvahiService
+ const char *name,
+ const char *type,
+ const char *domain,
++ AvahiLookupResultFlags flags,
+ void *user_data)
+ {
++ AvahiSimplePoll *poll = user_data;
++
+ if (event == AVAHI_BROWSER_NEW)
+ local_browse (TRUE, name, type, domain);
+ else if (event == AVAHI_BROWSER_REMOVE)
+ local_browse (FALSE, name, type, domain);
++ else if (event == AVAHI_BROWSER_ALL_FOR_NOW)
++ avahi_simple_poll_quit (poll);
+ }
+
+ static void
+@@ -385,7 +392,7 @@ init_local (void)
+ }
+
+ poll = avahi_simple_poll_get (simple_poll);
+- client = avahi_client_new (poll,
++ client = avahi_client_new (poll, 0,
+ avahi_client_callback, simple_poll, &error);
+
+ /* Check wether creating the client object succeeded */
+@@ -400,7 +407,8 @@ init_local (void)
+ for (i = 0; i < G_N_ELEMENTS (dns_sd_types); i++) {
+ sb[i] = avahi_service_browser_new (client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
+ dns_sd_types[i].type, "local",
+- local_browse_callback_sync, NULL);
++ AVAHI_LOOKUP_USE_MULTICAST,
++ local_browse_callback_sync, simple_poll);
+ }
+
+