7482934673407343deaaa25584778b445b914641
[oweals/cde.git] / cde / programs / dtlogin / netaddr.c
1 /* $TOG: netaddr.c /main/5 1997/03/14 13:44:57 barstow $ */
2 /* (c) Copyright 1997 The Open Group */
3 /*                                                                      *
4  * (c) Copyright 1993, 1994 Hewlett-Packard Company                     *
5  * (c) Copyright 1993, 1994 International Business Machines Corp.       *
6  * (c) Copyright 1993, 1994 Sun Microsystems, Inc.                      *
7  * (c) Copyright 1993, 1994 Novell, Inc.                                *
8  */
9 /*
10  * @DEC_COPYRIGHT@
11  */
12 /*
13  * HISTORY
14  * $Log$
15  * Revision 1.1.2.2  1995/04/21  13:05:31  Peter_Derr
16  *      dtlogin auth key fixes from deltacde
17  *      [1995/04/12  19:21:13  Peter_Derr]
18  *
19  *      R6 version used for XDMCP improvements
20  *      [1995/04/12  18:32:12  Peter_Derr]
21  *
22  * $EndLog$
23  */
24 /*
25
26 Copyright (c) 1991  X Consortium
27
28 Permission is hereby granted, free of charge, to any person obtaining
29 a copy of this software and associated documentation files (the
30 "Software"), to deal in the Software without restriction, including
31 without limitation the rights to use, copy, modify, merge, publish,
32 distribute, sublicense, and/or sell copies of the Software, and to
33 permit persons to whom the Software is furnished to do so, subject to
34 the following conditions:
35
36 The above copyright notice and this permission notice shall be included
37 in all copies or substantial portions of the Software.
38
39 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
40 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
41 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
42 IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
43 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
44 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
45 OTHER DEALINGS IN THE SOFTWARE.
46
47 Except as contained in this notice, the name of the X Consortium shall
48 not be used in advertising or otherwise to promote the sale, use or
49 other dealings in this Software without prior written authorization
50 from the X Consortium.
51
52 */
53
54 /*
55  * xdm - X display manager
56  *
57  * netaddr.c - Interpretation of XdmcpNetaddr object.
58  */
59
60 #include "dm.h"
61
62 #include <X11/X.h>              /* FamilyInternet, etc. */
63
64 #include <sys/socket.h>         /* struct sockaddr */
65 #include <netinet/in.h>         /* struct sockaddr_in */
66
67 #ifdef UNIXCONN
68 #include <sys/un.h>             /* struct sockaddr_un */
69 #endif
70 #ifdef DNETCONN
71 #include <netdnet/dn.h>         /* struct sockaddr_dn */
72 #endif
73
74 /* given an XdmcpNetaddr, returns the socket protocol family used,
75    e.g., AF_INET */
76
77 int NetaddrFamily(netaddrp)
78     XdmcpNetaddr netaddrp;
79 {
80 #ifdef STREAMSCONN
81     short family = *(short *)netaddrp;
82     return family;
83 #else
84     return ((struct sockaddr *)netaddrp)->sa_family;
85 #endif
86 }
87
88
89 /* given an XdmcpNetaddr, returns a pointer to the TCP/UDP port used
90    and sets *lenp to the length of the address
91    or 0 if not using TCP or UDP. */
92
93 char * NetaddrPort(netaddrp, lenp)
94     XdmcpNetaddr netaddrp;
95     int *lenp;                  /* return */
96 {
97 #ifdef STREAMSCONN
98     *lenp = 2;
99     return netaddrp+2;
100 #else
101     switch (NetaddrFamily(netaddrp))
102     {
103     case AF_INET:
104         *lenp = 2;
105         return (char *)&(((struct sockaddr_in *)netaddrp)->sin_port);
106     default:
107         *lenp = 0;
108         return NULL;
109     }
110 #endif
111 }
112
113
114 /* given an XdmcpNetaddr, returns a pointer to the network address
115    and sets *lenp to the length of the address */
116
117 char * NetaddrAddress(netaddrp, lenp)
118     XdmcpNetaddr netaddrp;
119     int *lenp;                  /* return */
120 {
121 #ifdef STREAMSCONN
122     *lenp = 4;
123     return netaddrp+4;
124 #else
125     switch (NetaddrFamily(netaddrp)) {
126 #ifdef UNIXCONN
127     case AF_UNIX:
128         *lenp = strlen(((struct sockaddr_un *)netaddrp)->sun_path);
129         return (char *) (((struct sockaddr_un *)netaddrp)->sun_path);
130 #endif
131 #ifdef TCPCONN
132     case AF_INET:
133         *lenp = sizeof (struct in_addr);
134         return (char *) &(((struct sockaddr_in *)netaddrp)->sin_addr);
135 #endif
136 #ifdef DNETCONN
137     case AF_DECnet:
138         *lenp = sizeof (struct dn_naddr);
139         return (char *) &(((struct sockaddr_dn *)netaddrp)->sdn_add);
140 #endif
141 #ifdef AF_CHAOS
142     case AF_CHAOS:
143 #endif
144     default:
145         *lenp = 0;
146         return NULL;
147     }
148 #endif /* STREAMSCONN else */
149 }
150
151
152 /* given an XdmcpNetaddr, sets *addr to the network address used and
153    sets *len to the number of bytes in addr.
154    Returns the X protocol family used, e.g., FamilyInternet */
155
156 int ConvertAddr (saddr, len, addr)
157     XdmcpNetaddr saddr;
158     int *len;                   /* return */
159     char **addr;                /* return */
160 {
161     int retval;
162
163     if (len == NULL)
164         return -1;
165     *addr = NetaddrAddress(saddr, len);
166 #ifdef STREAMSCONN
167     /* kludge */
168     if (NetaddrFamily(saddr) == 2)
169         retval = FamilyInternet;
170 #else
171     switch (NetaddrFamily(saddr))
172     {
173 #ifdef AF_UNSPEC
174       case AF_UNSPEC:
175         retval = FamilyLocal;
176         break;
177 #endif
178 #ifdef AF_UNIX
179 #ifndef hpux
180       case AF_UNIX:
181         retval = FamilyLocal;
182         break;
183 #endif
184 #endif
185 #ifdef TCPCONN
186       case AF_INET:
187         retval = FamilyInternet;
188         break;
189 #endif
190 #ifdef DNETCONN
191       case AF_DECnet:
192         retval = FamilyDECnet;
193         break;
194 #endif
195 #ifdef AF_CHAOS
196     case AF_CHAOS:
197         retval = FamilyChaos;
198         break;
199 #endif
200       default:
201         retval = -1;
202         break;
203     }
204 #endif /* STREAMSCONN else */
205     Debug ("ConvertAddr returning %d for family %d\n", retval,
206            NetaddrFamily(saddr));
207     return retval;
208 }
209
210 addressEqual (a1, len1, a2, len2)
211     XdmcpNetaddr a1, a2;
212     int          len1, len2;
213 {
214     int partlen1, partlen2;
215     char *part1, *part2;
216
217     if (len1 != len2)
218     {
219         return FALSE;
220     }
221     if (NetaddrFamily(a1) != NetaddrFamily(a2))
222     {
223         return FALSE;
224     }
225     part1 = NetaddrPort(a1, &partlen1);
226     part2 = NetaddrPort(a2, &partlen2);
227     if (partlen1 != partlen2 || memcmp(part1, part2, partlen1) != 0)
228     {
229         return FALSE;
230     }
231     part1 = NetaddrAddress(a1, &partlen1);
232     part2 = NetaddrAddress(a2, &partlen2);
233     if (partlen1 != partlen2 || memcmp(part1, part2, partlen1) != 0)
234     {
235         return FALSE;
236     }
237     return TRUE;
238 }
239
240 #ifdef DEBUG
241 /*ARGSUSED*/
242 PrintSockAddr (a, len)          /* Debugging routine */
243     struct sockaddr *a;
244     int             len;
245 {
246     unsigned char    *t, *p;
247
248     Debug ("family %d, ", a->sa_family);
249     switch (a->sa_family) {
250 #ifdef AF_INET
251     case AF_INET:
252
253         p = (unsigned char *) &((struct sockaddr_in *) a)->sin_port;
254         t = (unsigned char *) &((struct sockaddr_in *) a)->sin_addr;
255
256         Debug ("port %d, host %d.%d.%d.%d\n",
257                 (p[0] << 8) + p[1], t[0], t[1], t[2], t[3]);
258         break;
259     }
260 #endif
261 }
262 #endif