xref: /csrg-svn/sbin/XNSrouted/af.c (revision 24305)
1*24305Ssklower #ifndef lint
2*24305Ssklower static char rcsid[] = "$Header$";
3*24305Ssklower #endif
4*24305Ssklower 
5*24305Ssklower #include "defs.h"
6*24305Ssklower 
7*24305Ssklower /*
8*24305Ssklower  * Address family support routines
9*24305Ssklower  */
10*24305Ssklower int	null_hash(), null_netmatch(), null_output(),
11*24305Ssklower 	null_portmatch(), null_portcheck(),
12*24305Ssklower 	null_checkhost(), null_ishost(), null_canon();
13*24305Ssklower int	xnnet_hash(), xnnet_netmatch(), xnnet_output(),
14*24305Ssklower 	xnnet_portmatch();
15*24305Ssklower 	xnnet_checkhost(), xnnet_ishost(), xnnet_canon();
16*24305Ssklower #define NIL \
17*24305Ssklower 	{ null_hash,		null_netmatch,		null_output, \
18*24305Ssklower 	  null_portmatch,	null_portcheck,		null_checkhost, \
19*24305Ssklower 	  null_ishost,		null_canon }
20*24305Ssklower #define	XNSNET \
21*24305Ssklower 	{ xnnet_hash,		xnnet_netmatch,		xnnet_output, \
22*24305Ssklower 	  xnnet_portmatch,	xnnet_portmatch,	xnnet_checkhost, \
23*24305Ssklower 	  xnnet_ishost,		xnnet_canon }
24*24305Ssklower 
25*24305Ssklower struct afswitch afswitch[AF_MAX] =
26*24305Ssklower 	{ NIL, NIL, NIL, NIL, NIL, NIL, XNSNET, NIL, NIL, NIL, NIL };
27*24305Ssklower 
28*24305Ssklower struct sockaddr_xn xnnet_default = { AF_XNS };
29*24305Ssklower 
30*24305Ssklower xnnet_hash(sxn, hp)
31*24305Ssklower 	register struct sockaddr_xn *sxn;
32*24305Ssklower 	struct afhash *hp;
33*24305Ssklower {
34*24305Ssklower 	hp->afh_nethash = xnnet(sxn->sxn_addr.xn_net);
35*24305Ssklower 	hp->afh_hosthash = *(int *)sxn->sxn_addr.xn_host;
36*24305Ssklower }
37*24305Ssklower 
38*24305Ssklower xnnet_netmatch(sxn1, sxn2)
39*24305Ssklower 	struct sockaddr_xn *sxn1, *sxn2;
40*24305Ssklower {
41*24305Ssklower 
42*24305Ssklower 	return (xnnet(sxn1->sxn_addr.xn_net) == xnnet(sxn2->sxn_addr.xn_net));
43*24305Ssklower }
44*24305Ssklower 
45*24305Ssklower /*
46*24305Ssklower  * Verify the message is from the right port.
47*24305Ssklower  */
48*24305Ssklower xnnet_portmatch(sxn)
49*24305Ssklower 	register struct sockaddr_xn *sxn;
50*24305Ssklower {
51*24305Ssklower 
52*24305Ssklower 	return (ntohs(sxn->sxn_addr.xn_socket) == IDPPORT_RIF );
53*24305Ssklower }
54*24305Ssklower 
55*24305Ssklower 
56*24305Ssklower /*
57*24305Ssklower  * xns output routine.
58*24305Ssklower  */
59*24305Ssklower #ifdef DEBUG
60*24305Ssklower int do_output = 0;
61*24305Ssklower #endif
62*24305Ssklower xnnet_output(s, flags, sxn, size)
63*24305Ssklower 	int s, flags;
64*24305Ssklower 	struct sockaddr_xn *sxn;
65*24305Ssklower 	int size;
66*24305Ssklower {
67*24305Ssklower 	struct sockaddr_xn dst;
68*24305Ssklower 
69*24305Ssklower 	dst = *sxn;
70*24305Ssklower 	sxn = &dst;
71*24305Ssklower 	if (sxn->sxn_addr.xn_socket == 0)
72*24305Ssklower 		sxn->sxn_addr.xn_socket = htons(IDPPORT_RIF);
73*24305Ssklower #ifdef DEBUG
74*24305Ssklower 	if(do_output || ntohs(msg->rip_cmd) == RIPCMD_REQUEST)
75*24305Ssklower #endif
76*24305Ssklower 	if (sendto(s, msg, size, flags, sxn, sizeof (*sxn)) < 0)
77*24305Ssklower 		perror("sendto");
78*24305Ssklower }
79*24305Ssklower 
80*24305Ssklower /*
81*24305Ssklower  * Return 1 if the address is believed
82*24305Ssklower  *  -- THIS IS A KLUDGE.
83*24305Ssklower  */
84*24305Ssklower xnnet_checkhost(sxn)
85*24305Ssklower 	struct sockaddr_xn *sxn;
86*24305Ssklower {
87*24305Ssklower 	return (1);
88*24305Ssklower }
89*24305Ssklower 
90*24305Ssklower /*
91*24305Ssklower  * Return 1 if the address is
92*24305Ssklower  * for a host, 0 for a network.
93*24305Ssklower  */
94*24305Ssklower xnnet_ishost(sxn)
95*24305Ssklower 	struct sockaddr_xn *sxn;
96*24305Ssklower {
97*24305Ssklower 	register int i;
98*24305Ssklower 
99*24305Ssklower 	for (i = 0; i < 6; i++)
100*24305Ssklower 		if (sxn->sxn_addr.xn_host[i] != 0) return (1);
101*24305Ssklower 	return (0);
102*24305Ssklower }
103*24305Ssklower 
104*24305Ssklower xnnet_canon(sxn)
105*24305Ssklower 	struct sockaddr_xn *sxn;
106*24305Ssklower {
107*24305Ssklower 
108*24305Ssklower 	sxn->sxn_addr.xn_socket = 0;
109*24305Ssklower }
110*24305Ssklower 
111*24305Ssklower /*ARGSUSED*/
112*24305Ssklower null_hash(addr, hp)
113*24305Ssklower 	struct sockaddr *addr;
114*24305Ssklower 	struct afhash *hp;
115*24305Ssklower {
116*24305Ssklower 
117*24305Ssklower 	hp->afh_nethash = hp->afh_hosthash = 0;
118*24305Ssklower }
119*24305Ssklower 
120*24305Ssklower /*ARGSUSED*/
121*24305Ssklower null_netmatch(a1, a2)
122*24305Ssklower 	struct sockaddr *a1, *a2;
123*24305Ssklower {
124*24305Ssklower 
125*24305Ssklower 	return (0);
126*24305Ssklower }
127*24305Ssklower 
128*24305Ssklower /*ARGSUSED*/
129*24305Ssklower null_output(s, f, a1, n)
130*24305Ssklower 	int s, f;
131*24305Ssklower 	struct sockaddr *a1;
132*24305Ssklower 	int n;
133*24305Ssklower {
134*24305Ssklower 
135*24305Ssklower 	;
136*24305Ssklower }
137*24305Ssklower 
138*24305Ssklower /*ARGSUSED*/
139*24305Ssklower null_portmatch(a1)
140*24305Ssklower 	struct sockaddr *a1;
141*24305Ssklower {
142*24305Ssklower 
143*24305Ssklower 	return (0);
144*24305Ssklower }
145*24305Ssklower 
146*24305Ssklower /*ARGSUSED*/
147*24305Ssklower null_portcheck(a1)
148*24305Ssklower 	struct sockaddr *a1;
149*24305Ssklower {
150*24305Ssklower 
151*24305Ssklower 	return (0);
152*24305Ssklower }
153*24305Ssklower 
154*24305Ssklower /*ARGSUSED*/
155*24305Ssklower null_ishost(a1)
156*24305Ssklower 	struct sockaddr *a1;
157*24305Ssklower {
158*24305Ssklower 
159*24305Ssklower 	return (0);
160*24305Ssklower }
161*24305Ssklower 
162*24305Ssklower /*ARGSUSED*/
163*24305Ssklower null_checkhost(a1)
164*24305Ssklower 	struct sockaddr *a1;
165*24305Ssklower {
166*24305Ssklower 
167*24305Ssklower 	return (0);
168*24305Ssklower }
169*24305Ssklower 
170*24305Ssklower /*ARGSUSED*/
171*24305Ssklower null_canon(a1)
172*24305Ssklower 	struct sockaddr *a1;
173*24305Ssklower {
174*24305Ssklower 
175*24305Ssklower 	;
176*24305Ssklower }
177