+/*
+ * This routine will go away soon.
+ * Tries to guess which netmask is appropriate for a given net.
+ */
+static struct sockaddr_in rtgmask = { 8, 0 };
+
+char *
+rtgetmask(sa, ifa)
+register struct sockaddr *sa;
+register struct ifaddr *ifa;
+{
+ u_long i, net, mask, subnet;
+
+ switch (sa->sa_family) {
+#ifdef INET
+ register struct in_ifaddr *ia;
+
+ case AF_INET:
+
+ i = ntohl(((struct sockaddr_in *)sa)->sin_addr.s_addr);
+ if (i == 0) {
+ rtgmask.sin_addr.s_addr = 0;
+ return ((char *)&rtgmask);
+ } else if (IN_CLASSA(i)) {
+ net = i & IN_CLASSA_NET;
+ mask = IN_CLASSA_NET;
+ } else if (IN_CLASSB(i)) {
+ net = i & IN_CLASSB_NET;
+ mask = IN_CLASSB_NET;
+ } else if (IN_CLASSC(i)) {
+ net = i & IN_CLASSC_NET;
+ mask = IN_CLASSC_NET;
+ } else {
+ net = i;
+ mask = 0xffffffff;
+ }
+
+ /*
+ * Check whether network is a subnet;
+ * if so, return subnet number.
+ */
+ for (ia = in_ifaddr; ia; ia = ia->ia_next)
+ if (net == ia->ia_net) {
+ ifa = &ia->ia_ifa;
+ break;
+ }
+ if (ia == 0) {
+ rtgmask.sin_addr.s_addr = ntohl(mask);
+ return ((char *)&rtgmask);
+ }
+#endif
+ }
+ return ((char *)ifa->ifa_netmask);
+}