static char sccsid
[] = "@(#)af.c 4.5 %G%";
extern char packet
[MAXPACKETSIZE
], *sys_errlist
[];
#define tprintf if (trace) printf
* Address family support routines
int null_hash(), null_netmatch(), null_output(),
null_portmatch(), null_portcheck(),
null_checkhost(), null_canon();
int inet_hash(), inet_netmatch(), inet_output(),
inet_portmatch(), inet_portcheck(),
inet_checkhost(), inet_canon();
{ null_hash, null_netmatch, null_output, \
null_portmatch, null_portcheck, null_checkhost, \
{ inet_hash, inet_netmatch, inet_output, \
inet_portmatch, inet_portcheck, inet_checkhost, \
struct afswitch afswitch
[AF_MAX
] =
{ NIL
, NIL
, INET
, INET
, NIL
, NIL
, NIL
, NIL
, NIL
, NIL
, NIL
};
register struct sockaddr_in
*sin
;
hp
->afh_nethash
= sin
->sin_addr
.s_net
;
hp
->afh_hosthash
= sin
->sin_addr
.s_addr
;
hp
->afh_hosthash
= ntohl(hp
->afh_hosthash
);
hp
->afh_hosthash
&= 0x7fffffff;
inet_netmatch(sin1
, sin2
)
struct sockaddr_in
*sin1
, *sin2
;
return (sin1
->sin_addr
.s_net
== sin2
->sin_addr
.s_net
);
* Verify the message is from the right port.
int port
= sin
->sin_port
;
return (port
== IPPORT_ROUTESERVER
|| port
== IPPORT_ROUTESERVER
+1);
* Verify the message is from a "trusted" port.
int port
= sin
->sin_port
;
return (port
<= IPPORT_RESERVED
);
* Internet output routine.
inet_output(s
, sin
, size
)
if (sin
->sin_port
== 0) {
sin
->sin_port
= IPPORT_ROUTESERVER
;
sin
->sin_port
= htons(sin
->sin_port
);
if (send(s
, sin
, packet
, size
) < 0)
tprintf("send to %x: %s\n", sin
->sin_addr
, sys_errlist
[errno
]);
* Return 1 if the address is for an Internet host,
* otherwise assume it's a network address (broadcast).
extern struct in_addr
if_makeaddr();
netaddr
= if_makeaddr((int)sin
->sin_addr
.s_net
, INADDR_ANY
);
return (netaddr
.s_addr
!= sin
->sin_addr
.s_addr
);
hp
->afh_nethash
= hp
->afh_hosthash
= 0;
struct sockaddr
*a1
, *a2
;