+ int r;
+
+ assert(m);
+
+ manager_disconnect(m);
+
+ m->event_retry = sd_event_source_unref(m->event_retry);
+ if (!ratelimit_test(&m->ratelimit)) {
+ log_debug("Slowing down attempts to contact servers.");
+
+ r = sd_event_add_time(m->event, &m->event_retry, CLOCK_MONOTONIC, now(CLOCK_MONOTONIC) + RETRY_USEC, 0, manager_retry, m);
+ if (r < 0) {
+ log_error("Failed to create retry timer: %s", strerror(-r));
+ return r;
+ }
+
+ return 0;
+ }
+
+ /* If we already are operating on some address, switch to the
+ * next one. */
+ if (m->current_server_address && m->current_server_address->addresses_next)
+ m->current_server_address = m->current_server_address->addresses_next;
+ else {
+ /* Hmm, we are through all addresses, let's look for the next host instead */
+ m->current_server_address = NULL;
+
+ if (m->current_server_name && m->current_server_name->names_next)
+ m->current_server_name = m->current_server_name->names_next;
+ else {
+ if (!m->servers) {
+ m->current_server_name = NULL;
+ log_debug("No server found.");
+ return 0;
+ }
+
+ m->current_server_name = m->servers;
+ }
+
+ /* Tell the resolver to reread /etc/resolv.conf, in
+ * case it changed. */
+ res_init();
+
+ r = sd_resolve_getaddrinfo(m->resolve, &m->resolve_query, m->current_server_name->string, "123", &hints, manager_resolve_handler, m);
+ if (r < 0) {
+ log_error("Failed to create resolver: %s", strerror(-r));
+ return r;
+ }
+
+ return 1;
+ }
+
+ r = manager_begin(m);
+ if (r < 0)
+ return r;
+
+ return 1;
+}
+
+static int manager_add_server(Manager *m, const char *server) {
+ ServerName *n, *tail;