]> git.meshlink.io Git - catta/blobdiff - examples/browse-services.c
Rename some server side objects/symbols so that they do not conflict with the same...
[catta] / examples / browse-services.c
index bb8eed82f761b52cd7f0555c5c08d588b7d9e250..7227bd7495918029b187c1c68a8e5706cd2902cf 100644 (file)
 #include <config.h>
 #endif
 
-#include <avahi-core/core.h>
-
-static GMainLoop *main_loop = NULL;
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <time.h>
 
-static void resolve_callback(AvahiServiceResolver *r, AvahiIfIndex interface, AvahiProtocol protocol, AvahiResolverEvent event, const gchar *name,const gchar *type,const gchar *domain, const gchar *host_name, const AvahiAddress *address, guint16 port, AvahiStringList *txt, gpointer userdata) {
-    g_assert(r);
+#include <avahi-core/core.h>
+#include <avahi-common/simple-watch.h>
+#include <avahi-common/malloc.h>
+
+static AvahiSimplePoll *simple_poll = NULL;
+
+static void resolve_callback(
+    AvahiSServiceResolver *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,
+    void* userdata) {
+    
+    assert(r);
 
     /* Called whenever a service has been resolved successfully or timed out */
 
     if (event == AVAHI_RESOLVER_TIMEOUT)
-        g_message("Failed to resolve service '%s' of type '%s' in domain '%s'.", name, type, domain);
+        fprintf(stderr, "Failed to resolve service '%s' of type '%s' in domain '%s'.\n", name, type, domain);
     else {
-        gchar a[128], *t;
+        char a[128], *t;
 
-        g_assert(event == AVAHI_RESOLVER_FOUND);
+        assert(event == AVAHI_RESOLVER_FOUND);
         
-        g_message("Service '%s' of type '%s' in domain '%s':", name, type, domain);
+        fprintf(stderr, "Service '%s' of type '%s' in domain '%s':\n", name, type, domain);
 
         avahi_address_snprint(a, sizeof(a), address);
         t = avahi_string_list_to_string(txt);
-        g_message("\t%s:%u (%s) TXT=%s", host_name, port, a, t);
-        g_free(t);
+        fprintf(stderr, "\t%s:%u (%s) TXT=%s\n", host_name, port, a, t);
+        avahi_free(t);
     }
 
-    avahi_service_resolver_free(r);
+    avahi_s_service_resolver_free(r);
 }
 
-static void browse_callback(AvahiServiceBrowser *b, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const gchar *name, const gchar *type, const gchar *domain, gpointer userdata) {
-    g_assert(b);
+static void browse_callback(
+    AvahiSServiceBrowser *b,
+    AvahiIfIndex interface,
+    AvahiProtocol protocol,
+    AvahiBrowserEvent event,
+    const char *name,
+    const char *type,
+    const char *domain,
+    void* userdata) {
     
     AvahiServer *s = userdata;
+    assert(b);
 
     /* Called whenever a new services becomes available on the LAN or is removed from the LAN */
 
-    g_message("%s: service '%s' of type '%s' in domain '%s'",
-              event == AVAHI_BROWSER_NEW ? "NEW" : "REMOVED",
-              name,
-              type,
-              domain);
-
+    fprintf(stderr, "%s: service '%s' of type '%s' in domain '%s'\n",
+            event == AVAHI_BROWSER_NEW ? "NEW" : "REMOVED",
+            name,
+            type,
+            domain);
+    
     /* If it's new, let's resolve it */
     if (event == AVAHI_BROWSER_NEW)
         
@@ -70,43 +98,69 @@ static void browse_callback(AvahiServiceBrowser *b, AvahiIfIndex interface, Avah
         we free it. If the server is terminated before the callback
         function is called the server will free the resolver for us. */
 
-        avahi_service_resolver_new(s, interface, protocol, name, type, domain, AVAHI_PROTO_UNSPEC, resolve_callback, s);
+        if (!(avahi_s_service_resolver_new(s, interface, protocol, name, type, domain, AVAHI_PROTO_UNSPEC, resolve_callback, s)))
+            fprintf(stderr, "Failed to resolve service '%s': %s\n", name, avahi_strerror(avahi_server_errno(s)));
 }
 
 int main(int argc, char*argv[]) {
     AvahiServerConfig config;
     AvahiServer *server = NULL;
-    AvahiServiceBrowser *sb;
+    AvahiSServiceBrowser *sb;
+    int error;
+    int ret = 1;
+
+    /* Initialize the psuedo-RNG */
+    srand(time(NULL));
+
+    /* Allocate main loop object */
+    if (!(simple_poll = avahi_simple_poll_new())) {
+        fprintf(stderr, "Failed to create simple poll object.\n");
+        goto fail;
+    }
 
     /* Do not publish any local records */
     avahi_server_config_init(&config);
-    config.publish_hinfo = FALSE;
-    config.publish_addresses = FALSE;
-    config.publish_workstation = FALSE;
-    config.publish_domain = FALSE;
+    config.publish_hinfo = 0;
+    config.publish_addresses = 0;
+    config.publish_workstation = 0;
+    config.publish_domain = 0;
     
     /* Allocate a new server */
-    server = avahi_server_new(NULL, &config, NULL, NULL);
+    server = avahi_server_new(avahi_simple_poll_get(simple_poll), &config, NULL, NULL, &error);
 
     /* Free the configuration data */
     avahi_server_config_free(&config);
 
+    /* Check wether creating the server object succeeded */
+    if (!server) {
+        fprintf(stderr, "Failed to create server: %s\n", avahi_strerror(error));
+        goto fail;
+    }
+    
     /* Create the service browser */
-    sb = avahi_service_browser_new(server, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_http._tcp", NULL, browse_callback, server);
+    if (!(sb = avahi_s_service_browser_new(server, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_http._tcp", NULL, browse_callback, server))) {
+        fprintf(stderr, "Failed to create service browser: %s\n", avahi_strerror(avahi_server_errno(server)));
+        goto fail;
+    }
     
     /* Run the main loop */
-    main_loop = g_main_loop_new(NULL, FALSE);
-    g_main_loop_run(main_loop);
-
+    for (;;)
+        if (avahi_simple_poll_iterate(simple_poll, -1) != 0)
+            break;
+    
+    ret = 0;
+    
+fail:
+    
     /* Cleanup things */
     if (sb)
-        avahi_service_browser_free(sb);
+        avahi_s_service_browser_free(sb);
     
     if (server)
         avahi_server_free(server);
 
-    if (main_loop)
-        g_main_loop_unref(main_loop);
+    if (simple_poll)
+        avahi_simple_poll_free(simple_poll);
 
-    return 0;
+    return ret;
 }