* Copyright (c) 1983 Regents of the University of California.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
static char sccsid
[] = "@(#)af.c 5.11 (Berkeley) 2/28/91";
* Address family support routines
int inet_hash(), inet_netmatch(), inet_output(),
inet_portmatch(), inet_portcheck(),
inet_checkhost(), inet_rtflags(), inet_sendroute(), inet_canon();
{ inet_hash, inet_netmatch, inet_output, \
inet_portmatch, inet_portcheck, inet_checkhost, \
inet_rtflags, inet_sendroute, inet_canon, \
struct afswitch afswitch
[AF_MAX
] = {
NIL
, /* 1- Unix domain, unused */
int af_max
= sizeof(afswitch
) / sizeof(afswitch
[0]);
struct sockaddr_in inet_default
= {
register struct sockaddr_in
*sin
;
n
= inet_netof(sin
->sin_addr
);
hp
->afh_hosthash
= ntohl(sin
->sin_addr
.s_addr
);
hp
->afh_hosthash
&= 0x7fffffff;
inet_netmatch(sin1
, sin2
)
struct sockaddr_in
*sin1
, *sin2
;
return (inet_netof(sin1
->sin_addr
) == inet_netof(sin2
->sin_addr
));
* Verify the message is from the right port.
register struct sockaddr_in
*sin
;
return (sin
->sin_port
== sp
->s_port
);
* Verify the message is from a "trusted" port.
return (ntohs(sin
->sin_port
) <= IPPORT_RESERVED
);
* Internet output routine.
inet_output(s
, flags
, sin
, size
)
sin
->sin_port
= sp
->s_port
;
sin
->sin_len
= sizeof (*sin
);
if (sendto(s
, packet
, size
, flags
,
(struct sockaddr
*)sin
, sizeof (*sin
)) < 0)
* Return 1 if the address is believed
* for an Internet host -- THIS IS A KLUDGE.
u_long i
= ntohl(sin
->sin_addr
.s_addr
);
#define IN_EXPERIMENTAL(i) (((long) (i) & 0xe0000000) == 0xe0000000)
if (IN_EXPERIMENTAL(i
) || sin
->sin_port
!= 0)
if (i
!= 0 && (i
& 0xff000000) == 0)
for (i
= 0; i
< sizeof(sin
->sin_zero
)/sizeof(sin
->sin_zero
[0]); i
++)
sin
->sin_len
= sizeof(*sin
);
return (inet_ntoa(sin
->sin_addr
));