*** ./clients/xhost/xhost.c	1993/06/08 23:40:03	1.1
--- ./clients/xhost/xhost.c	1993/08/18 15:35:21
***************
*** 34,39 ****
--- 34,42 ----
  #define NEEDSOCKETS
  #endif
  
+ #ifdef K5AUTH
+ #include <krb5/krb5.h>
+ #endif
  #include <X11/Xlib.h>
  #include <X11/Xos.h>
  #include <X11/Xproto.h>
***************
*** 44,49 ****
--- 47,55 ----
  #include <ctype.h>
  #include <X11/Xauth.h>
  #include <X11/Xmu/Error.h>
+ #ifdef K5AUTH
+ #include <X11/k5encode.h>
+ #endif
  
  #ifdef NEEDSOCKETS
  #ifdef att
***************
*** 187,192 ****
--- 193,215 ----
  		    for (i = 0; i < nhosts; i++ )  {
  		      hostname = get_hostname(&list[i]);
  		      if (hostname) {
+ 			  switch (list[i].family) {
+ 			  case FamilyInternet:
+                               printf("INET:");
+ 			      break;
+                           case FamilyDECnet:
+                               printf("DNET:");
+                               break;
+                           case FamilyNetname:
+                               printf("NIS:");
+                               break;
+                           case FamilyKrb5Principal:
+ 			      printf("KRB:");
+                               break;
+ 			  case FamilyLocalHost:
+ 			      printf("LOCAL:");
+ 			      break;
+ 			  }
  			  printf ("%s", hostname);
  		      } else {
  #ifdef STREAMSCONN
***************
*** 262,267 ****
--- 285,296 ----
  {
    struct hostent *hp;
    XHostAddress ha;
+   char *lname;
+   int namelen, i, family = FamilyWild;
+ #ifdef K5AUTH
+   krb5_principal princ;
+   krb5_data kbuf;
+ #endif
  #ifdef NEEDSOCKETS
    static struct in_addr addr;	/* so we can point at it */
  #endif
***************
*** 274,282 ****
    static char *add_msg = "being added to access control list";
    static char *remove_msg = "being removed from access control list";
  
  #ifdef DNETCONN
!   if ((cp = index (name, ':')) && (*(cp + 1) == ':')) {
!     *cp = '\0';
      ha.family = FamilyDECnet;
      if (dnaddrp = dnet_addr(name)) {
        dnaddr = *dnaddrp;
--- 303,348 ----
    static char *add_msg = "being added to access control list";
    static char *remove_msg = "being removed from access control list";
  
+   namelen = strlen(name);
+   if ((lname = (char *)malloc(namelen)) == NULL) {
+     fprintf (stderr, "%s: malloc bombed in change_host\n", ProgramName);
+     return -1;
+   }
+   for (i = 0; i < namelen; i++) {
+     lname[i] = tolower(name[i]);
+   }
+ #ifdef TCPCONN
+   if (!strncmp("inet:", lname, 5)) {
+     family = FamilyInternet;
+     name += 5;
+   }
+ #endif
+ #ifdef DNETCONN
+   if (!strncmp("dnet:", lname, 5)) {
+     family = FamilyDECnet;
+     name += 5;
+   }
+ #endif
+ #ifdef SECURE_RPC
+   if (!strncmp("nis:", lname, 4)) {
+     family = FamilyNetname;
+     name += 4;
+   }
+ #endif
+ #ifdef K5AUTH
+   if (!strncmp("krb:", lname, 4)) {
+     family = FamilyKrb5Principal;
+     name +=4;
+   }
+   if (!strncmp("local:", lname, 6)) {
+     family = FamilyLocalHost;
+   }
+ #endif
+   free(lname);
  #ifdef DNETCONN
!   if (family == FamilyDECnet ||
!       (cp = index (name, ':')) && (*(cp + 1) == ':') &&
!       !(*cp = '\0')) {
      ha.family = FamilyDECnet;
      if (dnaddrp = dnet_addr(name)) {
        dnaddr = *dnaddrp;
***************
*** 301,311 ****
      return 1;
    }
  #endif /* DNETCONN */
      /*
       * If it has an '@',  its a netname
       */
!     if (cp = index(name, '@')) {
! 	char *netname = name;
  #ifdef SECURE_RPC
  	static char username[MAXNETNAMELEN];
  
--- 367,406 ----
      return 1;
    }
  #endif /* DNETCONN */
+ #ifdef K5AUTH
+   if (family == FamilyKrb5Principal) {
+     krb5_parse_name(name, &princ);
+     k5_encode(princ, &kbuf);
+     ha.length = kbuf.length;
+     ha.address = kbuf.data;
+     ha.family = family;
+     if (add)
+       XAddHost(dpy, &ha);
+     else
+       XRemoveHost(dpy, &ha);
+     krb5_free_principal(princ);
+     free(kbuf.data);
+     printf( "%s %s\n", name, add ? add_msg : remove_msg);
+     return 1;
+   }
+ #endif
+   if (family == FamilyLocalHost) {
+     ha.length = 1;
+     ha.address = "";
+     ha.family = family;
+     if (add)
+       XAddHost(dpy, &ha);
+     else
+       XRemoveHost(dpy, &ha);
+     printf( "non-network local host %s %s\n", name, add ? add_msg : remove_msg);
+     return 1;
+   }
      /*
       * If it has an '@',  its a netname
       */
!     if ((family == FamilyNetname && (cp = index(name, '@'))) ||
! 	(cp = index(name, '@'))) {
!         char *netname = name;
  #ifdef SECURE_RPC
  	static char username[MAXNETNAMELEN];
  
***************
*** 426,432 ****
    struct nodeent *np;
    static char nodeaddr[16];
  #endif /* DNETCONN */
! 
  #ifdef TCPCONN
    if (ha->family == FamilyInternet) {
      /* gethostbyaddr can take a LONG time if the host does not exist.
--- 521,532 ----
    struct nodeent *np;
    static char nodeaddr[16];
  #endif /* DNETCONN */
! #ifdef K5AUTH
!   krb5_principal princ;
!   krb5_data kbuf;
!   char *kname;
!   static char kname_out[255];
! #endif
  #ifdef TCPCONN
    if (ha->family == FamilyInternet) {
      /* gethostbyaddr can take a LONG time if the host does not exist.
***************
*** 476,488 ****
  #ifdef DNETCONN
    if (ha->family == FamilyDECnet) {
      if (np = getnodebyaddr(ha->address, ha->length, AF_DECnet)) {
!       sprintf(nodeaddr, "%s::", np->n_name);
      } else {
!       sprintf(nodeaddr, "%s::", dnet_htoa(ha->address));
      }
      return(nodeaddr);
    }
  #endif
  #ifdef STREAMSCONN
    return get_streams_hostname (ha);
  #else
--- 576,603 ----
  #ifdef DNETCONN
    if (ha->family == FamilyDECnet) {
      if (np = getnodebyaddr(ha->address, ha->length, AF_DECnet)) {
!       sprintf(nodeaddr, "%s", np->n_name);
      } else {
!       sprintf(nodeaddr, "%s", dnet_htoa(ha->address));
      }
      return(nodeaddr);
    }
  #endif
+ #ifdef K5AUTH
+   if (ha->family == FamilyKrb5Principal) {
+     kbuf.data = ha->address;
+     kbuf.length = ha->length;
+     k5_decode(kbuf, &princ);
+     krb5_unparse_name(princ, &kname);
+     krb5_free_principal(princ);
+     strncpy(kname_out, kname, sizeof (kname_out));
+     free(kname);
+     return kname_out;
+   }
+ #endif
+   if (ha->family == FamilyLocalHost) {
+     return("");
+   }
  #ifdef STREAMSCONN
    return get_streams_hostname (ha);
  #else
