+ register u_long i = ntohl(in.s_addr);
+ register u_long net, host, subhost;
+ register struct ifnet *ifp;
+
+ if (IN_CLASSA(i)) {
+ if (IN_SUBNETA(i)) {
+ net = (i & IN_CLASSA_NET) >> IN_CLASSA_NSHIFT;
+ host = i & IN_CLASSA_HOST;
+ subhost = i & IN_CLASSA_SUBHOST;
+ /* Fall through and check whether a subnet */
+ } else
+ return (i & IN_CLASSA_HOST);
+ } else if (IN_CLASSB(i)) {
+ if (IN_SUBNETB(i)) {
+ net = (i & IN_CLASSB_NET) >> IN_CLASSB_NSHIFT;
+ host = i & IN_CLASSB_HOST;
+ subhost = i & IN_CLASSB_SUBHOST;
+ /* Fall through and check whether a subnet */
+ } else
+ return (i & IN_CLASSB_HOST);
+ } else {
+ return (i & IN_CLASSC_HOST);
+ }
+
+ /*
+ * Check whether network is a subnet of a `local' network;
+ * if so, use the modified interpretation of `host'.
+ */
+ for (ifp = ifnet; ifp; ifp = ifp->if_next) {
+ if (ifp->if_addr.sa_family != AF_INET)
+ continue;
+ if (ifp->if_flags & IFF_LOCAL) {
+ if (ifp->if_net == net)
+ return (subhost);
+ if ((ifp->if_net >> SUBNETSHIFT) == net)
+ return (subhost);
+ }
+ }
+ return (host);
+}
+
+/*
+ * Return 1 if an internet address is for a ``local'' host.
+ */
+in_localaddr(in)
+ struct in_addr in;
+{
+ register u_long i = ntohl(in.s_addr);
+ register u_long net;
+ register struct ifnet *ifp;