#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;
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 */
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;
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. */
- if (group)
- avahi_entry_group_reset(group);
- break;
- case AVAHI_CLIENT_FAILURE:
+ 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. */
- fprintf(stderr, "Client failure: %s\n", avahi_strerror(avahi_client_errno(c)));
- avahi_simple_poll_quit(simple_poll);
+ if (group)
+ avahi_entry_group_reset(group);
break;
case AVAHI_CLIENT_CONNECTING:
- case AVAHI_CLIENT_S_REGISTERING:
;
}
}
+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())) {
goto fail;
}
+ /* After 20s 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);