list->servers = newservers;
entry = &newservers[list->nservers];
memset(entry, 0, sizeof(*entry));
+ entry->master = -1;
return entry;
}
/* Add a hostname entry to list. */
static int
add_host_to_list(struct serverlist *list, const char *hostname, int port,
- k5_transport transport, int family, char *uri_path)
+ k5_transport transport, int family, char *uri_path,
+ int master)
{
struct server_entry *entry;
goto oom;
}
entry->port = port;
+ entry->master = master;
list->nservers++;
return 0;
oom:
goto cleanup;
code = add_host_to_list(serverlist, host, port_num, this_transport,
- AF_UNSPEC, uri_path);
+ AF_UNSPEC, uri_path, -1);
if (code)
goto cleanup;
for (entry = head; entry != NULL; entry = entry->next) {
transport = (strcmp(protocol, "_tcp") == 0) ? TCP : UDP;
code = add_host_to_list(serverlist, entry->host, entry->port,
- transport, AF_UNSPEC, NULL);
+ transport, AF_UNSPEC, NULL, -1);
if (code)
goto cleanup;
}
struct serverlist list;
krb5_boolean found;
+ if (server->master != -1)
+ return server->master;
+
if (locate_server(context, realm, &list, locate_service_master_kdc,
server->transport) != 0)
return FALSE;
k5_transport transport; /* May be 0 for UDP/TCP if hostname set */
char *uri_path; /* Used only if transport is HTTPS */
int family; /* May be 0 (aka AF_UNSPEC) if hostname set */
+ int master; /* True, false, or -1 for unknown. */
size_t addrlen;
struct sockaddr_storage addr;
};