]> git.meshlink.io Git - catta/blobdiff - examples/client-publish-service.c
Make herzi sleep beter. (Closes #143)
[catta] / examples / client-publish-service.c
index 7013156fd5cbdc3e25a781de18b281a796feb880..db079c12130f438ae893bd99e6772e0e6e509210 100644 (file)
@@ -35,6 +35,7 @@
 #include <avahi-common/simple-watch.h>
 #include <avahi-common/malloc.h>
 #include <avahi-common/error.h>
+#include <avahi-common/timeval.h>
 
 static AvahiEntryGroup *group = NULL;
 static AvahiSimplePoll *simple_poll = NULL;
@@ -43,7 +44,7 @@ static char *name = NULL;
 static void create_services(AvahiClient *c);
 
 static void entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupState state, AVAHI_GCC_UNUSED void *userdata) {
-    assert(g == group);
+    assert(g == group || group == NULL);
 
     /* Called whenever the entry group state changes */
 
@@ -70,6 +71,8 @@ static void entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupState state,
 
         case AVAHI_ENTRY_GROUP_FAILURE :
 
+            fprintf(stderr, "Entry group failure: %s\n", avahi_strerror(avahi_client_errno(avahi_entry_group_get_client(g))));
+
             /* Some kind of failure happened while we were registering our services */
             avahi_simple_poll_quit(simple_poll);
             break;
@@ -141,31 +144,62 @@ static void client_callback(AvahiClient *c, AvahiClientState state, AVAHI_GCC_UN
                 create_services(c);
             break;
 
+        case AVAHI_CLIENT_FAILURE:
+            
+            fprintf(stderr, "Client failure: %s\n", avahi_strerror(avahi_client_errno(c)));
+            avahi_simple_poll_quit(simple_poll);
+            
+            break;
+
         case AVAHI_CLIENT_S_COLLISION:
         
             /* Let's drop our registered services. When the server is back
              * in AVAHI_SERVER_RUNNING state we will register them
              * again with the new host name. */
+            
+        case AVAHI_CLIENT_S_REGISTERING:
+
+            /* The server records are now being established. This
+             * might be caused by a host name change. We need to wait
+             * for our own records to register until the host name is
+             * properly esatblished. */
+            
             if (group)
                 avahi_entry_group_reset(group);
-            break;
             
-        case AVAHI_CLIENT_DISCONNECTED:
-
-            fprintf(stderr, "Server connection terminated.\n");
-            avahi_simple_poll_quit(simple_poll);
-
             break;
 
-        case AVAHI_CLIENT_S_REGISTERING:
+        case AVAHI_CLIENT_CONNECTING:
             ;
     }
 }
 
+static void modify_callback(AVAHI_GCC_UNUSED AvahiTimeout *e, void *userdata) {
+    AvahiClient *client = userdata;
+
+    fprintf(stderr, "Doing some weird modification\n");
+
+    avahi_free(name); 
+    name = avahi_strdup("Modified MegaPrinter"); 
+
+    /* If the server is currently running, we need to remove our
+     * service and create it anew */
+    if (avahi_client_get_state(client) == AVAHI_CLIENT_S_RUNNING) {
+
+        /* Remove the old services */
+        if (group)
+            avahi_entry_group_reset(group);
+
+        /* And create them again with the new name */
+        create_services(client);
+    }
+}
+
 int main(AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char*argv[]) {
     AvahiClient *client = NULL;
     int error;
     int ret = 1;
+    struct timeval tv;
     
     /* Allocate main loop object */
     if (!(simple_poll = avahi_simple_poll_new())) {
@@ -176,7 +210,7 @@ int main(AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char*argv[]) {
     name = avahi_strdup("MegaPrinter");
 
     /* Allocate a new client */
-    client = avahi_client_new(avahi_simple_poll_get(simple_poll), client_callback, NULL, &error);
+    client = avahi_client_new(avahi_simple_poll_get(simple_poll), 0, client_callback, NULL, &error);
 
     /* Check wether creating the client object succeeded */
     if (!client) {
@@ -184,6 +218,13 @@ int main(AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char*argv[]) {
         goto fail;
     }
 
+    /* After 10s do some weird modification to the service */
+    avahi_simple_poll_get(simple_poll)->timeout_new(
+        avahi_simple_poll_get(simple_poll),
+        avahi_elapse_time(&tv, 1000*10, 0),
+        modify_callback,
+        client);
+    
     /* Run the main loop */
     avahi_simple_poll_loop(simple_poll);