static krb5_error_code dns_locate_server(krb5_context context, const krb5_data *realm, struct serverlist *serverlist, enum locate_service_type svc, int socktype) { const char *dnsname; int use_dns = _krb5_use_dns_kdc(context); krb5_error_code code; if (!use_dns) return 0; switch (svc) { case locate_service_kdc: dnsname = "_kerberos"; break; case locate_service_master_kdc: dnsname = "_kerberos-master"; break; case locate_service_kadmin: dnsname = "_kerberos-adm"; break; case locate_service_krb524: dnsname = "_krb524"; break; case locate_service_kpasswd: dnsname = "_kpasswd"; break; default: return 0; } code = 0; if (socktype == SOCK_DGRAM || socktype == 0) { code = locate_srv_dns_1(realm, dnsname, "_udp", serverlist); if (code) Tprintf("dns udp lookup returned error %d\n", code); } if ((socktype == SOCK_STREAM || socktype == 0) && code == 0) { code = locate_srv_dns_1(realm, dnsname, "_tcp", serverlist); if (code) Tprintf("dns tcp lookup returned error %d\n", code); } return code; }
static krb5_error_code dns_locate_server_srv(krb5_context context, const krb5_data *realm, struct serverlist *serverlist, enum locate_service_type svc, k5_transport transport) { const char *dnsname; int use_dns = _krb5_use_dns_kdc(context); krb5_error_code code; if (!use_dns) return 0; switch (svc) { case locate_service_kdc: dnsname = "_kerberos"; break; case locate_service_master_kdc: dnsname = "_kerberos-master"; break; case locate_service_kadmin: dnsname = "_kerberos-adm"; break; case locate_service_krb524: dnsname = "_krb524"; break; case locate_service_kpasswd: dnsname = "_kpasswd"; break; default: return 0; } code = 0; if (transport == UDP || transport == TCP_OR_UDP) code = locate_srv_dns_1(context, realm, dnsname, "_udp", serverlist); if ((transport == TCP || transport == TCP_OR_UDP) && code == 0) code = locate_srv_dns_1(context, realm, dnsname, "_tcp", serverlist); if (serverlist->nservers == 0) TRACE_DNS_SRV_NOTFOUND(context); return code; }
static krb5_error_code dns_locate_server_uri(krb5_context context, const krb5_data *realm, struct serverlist *serverlist, enum locate_service_type svc, k5_transport transport) { krb5_error_code ret; char *svcname; int def_port; krb5_boolean find_master = FALSE; if (!_krb5_use_dns_kdc(context) || !use_dns_uri(context)) return 0; switch (svc) { case locate_service_master_kdc: find_master = TRUE; /* Fall through */ case locate_service_kdc: svcname = "_kerberos"; def_port = 88; break; case locate_service_kadmin: svcname = "_kerberos-adm"; def_port = 749; break; case locate_service_kpasswd: svcname = "_kpasswd"; def_port = 464; break; default: return 0; } ret = locate_uri(context, realm, svcname, serverlist, transport, def_port, find_master); if (serverlist->nservers == 0) TRACE_DNS_URI_NOTFOUND(context); return ret; }
/* * Solaris Kerberos: for backward compat. Avoid using this * function! */ krb5_error_code krb5_get_servername(krb5_context context, const krb5_data *realm, const char *name, const char *proto, char *srvhost, unsigned short *port) { krb5_error_code code = KRB5_REALM_UNKNOWN; #ifdef KRB5_DNS_LOOKUP { int use_dns = _krb5_use_dns_kdc(context); if (use_dns) { struct srv_dns_entry *head = NULL; code = krb5int_make_srv_query_realm(realm, name, proto, &head); if (code) return (code); if (head == NULL) return KRB5_REALM_CANT_RESOLVE; *port = head->port; (void) strlcpy(srvhost, head->host, MAX_DNS_NAMELEN); #ifdef DEBUG fprintf (stderr, "krb5_get_servername svrhost %s, port %d\n", srvhost, *port); #endif krb5int_free_srv_dns_data(head); } } #endif /* KRB5_DNS_LOOKUP */ return (code); }
static krb5_error_code dns_locate_server (krb5_context context, const krb5_data *realm, struct srv_dns_entry **dns_list_head, enum locate_service_type svc, int socktype, int family) { const char *dnsname; int use_dns = _krb5_use_dns_kdc(context); krb5_error_code code; struct srv_dns_entry *head = NULL; *dns_list_head = NULL; /* default: indicate we have found no KDCs */ if (!use_dns) return KRB5_PLUGIN_NO_HANDLE; switch (svc) { case locate_service_kdc: dnsname = "_kerberos"; break; case locate_service_master_kdc: dnsname = "_kerberos-master"; break; case locate_service_kadmin: dnsname = "_kerberos-adm"; break; case locate_service_krb524: dnsname = "_krb524"; break; case locate_service_kpasswd: dnsname = "_kpasswd"; break; default: return KRB5_PLUGIN_NO_HANDLE; } code = 0; if (socktype == SOCK_DGRAM || socktype == 0) { code = krb5int_make_srv_query_realm(realm, dnsname, "_udp", &head); if (code) Tprintf("dns udp lookup returned error %d\n", code); } if ((socktype == SOCK_STREAM || socktype == 0) && code == 0) { code = krb5int_make_srv_query_realm(realm, dnsname, "_tcp", &head); if (code) Tprintf("dns tcp lookup returned error %d\n", code); } if (head == NULL) return 0; /* Check for the "." case indicating no support. */ if (head->next == 0 && head->host[0] == 0) { free(head->host); free(head); return KRB5_ERR_NO_SERVICE; } /* * Okay! Now we've got a linked list of entries sorted by * priority. Return it so later we can map hostnames to net addresses. */ *dns_list_head = head; return 0; }