fail_over.c revision 63d85fff72563cb913287ab7785c551fa98fc35d
e6d40133bc9f858308654afb1262b8b483ec5922Till Mossakowski Fail over helper functions.
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder Martin Nagy <mnagy@redhat.com>
3f69b6948966979163bdfe8331c38833d5d90ecdChristian Maeder Jakub Hrozek <jhrozek@redhat.com>
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder Copyright (C) Red Hat, Inc 2010
f3a94a197960e548ecd6520bb768cb0d547457bbChristian Maeder This program is free software; you can redistribute it and/or modify
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder it under the terms of the GNU General Public License as published by
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder the Free Software Foundation; either version 3 of the License, or
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder (at your option) any later version.
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder This program is distributed in the hope that it will be useful,
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder but WITHOUT ANY WARRANTY; without even the implied warranty of
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder GNU General Public License for more details.
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder You should have received a copy of the GNU General Public License
ea5ccb1c6e89486a54e1f4bd95840147e96093edChristian Maeder along with this program. If not, see <http://www.gnu.org/licenses/>.
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder#define STATUS_DIFF(p, now) ((now).tv_sec - (p)->last_status_change.tv_sec)
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder#define SERVER_NAME(s) ((s)->common ? (s)->common->name : "(no name)")
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder#define DEFAULT_SERVER_STATUS SERVER_NAME_NOT_RESOLVED
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder#endif /* HOSTNAME_RESOLVE_TIMEOUT */
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder SRV_NEUTRAL, /* We didn't try this SRV lookup yet */
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maeder SRV_RESOLVED, /* This SRV lookup is resolved */
f39b8dd9651dfcc38b06191cda23cacbfc298323Christian Maeder SRV_RESOLVE_ERROR, /* Could not resolve this SRV lookup */
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder SRV_EXPIRED /* Need to refresh the SRV query */
bc263f610d20a9cd3014ddfca903026127fa0d48Christian Maeder struct resolve_service_request *request_list;
b53688bfed888214b485cf76439d57262d80e0a7Christian Maederfo_context_init(TALLOC_CTX *mem_ctx, struct fo_options *opts)
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ctx->opts = talloc_zero(ctx, struct fo_options);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ctx->opts->srv_retry_timeout = opts->srv_retry_timeout;
8d780c893d6df5dab3dcc7d8444b7517f6547f11Christian Maeder ctx->opts->retry_timeout = opts->retry_timeout;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ctx->opts->family_order = opts->family_order;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DEBUG(3, ("Created new fail over context, retry timeout is %d\n",
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maederstatic const char *
bbba6dd86153aacb0f662b182b128df0eb09fd54Christian Maeder return "neutral";
d96bfd1d7a4595bfff87771b91797330fa939455Christian Maeder return "working";
8c8545dd3bf34fbcbc16904b65d249658f8f9efcChristian Maeder return "not working";
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder return "unknown port status";
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maederstatic const char *
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maederstr_srv_data_status(enum srv_lookup_status status)
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder return "neutral";
00df6fd583c19393fa141d5a0e21ac74c7bf5b19Christian Maeder return "resolved";
2360728d4185c0c04279c999941c64d36626af79Christian Maeder return "not resolved";
2360728d4185c0c04279c999941c64d36626af79Christian Maeder return "expired";
2360728d4185c0c04279c999941c64d36626af79Christian Maeder return "unknown SRV lookup status";
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maederstatic const char *
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maederstr_server_status(enum server_status status)
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder return "name not resolved";
bc263f610d20a9cd3014ddfca903026127fa0d48Christian Maeder return "resolving name";
bbba6dd86153aacb0f662b182b128df0eb09fd54Christian Maeder return "name resolved";
d96bfd1d7a4595bfff87771b91797330fa939455Christian Maeder return "working";
d27b1887e61f1dc53d77c37f59dbf5019242a686Christian Maeder return "not working";
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder return "unknown server status";
cb2044812811d66efe038d914966e04290be93faChristian Maeder return s && s->srv_data;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maederget_srv_query(TALLOC_CTX *mem_ctx, struct fo_server *server)
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder query = talloc_asprintf(mem_ctx, "_%s._%s.%s", server->srv_data->srv,
8bb80c9684e905de8dcfcfb1291542677e7d77b6Christian Maedercollapse_srv_lookup(struct fo_server *server)
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder DEBUG(4, ("Need to refresh SRV lookup for domain %s\n", meta->srv_data->dns_domain))
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder while (server->prev && server->prev->srv_data == meta->srv_data) {
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DLIST_REMOVE(server->service->server_list, tmp);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder while (server->next && server->next->srv_data == meta->srv_data) {
bc263f610d20a9cd3014ddfca903026127fa0d48Christian Maeder DLIST_REMOVE(server->service->server_list, tmp);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder if (server == server->service->active_server) {
cb2044812811d66efe038d914966e04290be93faChristian Maeder if (server == server->service->last_tried_server) {
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder /* add back the meta server to denote SRV lookup */
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DLIST_ADD_AFTER(server->service->server_list, meta, server);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DLIST_REMOVE(server->service->server_list, server);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder meta->srv_data->srv_lookup_status = SRV_NEUTRAL;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder meta->srv_data->last_status_change.tv_sec = 0;
12aef5992d3af07dee81a4e02cf4be65a83f28bcChristian Maeder timeout = data->meta->service->ctx->opts->srv_retry_timeout;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder if (timeout && STATUS_DIFF(data, tv) > timeout) {
00df6fd583c19393fa141d5a0e21ac74c7bf5b19Christian Maeder DEBUG(1, ("Unknown state for SRV server!\n"));
d27b1887e61f1dc53d77c37f59dbf5019242a686Christian Maederset_srv_data_status(struct srv_data *data, enum srv_lookup_status status)
33fcc19ef2b59493b4e91eebf701df95fd230765Christian Maeder DEBUG(4, ("Marking SRV lookup of service '%s' as '%s'\n",
2360728d4185c0c04279c999941c64d36626af79Christian Maeder data->meta->service->name, str_srv_data_status(status)));
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder gettimeofday(&data->last_status_change, NULL);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder * This function will return the status of the server. If the status was
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder * last updated a long time ago, we will first reset the status.
2360728d4185c0c04279c999941c64d36626af79Christian Maeder DEBUG(7, ("Status of server '%s' is '%s'\n", SERVER_NAME(server),
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder str_server_status(server->common->server_status)));
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder timeout = server->service->ctx->opts->retry_timeout;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder if (timeout != 0 && server->common->server_status == SERVER_NOT_WORKING) {
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder if (STATUS_DIFF(server->common, tv) > timeout) {
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DEBUG(4, ("Reseting the server status of '%s'\n",
76d027be764e2ff61bef959efb3ac8f56499e646Christian Maeder server->common->server_status = SERVER_NAME_NOT_RESOLVED;
9f85afecbd79b3df5a0bb17bd28cd0b288dc3213Kristina Sojakova server->common->last_status_change.tv_sec = tv.tv_sec;
63da71bfb4226f504944b293fb77177ebcaea7d4Ewaryst Schulz if (STATUS_DIFF(server->common, tv) > HOSTNAME_RESOLVE_TIMEOUT) {
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DEBUG(4, ("Hostname resolution expired, reseting the server "
af6e92e4a9ca308f928f9909acee115f801c5db5Ewaryst Schulz fo_set_server_status(server, SERVER_NAME_NOT_RESOLVED);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder * This function will return the status of the service. If the status was
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder * last updated a long time ago, we will first reset the status.
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DEBUG(7, ("Port status of port %d for server '%s' is '%s'\n", server->port,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder SERVER_NAME(server), str_port_status(server->port_status)));
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder timeout = server->service->ctx->opts->retry_timeout;
af6e92e4a9ca308f928f9909acee115f801c5db5Ewaryst Schulz if (timeout != 0 && server->port_status == PORT_NOT_WORKING) {
26b1c101b72100b69045effdfaab3889de6c8c93Christian Maeder DEBUG(4, ("Reseting the status of port %d for server '%s'\n",
2353f65833a3da763392f771223250cd50b8d873Christian Maeder server->last_status_change.tv_sec = tv.tv_sec;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder if (get_server_status(server) == SERVER_NOT_WORKING)
818b228955ef40dd5a253bd942dd6ab8779ed713Christian Maeder if (get_port_status(server) == PORT_NOT_WORKING)
2360728d4185c0c04279c999941c64d36626af79Christian Maederservice_destructor(struct fo_service *service)
8a5c05062ef501bf725a86a370a5145a198e81fdKlaus Luettich DLIST_REMOVE(service->ctx->service_list, service);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maederfo_new_service(struct fo_ctx *ctx, const char *name,
bc263f610d20a9cd3014ddfca903026127fa0d48Christian Maeder DEBUG(3, ("Creating new service '%s'\n", name));
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DEBUG(5, ("Service '%s' already exists\n", name));
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder service = talloc_zero(ctx, struct fo_service);
df86c42574168135e8e2af9cf468fae774874cd0Christian Maeder service->name = talloc_strdup(service, name);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder talloc_set_destructor(service, service_destructor);
7968d3a131e5a684ec1ff0c6d88aae638549153dChristian Maederfo_get_service(struct fo_ctx *ctx, const char *name,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maederget_server_common(TALLOC_CTX *mem_ctx, struct fo_ctx *ctx, const char *name,
511284753313165e629cedf508752d6818ccc4d2Christian Maeder DLIST_FOR_EACH(common, ctx->server_common_list) {
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder *_common = rc_reference(mem_ctx, struct server_common, common);
b53688bfed888214b485cf76439d57262d80e0a7Christian Maederstatic int server_common_destructor(void *memptr)
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder common = talloc_get_type(memptr, struct server_common);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DEBUG(1, ("BUG: pending requests still associated with this server\n"));
8865728716566f42fa73e7e0bc080ba3225df764Christian Maeder DLIST_REMOVE(common->ctx->server_common_list, common);
f03420e44d8204b2945edaab5c70a84e7c381892Christian Maedercreate_server_common(TALLOC_CTX *mem_ctx, struct fo_ctx *ctx, const char *name)
8bb80c9684e905de8dcfcfb1291542677e7d77b6Christian Maeder common = rc_alloc(mem_ctx, struct server_common);
91ba5d95b2472cb075646b6120a559dc6581a867Christian Maeder common->name = talloc_strdup(common, name);
be43c3fa0292555bd126784ae27ff5c1d23438cbChristian Maeder common->server_status = DEFAULT_SERVER_STATUS;
be43c3fa0292555bd126784ae27ff5c1d23438cbChristian Maeder talloc_set_destructor((TALLOC_CTX *) common, server_common_destructor);
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder DLIST_ADD_END(ctx->server_common_list, common, struct server_common *);
f03420e44d8204b2945edaab5c70a84e7c381892Christian Maederfo_add_srv_server(struct fo_service *service, const char *srv,
be43c3fa0292555bd126784ae27ff5c1d23438cbChristian Maeder const char *discovery_domain, const char *sssd_domain,
d27b1887e61f1dc53d77c37f59dbf5019242a686Christian Maeder DEBUG(3, ("Adding new SRV server in domain '%s', to service '%s' using %s\n",
d27b1887e61f1dc53d77c37f59dbf5019242a686Christian Maeder discovery_domain ? discovery_domain : "unknown",
f03420e44d8204b2945edaab5c70a84e7c381892Christian Maeder DLIST_FOR_EACH(server, service->server_list) {
be43c3fa0292555bd126784ae27ff5c1d23438cbChristian Maeder strcasecmp(server->srv_data->dns_domain, discovery_domain) == 0)) &&
bbba6dd86153aacb0f662b182b128df0eb09fd54Christian Maeder strcasecmp(server->srv_data->proto, proto) == 0) {
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder server = talloc_zero(service, struct fo_server);
beff4152e9f0fe90885458d1a1733b183a2a8816Christian Maeder /* add the SRV-specific data */
beff4152e9f0fe90885458d1a1733b183a2a8816Christian Maeder server->srv_data = talloc_zero(service, struct srv_data);
8d780c893d6df5dab3dcc7d8444b7517f6547f11Christian Maeder server->srv_data->proto = talloc_strdup(server->srv_data, proto);
be43c3fa0292555bd126784ae27ff5c1d23438cbChristian Maeder server->srv_data->srv = talloc_strdup(server->srv_data, srv);
00df6fd583c19393fa141d5a0e21ac74c7bf5b19Christian Maeder server->srv_data->discovery_domain = talloc_strdup(server->srv_data,
00df6fd583c19393fa141d5a0e21ac74c7bf5b19Christian Maeder if (server->srv_data->discovery_domain == NULL)
2353f65833a3da763392f771223250cd50b8d873Christian Maeder talloc_strdup(server->srv_data, sssd_domain);
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder server->srv_data->srv_lookup_status = DEFAULT_SRV_STATUS;
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maeder server->srv_data->last_status_change.tv_sec = 0;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DLIST_ADD_END(service->server_list, server, struct fo_server *);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maedercreate_fo_server(struct fo_service *service, const char *name,
fefee7e1dee1ee5f0768a03a4abae88d1ca2c3fdRazvan Pascanu server = talloc_zero(service, struct fo_server);
fefee7e1dee1ee5f0768a03a4abae88d1ca2c3fdRazvan Pascanu ret = get_server_common(server, service->ctx, name, &server->common);
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maeder server->common = create_server_common(server, service->ctx, name);
beff4152e9f0fe90885458d1a1733b183a2a8816Christian Maederfo_get_server_count(struct fo_service *service)
7245138e91992b96b153b8ac527e263d9dc8ff5bChristian Maeder DLIST_FOR_EACH(server, service->server_list) {
a461314c811f4187dff85c8be079a41b2f13f176Christian Maederfo_add_server(struct fo_service *service, const char *name, int port,
a461314c811f4187dff85c8be079a41b2f13f176Christian Maeder DEBUG(3, ("Adding new server '%s', to service '%s'\n",
b6ff72be73dad3d1394cf2c71e29e67624ff030bChristian Maeder name ? name : "(no name)", service->name));
b6ff72be73dad3d1394cf2c71e29e67624ff030bChristian Maeder DLIST_FOR_EACH(server, service->server_list) {
3bcd9d942601d59dd55a6069d8b2d1c33d7ced0eChristian Maeder if (server->port != port || server->user_data != user_data)
beff4152e9f0fe90885458d1a1733b183a2a8816Christian Maeder if (name == NULL && server->common == NULL) {
b6ff72be73dad3d1394cf2c71e29e67624ff030bChristian Maeder } else if (name != NULL && server->common != NULL) {
a461314c811f4187dff85c8be079a41b2f13f176Christian Maeder if (!strcasecmp(name, server->common->name))
3bcd9d942601d59dd55a6069d8b2d1c33d7ced0eChristian Maeder server = create_fo_server(service, name, port, user_data);
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder DLIST_ADD_END(service->server_list, server, struct fo_server *);
daec53c285f692c56db0cefe16061b46ba602cf0Christian Maederget_first_server_entity(struct fo_service *service, struct fo_server **_server)
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder /* If we already have a working server, use that one. */
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder * Otherwise iterate through the server list.
b6ff72be73dad3d1394cf2c71e29e67624ff030bChristian Maeder /* First, try servers after the last one we tried. */
3bcd9d942601d59dd55a6069d8b2d1c33d7ced0eChristian Maeder DLIST_FOR_EACH(server, service->last_tried_server->next) {
0a64bfd28dff15bc93e1f7a86e0a8052e879636dChristian Maeder /* If none were found, try at the start. */
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder DLIST_FOR_EACH(server, service->server_list) {
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder if (server == service->last_tried_server) {
2353f65833a3da763392f771223250cd50b8d873Christian Maederresolve_service_request_destructor(struct resolve_service_request *request)
00df6fd583c19393fa141d5a0e21ac74c7bf5b19Christian Maeder DLIST_REMOVE(request->server_common->request_list, request);
be43c3fa0292555bd126784ae27ff5c1d23438cbChristian Maederset_lookup_hook(struct fo_server *server, struct tevent_req *req)
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder request = talloc(req, struct resolve_service_request);
be43c3fa0292555bd126784ae27ff5c1d23438cbChristian Maeder request->server_common = rc_reference(request, struct server_common,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder DLIST_ADD(server->common->request_list, request);
2353f65833a3da763392f771223250cd50b8d873Christian Maeder talloc_set_destructor(request, resolve_service_request_destructor);
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder/*******************************************************************
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder * Get server to connect to. *
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder *******************************************************************/
964ee9fff06b8c821e1d00207f6f185301371be8Christian Maederstatic void fo_resolve_service_cont(struct tevent_req *subreq);
d27b1887e61f1dc53d77c37f59dbf5019242a686Christian Maederstatic void fo_resolve_service_done(struct tevent_req *subreq);
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maederstatic bool fo_resolve_service_server(struct tevent_req *req);
964ee9fff06b8c821e1d00207f6f185301371be8Christian Maeder/* Forward declarations for SRV resolving */
b53688bfed888214b485cf76439d57262d80e0a7Christian Maederresolve_srv_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder struct resolv_ctx *resolv, struct fo_ctx *ctx,
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maederresolve_srv_recv(struct tevent_req *req, struct fo_server **server);
c5a4c5f506ea34fa527065b4187127a18c6e2418Christian Maederfo_resolve_service_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder struct resolv_ctx *resolv, struct fo_ctx *ctx,
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maeder DEBUG(4, ("Trying to resolve service '%s'\n", service->name));
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maeder req = tevent_req_create(mem_ctx, &state, struct resolve_service_state);
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maeder ret = get_first_server_entity(service, &server);
12aef5992d3af07dee81a4e02cf4be65a83f28bcChristian Maeder DEBUG(1, ("No available servers for service '%s'\n", service->name));
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder /* Don't know the server yet, must do a SRV lookup */
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder subreq = resolve_srv_send(state, ev, resolv,
9d6562465b41f17c7967d4e5678f34811d958cb2Christian Maeder /* This is a regular server, just do hostname lookup */
cb2044812811d66efe038d914966e04290be93faChristian Maederstatic void set_server_common_status(struct server_common *common,
c5a4c5f506ea34fa527065b4187127a18c6e2418Christian Maeder/* SRV resolving finished, see if we got server to work with */
cb2044812811d66efe038d914966e04290be93faChristian Maederfo_resolve_service_cont(struct tevent_req *subreq)
be43c3fa0292555bd126784ae27ff5c1d23438cbChristian Maeder struct tevent_req *req = tevent_req_callback_data(subreq,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder struct resolve_service_state *state = tevent_req_data(req,
be43c3fa0292555bd126784ae27ff5c1d23438cbChristian Maeder ret = resolve_srv_recv(subreq, &state->server);
cb2044812811d66efe038d914966e04290be93faChristian Maederfo_resolve_service_server(struct tevent_req *req)
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maeder struct resolve_service_state *state = tevent_req_data(req,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder switch (get_server_status(state->server)) {
8c8545dd3bf34fbcbc16904b65d249658f8f9efcChristian Maeder case SERVER_NAME_NOT_RESOLVED: /* Request name resolution. */
8c8545dd3bf34fbcbc16904b65d249658f8f9efcChristian Maeder subreq = resolv_gethostbyname_send(state->server->common,
b6ff72be73dad3d1394cf2c71e29e67624ff030bChristian Maeder tevent_req_set_callback(subreq, fo_resolve_service_done, req);
b6ff72be73dad3d1394cf2c71e29e67624ff030bChristian Maeder fo_set_server_status(state->server, SERVER_RESOLVING_NAME);
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder /* FALLTHROUGH */
c5a4c5f506ea34fa527065b4187127a18c6e2418Christian Maeder /* Name resolution is already under way. Just add ourselves into the
b6ff72be73dad3d1394cf2c71e29e67624ff030bChristian Maeder * waiting queue so we get notified after the operation is finished. */
b6ff72be73dad3d1394cf2c71e29e67624ff030bChristian Maeder default: /* The name is already resolved. Return immediately. */
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder return false;
b53688bfed888214b485cf76439d57262d80e0a7Christian Maederfo_resolve_service_done(struct tevent_req *subreq)
b6ff72be73dad3d1394cf2c71e29e67624ff030bChristian Maeder struct tevent_req *req = tevent_req_callback_data(subreq,
be43c3fa0292555bd126784ae27ff5c1d23438cbChristian Maeder struct resolve_service_state *state = tevent_req_data(req,
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maeder if (state->server->common->hostent != NULL) {
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder talloc_zfree(state->server->common->hostent);
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder ret = resolv_gethostbyname_recv(subreq, state->server->common,
5941ba0b9a99ac98f78a89a9f3303102657e36ccChristian Maeder DEBUG(1, ("Failed to resolve server '%s': %s\n",
5941ba0b9a99ac98f78a89a9f3303102657e36ccChristian Maeder set_server_common_status(state->server->common, SERVER_NOT_WORKING);
if (resolv_status) {
if (server)
return EOK;
char **dns_domain);
struct resolve_srv_state {
static struct tevent_req *
int ret;
int status;
return NULL;
switch(status) {
goto done;
goto done;
return req;
goto done;
done:
return req;
struct tevent_req);
struct resolve_srv_state);
int ret;
if (ret) {
struct resolve_srv_state);
char *query;
if (!query) {
struct tevent_req);
struct resolve_srv_state);
int ret;
int resolv_status;
goto fail;
goto fail;
if (!server) {
goto fail;
if (srv_list) {
goto fail;
fail:
struct resolve_srv_state);
if (server) {
return EOK;
struct resolve_get_domain_state {
char *fqdn;
struct tevent_req *
int ret;
if (!req) {
return NULL;
if (ret) {
return NULL;
if (!subreq) {
return NULL;
return req;
struct tevent_req);
struct resolve_get_domain_state);
int ret;
if (ret) {
char **dns_domain)
struct resolve_get_domain_state);
char *fqdn;
char *domptr;
domptr++;
return ENOMEM;
return EOK;
if (!service) {
if (!server) {
struct hostent *
return NULL;