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 + }