summaryrefslogtreecommitdiff
path: root/netaddr.c
diff options
context:
space:
mode:
Diffstat (limited to 'netaddr.c')
-rw-r--r--netaddr.c242
1 files changed, 242 insertions, 0 deletions
diff --git a/netaddr.c b/netaddr.c
new file mode 100644
index 0000000..7053780
--- /dev/null
+++ b/netaddr.c
@@ -0,0 +1,242 @@
+/* $Xorg: netaddr.c,v 1.4 2001/02/09 02:05:40 xorgcvs Exp $ */
+/*
+
+Copyright 1991, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+*/
+
+/*
+ * xdm - X display manager
+ *
+ * netaddr.c - Interpretation of XdmcpNetaddr object.
+ */
+
+#include "dm.h"
+
+#include <X11/X.h> /* FamilyInternet, etc. */
+
+#ifdef XDMCP
+
+#include <sys/socket.h> /* struct sockaddr */
+#include <netinet/in.h> /* struct sockaddr_in */
+
+#ifdef UNIXCONN
+#include <sys/un.h> /* struct sockaddr_un */
+#endif
+#ifdef DNETCONN
+#include <netdnet/dn.h> /* struct sockaddr_dn */
+#endif
+
+/* given an XdmcpNetaddr, returns the socket protocol family used,
+ e.g., AF_INET */
+
+int NetaddrFamily(netaddrp)
+ XdmcpNetaddr netaddrp;
+{
+#ifdef STREAMSCONN
+ short family = *(short *)netaddrp;
+ return family;
+#else
+ return ((struct sockaddr *)netaddrp)->sa_family;
+#endif
+}
+
+
+/* given an XdmcpNetaddr, returns a pointer to the TCP/UDP port used
+ and sets *lenp to the length of the address
+ or 0 if not using TCP or UDP. */
+
+char * NetaddrPort(netaddrp, lenp)
+ XdmcpNetaddr netaddrp;
+ int *lenp; /* return */
+{
+#ifdef STREAMSCONN
+ *lenp = 2;
+ return netaddrp+2;
+#else
+ switch (NetaddrFamily(netaddrp))
+ {
+ case AF_INET:
+ *lenp = 2;
+ return (char *)&(((struct sockaddr_in *)netaddrp)->sin_port);
+ default:
+ *lenp = 0;
+ return NULL;
+ }
+#endif
+}
+
+
+/* given an XdmcpNetaddr, returns a pointer to the network address
+ and sets *lenp to the length of the address */
+
+char * NetaddrAddress(netaddrp, lenp)
+ XdmcpNetaddr netaddrp;
+ int *lenp; /* return */
+{
+#ifdef STREAMSCONN
+ *lenp = 4;
+ return netaddrp+4;
+#else
+ switch (NetaddrFamily(netaddrp)) {
+#ifdef UNIXCONN
+ case AF_UNIX:
+ *lenp = strlen(((struct sockaddr_un *)netaddrp)->sun_path);
+ return (char *) (((struct sockaddr_un *)netaddrp)->sun_path);
+#endif
+#ifdef TCPCONN
+ case AF_INET:
+ *lenp = sizeof (struct in_addr);
+ return (char *) &(((struct sockaddr_in *)netaddrp)->sin_addr);
+#endif
+#ifdef DNETCONN
+ case AF_DECnet:
+ *lenp = sizeof (struct dn_naddr);
+ return (char *) &(((struct sockaddr_dn *)netaddrp)->sdn_add);
+#endif
+#ifdef AF_CHAOS
+ case AF_CHAOS:
+#endif
+ default:
+ *lenp = 0;
+ return NULL;
+ }
+#endif /* STREAMSCONN else */
+}
+
+
+/* given an XdmcpNetaddr, sets *addr to the network address used and
+ sets *len to the number of bytes in addr.
+ Returns the X protocol family used, e.g., FamilyInternet */
+
+int ConvertAddr (saddr, len, addr)
+ XdmcpNetaddr saddr;
+ int *len; /* return */
+ char **addr; /* return */
+{
+ int retval;
+
+ if (len == NULL)
+ return -1;
+ *addr = NetaddrAddress(saddr, len);
+#ifdef STREAMSCONN
+ /* kludge */
+ if (NetaddrFamily(saddr) == 2)
+ retval = FamilyInternet;
+#else
+ switch (NetaddrFamily(saddr))
+ {
+#ifdef AF_UNSPEC
+ case AF_UNSPEC:
+ retval = FamilyLocal;
+ break;
+#endif
+#ifdef AF_UNIX
+#ifndef hpux
+ case AF_UNIX:
+ retval = FamilyLocal;
+ break;
+#endif
+#endif
+#ifdef TCPCONN
+ case AF_INET:
+ retval = FamilyInternet;
+ break;
+#endif
+#ifdef DNETCONN
+ case AF_DECnet:
+ retval = FamilyDECnet;
+ break;
+#endif
+#ifdef AF_CHAOS
+ case AF_CHAOS:
+ retval = FamilyChaos;
+ break;
+#endif
+ default:
+ retval = -1;
+ break;
+ }
+#endif /* STREAMSCONN else */
+ Debug ("ConvertAddr returning %d for family %d\n", retval,
+ NetaddrFamily(saddr));
+ return retval;
+}
+
+addressEqual (a1, len1, a2, len2)
+ XdmcpNetaddr a1, a2;
+ int len1, len2;
+{
+ int partlen1, partlen2;
+ char *part1, *part2;
+
+ if (len1 != len2)
+ {
+ return FALSE;
+ }
+ if (NetaddrFamily(a1) != NetaddrFamily(a2))
+ {
+ return FALSE;
+ }
+ part1 = NetaddrPort(a1, &partlen1);
+ part2 = NetaddrPort(a2, &partlen2);
+ if (partlen1 != partlen2 || memcmp(part1, part2, partlen1) != 0)
+ {
+ return FALSE;
+ }
+ part1 = NetaddrAddress(a1, &partlen1);
+ part2 = NetaddrAddress(a2, &partlen2);
+ if (partlen1 != partlen2 || memcmp(part1, part2, partlen1) != 0)
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+#ifdef DEBUG
+/*ARGSUSED*/
+PrintSockAddr (a, len) /* Debugging routine */
+ struct sockaddr *a;
+ int len;
+{
+ unsigned char *t, *p;
+
+ Debug ("family %d, ", a->sa_family);
+ switch (a->sa_family) {
+#ifdef AF_INET
+ case AF_INET:
+
+ p = (unsigned char *) &((struct sockaddr_in *) a)->sin_port;
+ t = (unsigned char *) &((struct sockaddr_in *) a)->sin_addr;
+
+ Debug ("port %d, host %d.%d.%d.%d\n",
+ (p[0] << 8) + p[1], t[0], t[1], t[2], t[3]);
+ break;
+ }
+#endif
+}
+#endif
+
+#endif /* XDMCP */