static int manager_resolve_handler(sd_resolve_query *q, int ret, const struct addrinfo *ai, void *userdata) { Manager *m = userdata; int r; assert(q); assert(m); assert(m->current_server_name); m->resolve_query = sd_resolve_query_unref(m->resolve_query); if (ret != 0) { log_debug("Failed to resolve %s: %s", m->current_server_name->string, gai_strerror(ret)); /* Try next host */ return manager_connect(m); } for (; ai; ai = ai->ai_next) { _cleanup_free_ char *pretty = NULL; ServerAddress *a; assert(ai->ai_addr); assert(ai->ai_addrlen >= offsetof(struct sockaddr, sa_data)); 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; } r = server_address_new(m->current_server_name, &a, (const union sockaddr_union*) ai->ai_addr, ai->ai_addrlen); if (r < 0) { log_error("Failed to add server address: %s", strerror(-r)); return r; } server_address_pretty(a, &pretty); log_debug("Resolved 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); } manager_set_server_address(m, m->current_server_name->addresses); return manager_begin(m); }
/// Initializes the module bool server_init(void) { ga_init(&watchers, sizeof(SocketWatcher *), 1); bool must_free = false; const char *listen_address = os_getenv(LISTEN_ADDRESS_ENV_VAR); if (listen_address == NULL) { must_free = true; listen_address = server_address_new(); } bool ok = (server_start(listen_address) == 0); if (must_free) { xfree((char *) listen_address); } return ok; }