Lines Matching +full:host +full:- +full:port
2 * Copyright (c) 2001 - 2003 Kungliga Tekniska Högskolan
47 return -1; in string_to_proto()
53 * if `port' != 0, force that port number
59 const char *proto, const char *service, int port) in srv_find_realm() argument
81 else if(port == 0) in srv_find_realm()
84 def_port = port; in srv_find_realm()
95 for(num_srv = 0, rr = r->head; rr; rr = rr->next) in srv_find_realm()
96 if(rr->type == rk_ns_t_srv) in srv_find_realm()
115 for(num_srv = 0, rr = r->head; rr; rr = rr->next) in srv_find_realm()
116 if(rr->type == rk_ns_t_srv) { in srv_find_realm()
118 size_t len = strlen(rr->u.srv->target); in srv_find_realm()
123 while(--num_srv >= 0) in srv_find_realm()
131 hi->proto = proto_num; in srv_find_realm()
133 hi->def_port = def_port; in srv_find_realm()
134 if (port != 0) in srv_find_realm()
135 hi->port = port; in srv_find_realm()
137 hi->port = rr->u.srv->port; in srv_find_realm()
139 strlcpy(hi->hostname, rr->u.srv->target, len + 1); in srv_find_realm()
153 int port; /* hardwired port number if != 0 */ member
173 return kd->index == &kd->hosts; in krbhst_empty()
183 if (kd->flags & KD_LARGE_MSG) in krbhst_get_default_proto()
195 return handle->realm; in _krb5_krbhst_get_realm()
199 * parse `spec' into a krb5_krbhst_info, defaulting the port to `def_port'
200 * and forcing it to `port' if port != 0
205 const char *spec, int def_port, int port) in parse_hostspec() argument
214 hi->proto = krbhst_get_default_proto(kd); in parse_hostspec()
217 hi->proto = KRB5_KRBHST_HTTP; in parse_hostspec()
220 hi->proto = KRB5_KRBHST_HTTP; in parse_hostspec()
224 hi->proto = KRB5_KRBHST_TCP; in parse_hostspec()
233 memcpy(hi->hostname, &p[1], q - p - 1); in parse_hostspec()
234 hi->hostname[q - p - 1] = '\0'; in parse_hostspec()
239 } else if(strsep_copy(&p, ":", hi->hostname, strlen(spec) + 1) < 0) { in parse_hostspec()
245 hi->hostname[strcspn(hi->hostname, "/")] = '\0'; in parse_hostspec()
246 strlwr(hi->hostname); in parse_hostspec()
248 hi->port = hi->def_port = def_port; in parse_hostspec()
251 hi->port = strtol(p, &end, 0); in parse_hostspec()
257 if (port) in parse_hostspec()
258 hi->port = port; in parse_hostspec()
265 if (hi->ai != NULL) in _krb5_free_krbhst_info()
266 freeaddrinfo(hi->ai); in _krb5_free_krbhst_info()
275 size_t hostnamelen = strlen(from->hostname); in _krb5_krbhost_info_move()
284 (*to)->proto = from->proto; in _krb5_krbhost_info_move()
285 (*to)->port = from->port; in _krb5_krbhost_info_move()
286 (*to)->def_port = from->def_port; in _krb5_krbhost_info_move()
287 (*to)->ai = from->ai; in _krb5_krbhost_info_move()
288 from->ai = NULL; in _krb5_krbhost_info_move()
289 (*to)->next = NULL; in _krb5_krbhost_info_move()
290 memcpy((*to)->hostname, from->hostname, hostnamelen + 1); in _krb5_krbhost_info_move()
296 append_host_hostinfo(struct krb5_krbhst_data *kd, struct krb5_krbhst_info *host) in append_host_hostinfo() argument
300 for(h = kd->hosts; h; h = h->next) in append_host_hostinfo()
301 if(h->proto == host->proto && in append_host_hostinfo()
302 h->port == host->port && in append_host_hostinfo()
303 strcmp(h->hostname, host->hostname) == 0) { in append_host_hostinfo()
304 _krb5_free_krbhst_info(host); in append_host_hostinfo()
307 *kd->end = host; in append_host_hostinfo()
308 kd->end = &host->next; in append_host_hostinfo()
313 const char *host, int def_port, int port) in append_host_string() argument
317 hi = parse_hostspec(context, kd, host, def_port, port); in append_host_string()
326 * return a readable representation of `host' in `hostname, hostlen'
330 krb5_krbhst_format_string(krb5_context context, const krb5_krbhst_info *host, in krb5_krbhst_format_string() argument
335 if(host->proto == KRB5_KRBHST_TCP) in krb5_krbhst_format_string()
337 else if(host->proto == KRB5_KRBHST_HTTP) in krb5_krbhst_format_string()
339 if(host->port != host->def_port) in krb5_krbhst_format_string()
340 snprintf(portstr, sizeof(portstr), ":%d", host->port); in krb5_krbhst_format_string()
341 snprintf(hostname, hostlen, "%s%s%s", proto, host->hostname, portstr); in krb5_krbhst_format_string()
353 hints->ai_family = AF_UNSPEC; in make_hints()
356 hints->ai_socktype = SOCK_DGRAM; in make_hints()
360 hints->ai_socktype = SOCK_STREAM; in make_hints()
366 * Return an `struct addrinfo *' for a KDC host.
369 * information in `host'. free:ing is handled by krb5_krbhst_free, so
376 krb5_krbhst_get_addrinfo(krb5_context context, krb5_krbhst_info *host, in krb5_krbhst_get_addrinfo() argument
381 if (host->ai == NULL) { in krb5_krbhst_get_addrinfo()
384 char *hostname = host->hostname; in krb5_krbhst_get_addrinfo()
386 snprintf (portstr, sizeof(portstr), "%d", host->port); in krb5_krbhst_get_addrinfo()
387 make_hints(&hints, host->proto); in krb5_krbhst_get_addrinfo()
396 ret = getaddrinfo(host->hostname, portstr, &hints, &host->ai); in krb5_krbhst_get_addrinfo()
408 if (strchr(hostname, '.') && hostname[strlen(hostname) - 1] != '.') { in krb5_krbhst_get_addrinfo()
409 ret = asprintf(&hostname, "%s.", host->hostname); in krb5_krbhst_get_addrinfo()
414 ret = getaddrinfo(hostname, portstr, &hints, &host->ai); in krb5_krbhst_get_addrinfo()
415 if (hostname != host->hostname) in krb5_krbhst_get_addrinfo()
423 *ai = host->ai; in krb5_krbhst_get_addrinfo()
428 get_next(struct krb5_krbhst_data *kd, krb5_krbhst_info **host) in get_next() argument
430 struct krb5_krbhst_info *hi = *kd->index; in get_next()
432 *host = hi; in get_next()
433 kd->index = &(*kd->index)->next; in get_next()
447 ret = srv_find_realm(context, &res, &count, kd->realm, "SRV", proto, service, in srv_get_hosts()
448 kd->port); in srv_get_hosts()
449 _krb5_debug(context, 2, "searching DNS for realm %s %s.%s -> %d", in srv_get_hosts()
450 kd->realm, proto, service, ret); in srv_get_hosts()
459 * read the configuration for `conf_string', defaulting to kd->def_port and
460 * forcing it to `kd->port' if kd->port != 0
470 "realms", kd->realm, conf_string, NULL); in config_get_hosts()
473 kd->realm, hostlist ? "" : " not"); in config_get_hosts()
477 kd->flags |= KD_CONFIG_EXISTS; in config_get_hosts()
479 append_host_string(context, kd, hostlist[i], kd->def_port, kd->port); in config_get_hosts()
485 * as a fallback, look for `serv_string.kd->realm' (typically
486 * kerberos.REALM, kerberos-1.REALM, ...
487 * `port' is the default port for the service, and `proto' the
493 const char *serv_string, int port, int proto) in fallback_get_hosts() argument
495 char *host = NULL; in fallback_get_hosts() local
502 kd->fallback_count, kd->realm, serv_string); in fallback_get_hosts()
508 if(kd->fallback_count >= 5) { in fallback_get_hosts()
509 kd->flags |= KD_FALLBACK; in fallback_get_hosts()
513 if(kd->fallback_count == 0) in fallback_get_hosts()
514 ret = asprintf(&host, "%s.%s.", serv_string, kd->realm); in fallback_get_hosts()
516 ret = asprintf(&host, "%s-%d.%s.", in fallback_get_hosts()
517 serv_string, kd->fallback_count, kd->realm); in fallback_get_hosts()
519 if (ret < 0 || host == NULL) in fallback_get_hosts()
523 snprintf(portstr, sizeof(portstr), "%d", port); in fallback_get_hosts()
524 ret = getaddrinfo(host, portstr, &hints, &ai); in fallback_get_hosts()
527 free(host); in fallback_get_hosts()
528 kd->flags |= KD_FALLBACK; in fallback_get_hosts()
531 size_t hostlen = strlen(host); in fallback_get_hosts()
535 free(host); in fallback_get_hosts()
539 hi->proto = proto; in fallback_get_hosts()
540 hi->port = hi->def_port = port; in fallback_get_hosts()
541 hi->ai = ai; in fallback_get_hosts()
542 memmove(hi->hostname, host, hostlen); in fallback_get_hosts()
543 hi->hostname[hostlen] = '\0'; in fallback_get_hosts()
544 free(host); in fallback_get_hosts()
546 kd->fallback_count++; in fallback_get_hosts()
560 char host[NI_MAXHOST], port[NI_MAXSERV]; in add_locate() local
568 ret = getnameinfo(addr, socklen, host, sizeof(host), port, sizeof(port), in add_locate()
574 ret = getaddrinfo(host, port, &hints, &ai); in add_locate()
578 hostlen = strlen(host); in add_locate()
584 hi->proto = krbhst_get_default_proto(kd); in add_locate()
585 hi->port = hi->def_port = socket_get_port(addr); in add_locate()
586 hi->ai = ai; in add_locate()
587 memmove(hi->hostname, host, hostlen); in add_locate()
588 hi->hostname[hostlen] = '\0'; in add_locate()
612 if (service->minor_version != 0) in plugin_get_hosts()
615 (*service->init)(context, &ctx); in plugin_get_hosts()
616 ret = (*service->lookup)(ctx, type, kd->realm, 0, 0, add_locate, kd); in plugin_get_hosts()
617 (*service->fini)(ctx); in plugin_get_hosts()
621 kd->realm, ret); in plugin_get_hosts()
624 _krb5_debug(context, 2, "plugin found result for realm %s", kd->realm); in plugin_get_hosts()
625 kd->flags |= KD_CONFIG_EXISTS; in plugin_get_hosts()
639 krb5_krbhst_info **host) in kdc_get_next() argument
643 if ((kd->flags & KD_PLUGIN) == 0) { in kdc_get_next()
645 kd->flags |= KD_PLUGIN; in kdc_get_next()
646 if(get_next(kd, host)) in kdc_get_next()
650 if((kd->flags & KD_CONFIG) == 0) { in kdc_get_next()
652 kd->flags |= KD_CONFIG; in kdc_get_next()
653 if(get_next(kd, host)) in kdc_get_next()
657 if (kd->flags & KD_CONFIG_EXISTS) { in kdc_get_next()
660 kd->realm); in kdc_get_next()
664 if(context->srv_lookup) { in kdc_get_next()
665 if((kd->flags & KD_SRV_UDP) == 0 && (kd->flags & KD_LARGE_MSG) == 0) { in kdc_get_next()
667 kd->flags |= KD_SRV_UDP; in kdc_get_next()
668 if(get_next(kd, host)) in kdc_get_next()
672 if((kd->flags & KD_SRV_TCP) == 0) { in kdc_get_next()
674 kd->flags |= KD_SRV_TCP; in kdc_get_next()
675 if(get_next(kd, host)) in kdc_get_next()
678 if((kd->flags & KD_SRV_HTTP) == 0) { in kdc_get_next()
680 kd->flags |= KD_SRV_HTTP; in kdc_get_next()
681 if(get_next(kd, host)) in kdc_get_next()
686 while((kd->flags & KD_FALLBACK) == 0) { in kdc_get_next()
688 kd->def_port, in kdc_get_next()
692 if(get_next(kd, host)) in kdc_get_next()
696 _krb5_debug(context, 0, "No KDC entries found for %s", kd->realm); in kdc_get_next()
704 krb5_krbhst_info **host) in admin_get_next() argument
708 if ((kd->flags & KD_PLUGIN) == 0) { in admin_get_next()
710 kd->flags |= KD_PLUGIN; in admin_get_next()
711 if(get_next(kd, host)) in admin_get_next()
715 if((kd->flags & KD_CONFIG) == 0) { in admin_get_next()
717 kd->flags |= KD_CONFIG; in admin_get_next()
718 if(get_next(kd, host)) in admin_get_next()
722 if (kd->flags & KD_CONFIG_EXISTS) { in admin_get_next()
725 kd->realm); in admin_get_next()
729 if(context->srv_lookup) { in admin_get_next()
730 if((kd->flags & KD_SRV_TCP) == 0) { in admin_get_next()
731 srv_get_hosts(context, kd, "tcp", "kerberos-adm"); in admin_get_next()
732 kd->flags |= KD_SRV_TCP; in admin_get_next()
733 if(get_next(kd, host)) in admin_get_next()
739 && (kd->flags & KD_FALLBACK) == 0) { in admin_get_next()
741 kd->def_port, in admin_get_next()
745 kd->flags |= KD_FALLBACK; in admin_get_next()
746 if(get_next(kd, host)) in admin_get_next()
750 _krb5_debug(context, 0, "No admin entries found for realm %s", kd->realm); in admin_get_next()
758 krb5_krbhst_info **host) in kpasswd_get_next() argument
762 if ((kd->flags & KD_PLUGIN) == 0) { in kpasswd_get_next()
764 kd->flags |= KD_PLUGIN; in kpasswd_get_next()
765 if(get_next(kd, host)) in kpasswd_get_next()
769 if((kd->flags & KD_CONFIG) == 0) { in kpasswd_get_next()
771 kd->flags |= KD_CONFIG; in kpasswd_get_next()
772 if(get_next(kd, host)) in kpasswd_get_next()
776 if (kd->flags & KD_CONFIG_EXISTS) { in kpasswd_get_next()
779 kd->realm); in kpasswd_get_next()
783 if(context->srv_lookup) { in kpasswd_get_next()
784 if((kd->flags & KD_SRV_UDP) == 0) { in kpasswd_get_next()
786 kd->flags |= KD_SRV_UDP; in kpasswd_get_next()
787 if(get_next(kd, host)) in kpasswd_get_next()
790 if((kd->flags & KD_SRV_TCP) == 0) { in kpasswd_get_next()
792 kd->flags |= KD_SRV_TCP; in kpasswd_get_next()
793 if(get_next(kd, host)) in kpasswd_get_next()
798 /* no matches -> try admin */ in kpasswd_get_next()
801 kd->flags = 0; in kpasswd_get_next()
802 kd->port = kd->def_port; in kpasswd_get_next()
803 kd->get_next = admin_get_next; in kpasswd_get_next()
804 ret = (*kd->get_next)(context, kd, host); in kpasswd_get_next()
806 (*host)->proto = krbhst_get_default_proto(kd); in kpasswd_get_next()
810 _krb5_debug(context, 0, "No kpasswd entries found for realm %s", kd->realm); in kpasswd_get_next()
818 krb5_krbhst_info **host) in krb524_get_next() argument
820 if ((kd->flags & KD_PLUGIN) == 0) { in krb524_get_next()
822 kd->flags |= KD_PLUGIN; in krb524_get_next()
823 if(get_next(kd, host)) in krb524_get_next()
827 if((kd->flags & KD_CONFIG) == 0) { in krb524_get_next()
829 if(get_next(kd, host)) in krb524_get_next()
831 kd->flags |= KD_CONFIG; in krb524_get_next()
834 if (kd->flags & KD_CONFIG_EXISTS) { in krb524_get_next()
837 kd->realm); in krb524_get_next()
841 if(context->srv_lookup) { in krb524_get_next()
842 if((kd->flags & KD_SRV_UDP) == 0) { in krb524_get_next()
844 kd->flags |= KD_SRV_UDP; in krb524_get_next()
845 if(get_next(kd, host)) in krb524_get_next()
849 if((kd->flags & KD_SRV_TCP) == 0) { in krb524_get_next()
851 kd->flags |= KD_SRV_TCP; in krb524_get_next()
852 if(get_next(kd, host)) in krb524_get_next()
857 /* no matches -> try kdc */ in krb524_get_next()
860 kd->flags = 0; in krb524_get_next()
861 kd->port = kd->def_port; in krb524_get_next()
862 kd->get_next = kdc_get_next; in krb524_get_next()
863 return (*kd->get_next)(context, kd, host); in krb524_get_next()
866 _krb5_debug(context, 0, "No kpasswd entries found for realm %s", kd->realm); in krb524_get_next()
882 if((kd->realm = strdup(realm)) == NULL) { in common_init()
892 kd->flags |= KD_CONFIG_EXISTS; in common_init()
895 kd->flags |= KD_LARGE_MSG; in common_init()
896 kd->end = kd->index = &kd->hosts; in common_init()
934 def_port = ntohs(krb5_getportbyname (context, "kerberos-adm", in krb5_krbhst_init_flags()
956 kd->get_next = next; in krb5_krbhst_init_flags()
957 kd->def_port = def_port; in krb5_krbhst_init_flags()
963 * return the next host information from `handle' in `host'
969 krb5_krbhst_info **host) in krb5_krbhst_next() argument
971 if(get_next(handle, host)) in krb5_krbhst_next()
974 return (*handle->get_next)(context, handle, host); in krb5_krbhst_next()
978 * return the next host information from `handle' as a host name
989 krb5_krbhst_info *host; in krb5_krbhst_next_as_string() local
990 ret = krb5_krbhst_next(context, handle, &host); in krb5_krbhst_next_as_string()
993 return krb5_krbhst_format_string(context, host, hostname, hostlen); in krb5_krbhst_next_as_string()
1000 handle->index = &handle->hosts; in krb5_krbhst_reset()
1011 for (h = handle->hosts; h != NULL; h = next) { in krb5_krbhst_free()
1012 next = h->next; in krb5_krbhst_free()
1016 free(handle->realm); in krb5_krbhst_free()
1029 char host[MAXHOSTNAMELEN]; in gethostlist() local
1052 host, sizeof(host)) == 0) { in gethostlist()
1053 if(((*hostlist)[nhost++] = strdup(host)) == NULL) { in gethostlist()
1065 * return an malloced list of kadmin-hosts for `realm' in `hostlist'
1077 * return an malloced list of changepw-hosts for `realm' in `hostlist'
1089 * return an malloced list of 524-hosts for `realm' in `hostlist'