home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / X / mit / clients / xdm / netaddr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-07-19  |  5.0 KB  |  229 lines

  1. /*
  2.  * xdm - X display manager
  3.  *
  4.  * $XConsortium: netaddr.c,v 1.4 91/07/19 18:50:08 rws Exp $
  5.  *
  6.  * Copyright 1991 Massachusetts Institute of Technology
  7.  *
  8.  * Permission to use, copy, modify, and distribute this software and its
  9.  * documentation for any purpose and without fee is hereby granted, provided
  10.  * that the above copyright notice appear in all copies and that both that
  11.  * copyright notice and this permission notice appear in supporting
  12.  * documentation, and that the name of M.I.T. not be used in advertising or
  13.  * publicity pertaining to distribution of the software without specific,
  14.  * written prior permission.  M.I.T. makes no representations about the
  15.  * suitability of this software for any purpose.  It is provided "as is"
  16.  * without express or implied warranty.
  17.  */
  18.  
  19. /*
  20.  * netaddr.c - Interpretation of XdmcpNetaddr object.
  21.  */
  22.  
  23. #include "dm.h"
  24.  
  25. #include <X11/X.h>        /* FamilyInternet, etc. */
  26.  
  27. #ifdef XDMCP
  28.  
  29. #include <sys/socket.h>        /* struct sockaddr */
  30. #include <netinet/in.h>        /* struct sockaddr_in */
  31.  
  32. #ifdef UNIXCONN
  33. #include <sys/un.h>        /* struct sockaddr_un */
  34. #endif
  35. #ifdef DNETCONN
  36. #include <netdnet/dn.h>        /* struct sockaddr_dn */
  37. #endif
  38.  
  39. /* given an XdmcpNetaddr, returns the socket protocol family used,
  40.    e.g., AF_INET */
  41.  
  42. int NetaddrFamily(netaddrp)
  43.     XdmcpNetaddr *netaddrp;
  44. {
  45. #ifdef STREAMSCONN
  46.     short family = *(short *)netaddrp;
  47.     return family;
  48. #else
  49.     return ((struct sockaddr *)netaddrp)->sa_family;
  50. #endif
  51. }
  52.  
  53.  
  54. /* given an XdmcpNetaddr, returns a pointer to the TCP/UDP port used
  55.    and sets *lenp to the length of the address
  56.    or 0 if not using TCP or UDP. */
  57.  
  58. char * NetaddrPort(netaddrp, lenp)
  59.     XdmcpNetaddr netaddrp;
  60.     int *lenp;            /* return */
  61. {
  62. #ifdef STREAMSCONN
  63.     *lenp = 2;
  64.     return netaddrp+2;
  65. #else
  66.     switch (NetaddrFamily(netaddrp))
  67.     {
  68.     case AF_INET:
  69.     *lenp = 2;
  70.     return (char *)&(((struct sockaddr_in *)netaddrp)->sin_port);
  71.     default:
  72.     *lenp = 0;
  73.     return NULL;
  74.     }
  75. #endif
  76. }
  77.  
  78.  
  79. /* given an XdmcpNetaddr, returns a pointer to the network address
  80.    and sets *lenp to the length of the address */
  81.  
  82. char * NetaddrAddress(netaddrp, lenp)
  83.     XdmcpNetaddr netaddrp;
  84.     int *lenp;            /* return */
  85. {
  86. #ifdef STREAMSCONN
  87.     *lenp = 4;
  88.     return netaddrp+4;
  89. #else
  90.     switch (NetaddrFamily(netaddrp)) {
  91. #ifdef UNIXCONN
  92.     case AF_UNIX:
  93.     *lenp = strlen(((struct sockaddr_un *)netaddrp)->sun_path);
  94.         return (char *) (((struct sockaddr_un *)netaddrp)->sun_path);
  95. #endif
  96. #ifdef TCPCONN
  97.     case AF_INET:
  98.         *lenp = sizeof (struct in_addr);
  99.         return (char *) &(((struct sockaddr_in *)netaddrp)->sin_addr);
  100. #endif
  101. #ifdef DNETCONN
  102.     case AF_DECnet:
  103.         *lenp = sizeof (struct dn_naddr);
  104.         return (char *) &(((struct sockaddr_dn *)netaddrp)->sdn_add);
  105. #endif
  106. #ifdef AF_CHAOS
  107.     case AF_CHAOS:
  108. #endif
  109.     default:
  110.     *lenp = 0;
  111.     return NULL;
  112.     }
  113. #endif /* STREAMSCONN else */
  114. }
  115.  
  116.  
  117. /* given an XdmcpNetaddr, sets *addr to the network address used and
  118.    sets *len to the number of bytes in addr.
  119.    Returns the X protocol family used, e.g., FamilyInternet */
  120.  
  121. int ConvertAddr (saddr, len, addr)
  122.     XdmcpNetaddr saddr;
  123.     int *len;            /* return */
  124.     char **addr;        /* return */
  125. {
  126.     int retval;
  127.  
  128.     if (len == NULL)
  129.         return -1;
  130.     *addr = NetaddrAddress(saddr, len);
  131. #ifdef STREAMSCONN
  132.     /* kludge */
  133.     if (NetaddrFamily(saddr) == 2)
  134.     retval = FamilyInternet;
  135. #else
  136.     switch (NetaddrFamily(saddr))
  137.     {
  138. #ifdef AF_UNSPEC
  139.       case AF_UNSPEC:
  140.     retval = FamilyLocal;
  141.     break;
  142. #endif
  143. #ifdef AF_UNIX
  144. #ifndef hpux
  145.       case AF_UNIX:
  146.         retval = FamilyLocal;
  147.     break;
  148. #endif
  149. #endif
  150. #ifdef TCPCONN
  151.       case AF_INET:
  152.         retval = FamilyInternet;
  153.     break;
  154. #endif
  155. #ifdef DNETCONN
  156.       case AF_DECnet:
  157.         retval = FamilyDECnet;
  158.     break;
  159. #endif
  160. #ifdef AF_CHAOS
  161.     case AF_CHAOS:
  162.     retval = FamilyChaos;
  163.     break;
  164. #endif
  165.       default:
  166.     retval = -1;
  167.         break;
  168.     }
  169. #endif /* STREAMSCONN else */
  170.     Debug ("ConvertAddr returning %d\n", retval);
  171.     return retval;
  172. }
  173.  
  174. addressEqual (a1, len1, a2, len2)
  175.     XdmcpNetaddr a1, a2;
  176.     int         len1, len2;
  177. {
  178.     int partlen1, partlen2;
  179.     char *part1, *part2;
  180.  
  181.     if (len1 != len2)
  182.     {
  183.     return FALSE;
  184.     }
  185.     if (NetaddrFamily(a1) != NetaddrFamily(a2))
  186.     {
  187.     return FALSE;
  188.     }
  189.     part1 = NetaddrPort(a1, &partlen1);
  190.     part2 = NetaddrPort(a2, &partlen2);
  191.     if (partlen1 != partlen2 || bcmp(part1, part2, partlen1) != 0)
  192.     {
  193.     return FALSE;
  194.     }
  195.     part1 = NetaddrAddress(a1, &partlen1);
  196.     part2 = NetaddrAddress(a2, &partlen2);
  197.     if (partlen1 != partlen2 || bcmp(part1, part2, partlen1) != 0)
  198.     {
  199.     return FALSE;
  200.     }
  201.     return TRUE;
  202. }
  203.  
  204. #ifdef DEBUG
  205. /*ARGSUSED*/
  206. PrintSockAddr (a, len)        /* Debugging routine */
  207.     struct sockaddr *a;
  208.     int            len;
  209. {
  210.     unsigned char    *t, *p;
  211.  
  212.     Debug ("family %d, ", a->sa_family);
  213.     switch (a->sa_family) {
  214. #ifdef AF_INET
  215.     case AF_INET:
  216.  
  217.     p = (unsigned char *) &((struct sockaddr_in *) a)->sin_port;
  218.     t = (unsigned char *) &((struct sockaddr_in *) a)->sin_addr;
  219.  
  220.     Debug ("port %d, host %d.%d.%d.%d\n",
  221.         (p[0] << 8) + p[1], t[0], t[1], t[2], t[3]);
  222.     break;
  223.     }
  224. #endif
  225. }
  226. #endif
  227.  
  228. #endif /* XDMCP */
  229.