- if (ret != 0) {
- log_error("Failed to resolve %s: %s", m->current_server_name->string, gai_strerror(ret));
-
- /* Try next host */
- return manager_connect(m);
- }
-
- server_name_flush_addresses(m->current_server_name);
-
- for (; ai; ai = ai->ai_next) {
- _cleanup_free_ char *pretty = NULL;
-
- assert(ai->ai_addr);
- assert(ai->ai_addrlen >= offsetof(struct sockaddr, sa_data));
- assert(ai->ai_addrlen <= sizeof(union sockaddr_union));
-
- if (!IN_SET(ai->ai_addr->sa_family, AF_INET, AF_INET6)) {
- log_warning("Unsuitable address protocol for %s", m->current_server_name->string);
- continue;
- }
-
- a = new0(ServerAddress, 1);
- if (!a)
- return log_oom();
-
- memcpy(&a->sockaddr, ai->ai_addr, ai->ai_addrlen);
- a->socklen = ai->ai_addrlen;
-
- LIST_INSERT_AFTER(addresses, m->current_server_name->addresses, last, a);
- last = a;
-
- sockaddr_pretty(&a->sockaddr.sa, a->socklen, true, &pretty);
- log_debug("Found address %s for %s.", pretty, m->current_server_name->string);
- }
-
- if (!m->current_server_name->addresses) {
- log_error("Failed to find suitable address for host %s.", m->current_server_name->string);
-
- /* Try next host */
- return manager_connect(m);
- }
-
- m->current_server_address = m->current_server_name->addresses;
-
- return manager_begin(m);
-}
-
-static int manager_connect(Manager *m) {
-
- struct addrinfo hints = {
- .ai_flags = AI_NUMERICSERV|AI_ADDRCONFIG,
- .ai_socktype = SOCK_DGRAM,
- };
- int r;
-
- assert(m);
-
- manager_disconnect(m);
-
- /* 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;
- }
-
- 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;
-
- assert(m);
- assert(server);
-
- n = new0(ServerName, 1);
- if (!n)
- return -ENOMEM;
-
- n->string = strdup(server);
- if (!n->string) {
- free(n);
- return -ENOMEM;
- }
-
- LIST_PREPEND(names, m->servers, n);
- return 0;
-}
-
-static void manager_disconnect(Manager *m) {
- assert(m);
-
- m->resolve_query = sd_resolve_query_unref(m->resolve_query);
-
- m->event_timer = sd_event_source_unref(m->event_timer);
-
- m->event_receive = sd_event_source_unref(m->event_receive);
- m->server_socket = safe_close(m->server_socket);
-
- m->event_clock_watch = sd_event_source_unref(m->event_clock_watch);
- m->clock_watch_fd = safe_close(m->clock_watch_fd);
-}
-
-static int manager_new(Manager **ret) {
- _cleanup_manager_free_ Manager *m = NULL;
- int r;
-
- m = new0(Manager, 1);
- if (!m)
- return -ENOMEM;
-
- m->server_socket = m->clock_watch_fd = -1;
-
- r = sd_event_default(&m->event);
- if (r < 0)
- return r;
-
- sd_event_add_signal(m->event, &m->sigterm, SIGTERM, NULL, NULL);
- sd_event_add_signal(m->event, &m->sigint, SIGINT, NULL, NULL);
-
- r = sd_resolve_default(&m->resolve);
- if (r < 0)
- return r;
-
- r = sd_resolve_attach_event(m->resolve, m->event, 0);
- if (r < 0)
- return 0;
-
- r = manager_clock_watch_setup(m);
- if (r < 0)
- return r;
-
- *ret = m;
- m = NULL;
-
- return 0;
-}
-
-static void manager_free(Manager *m) {
- if (!m)
- return;
-
- manager_disconnect(m);
- manager_flush_names(m);
-
- sd_event_source_unref(m->sigint);
- sd_event_source_unref(m->sigterm);
-
- sd_resolve_unref(m->resolve);
- sd_event_unref(m->event);
-
- free(m);
-}
-
-int main(int argc, char *argv[]) {
- _cleanup_manager_free_ Manager *m = NULL;
- int r;
-
- log_set_target(LOG_TARGET_AUTO);
- log_parse_environment();
- log_open();
-
- assert_se(sigprocmask_many(SIG_BLOCK, SIGTERM, SIGINT, -1) == 0);
-
- r = manager_new(&m);
- if (r < 0) {
- log_error("Failed to allocate manager: %s", strerror(-r));
- goto out;
- }
-
- sd_notify(false, "READY=1");
-
- r = manager_add_server(m, "time1.google.com");
- if (r < 0) {
- log_error("Failed to add server: %s", strerror(-r));
- goto out;