1 /* 2 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 | #pragma ident "@(#)kadm_host_srv_names.c 1.6 04/09/08 SMI" 6 | #pragma ident "@(#)kadm_host_srv_names.c 1.5 04/03/16 SMI" 7 8 /* 9 * lib/kad5/kadm_host_srv_names.c 10 */ 11 12 #include "admin.h" 13 #include <stdio.h> 14 #include <os-proto.h> 15 16 #define KADM5_MASTER "admin_server" 17 18 /* 19 * Find the admin server for the given realm. If the realm is null or 20 * the empty string, find the admin server for the default realm. 21 * Returns 0 on succsess (KADM5_OK). It is the callers responsibility to 22 * free the storage allocated to the admin server, master. 23 */ 24 kadm5_ret_t 25 kadm5_get_master(krb5_context context, const char *realm, char **master) 26 { 27 char *def_realm; 28 #ifdef KRB5_DNS_LOOKUP 29 struct sockaddr *addrs; 30 int naddrs; 31 unsigned short dns_portno; 32 char dns_host[MAX_DNS_NAMELEN]; 33 krb5_data dns_realm; 34 krb5_error_code dns_ret = 1; 35 #endif /* KRB5_DNS_LOOKUP */ 36 37 if (realm == 0 || *realm == '\0') 38 krb5_get_default_realm(context, &def_realm); 39 40 (void) profile_get_string(context->profile, "realms", 41 realm ? realm : def_realm, 42 KADM5_MASTER, 0, master); 43 #ifdef KRB5_DNS_LOOKUP 44 if (*master == NULL) { 45 /* 46 * Initialize realm info for (possible) DNS lookups. 47 */ 48 dns_realm.data = strdup(realm ? realm : def_realm); 49 dns_realm.length = strlen(realm ? realm : def_realm); 50 dns_realm.magic = 0; 51 52 dns_ret = krb5_get_servername(context, &dns_realm, 53 "_kerberos-adm", "_udp", 54 dns_host, &dns_portno); 55 if (dns_ret == 0) 56 *master = strdup(dns_host); 57 58 if (dns_realm.data) 59 free(dns_realm.data); 60 } 61 #endif /* KRB5_DNS_LOOKUP */ 62 return (*master ? KADM5_OK : KADM5_NO_SRV); 63 } ----Unchanged portion omitted---- 122 123 + /* 124 + * Get the host base service name for the kiprop principal. Returns 125 + * KADM5_OK on success. Caller must free the storage allocated 126 + * for host_service_name. 127 + */ 128 + kadm5_ret_t kadm5_get_kiprop_host_srv_name(krb5_context context, 129 + const char *realm, 130 + char **host_service_name) { 131 + kadm5_ret_t ret; 132 + char *name; 133 + char *host; 134 + 135 + 136 + if (ret = kadm5_get_master(context, realm, &host)) 137 + return (ret); 138 + 139 + name = malloc(strlen(KADM5_KIPROP_HOST_SERVICE) + strlen(host) + 2); 140 + if (name == NULL) { 141 + free(host); 142 + return (ENOMEM); 143 + } 144 + sprintf(name, "%s@%s", KADM5_KIPROP_HOST_SERVICE, host); 145 + free(host); 146 + *host_service_name = name; 147 + 148 + return (KADM5_OK); 149 + }