1*21994Sdist /* 2*21994Sdist * Copyright (c) 1983 Regents of the University of California. 3*21994Sdist * All rights reserved. The Berkeley software License Agreement 4*21994Sdist * specifies the terms and conditions for redistribution. 5*21994Sdist */ 6*21994Sdist 716395Skarels #ifndef lint 8*21994Sdist static char sccsid[] = "@(#)inet.c 5.1 (Berkeley) 06/04/85"; 9*21994Sdist #endif not lint 10*21994Sdist 1116395Skarels /* 1216395Skarels * Temporarily, copy these routines from the kernel, 1316395Skarels * as we need to know about subnets. 1416395Skarels */ 1516395Skarels #include "defs.h" 1616395Skarels 1721846Skarels extern struct interface *ifnet; 1821846Skarels 1916395Skarels /* 2021846Skarels * Formulate an Internet address from network + host. 2116395Skarels */ 2216395Skarels struct in_addr 2321846Skarels inet_makeaddr(net, host) 2421846Skarels u_long net, host; 2516395Skarels { 2621846Skarels register struct interface *ifp; 2721846Skarels register u_long mask; 2816395Skarels u_long addr; 2916395Skarels 3021846Skarels if (IN_CLASSA(net)) 3121846Skarels mask = IN_CLASSA_HOST; 3221846Skarels else if (IN_CLASSB(net)) 3321846Skarels mask = IN_CLASSB_HOST; 3416395Skarels else 3521846Skarels mask = IN_CLASSC_HOST; 3621846Skarels for (ifp = ifnet; ifp; ifp = ifp->int_next) 3721846Skarels if ((ifp->int_netmask & net) == ifp->int_net) { 3821846Skarels mask = ~ifp->int_subnetmask; 3921846Skarels break; 4021846Skarels } 4121846Skarels addr = net | (host & mask); 4216395Skarels addr = htonl(addr); 4316395Skarels return (*(struct in_addr *)&addr); 4416395Skarels } 4516395Skarels 4616395Skarels /* 4716395Skarels * Return the network number from an internet address. 4816395Skarels */ 4916395Skarels inet_netof(in) 5016395Skarels struct in_addr in; 5116395Skarels { 5216395Skarels register u_long i = ntohl(in.s_addr); 5321846Skarels register u_long net; 5416429Skarels register struct interface *ifp; 5516395Skarels 5621846Skarels if (IN_CLASSA(i)) 5721846Skarels net = i & IN_CLASSA_NET; 5821846Skarels else if (IN_CLASSB(i)) 5921846Skarels net = i & IN_CLASSB_NET; 6021846Skarels else 6121846Skarels net = i & IN_CLASSC_NET; 6216429Skarels 6316429Skarels /* 6421846Skarels * Check whether network is a subnet; 6516429Skarels * if so, return subnet number. 6616429Skarels */ 6721846Skarels for (ifp = ifnet; ifp; ifp = ifp->int_next) 6821846Skarels if ((ifp->int_netmask & net) == ifp->int_net) 6921846Skarels return (i & ifp->int_subnetmask); 7016429Skarels return (net); 7116395Skarels } 7216395Skarels 7316395Skarels /* 7416395Skarels * Return the host portion of an internet address. 7516395Skarels */ 7616395Skarels inet_lnaof(in) 7716395Skarels struct in_addr in; 7816395Skarels { 7916395Skarels register u_long i = ntohl(in.s_addr); 8021846Skarels register u_long net, host; 8116429Skarels register struct interface *ifp; 8216395Skarels 8316395Skarels if (IN_CLASSA(i)) { 8421846Skarels net = i & IN_CLASSA_NET; 8521846Skarels host = i & IN_CLASSA_HOST; 8616395Skarels } else if (IN_CLASSB(i)) { 8721846Skarels net = i & IN_CLASSB_NET; 8821846Skarels host = i & IN_CLASSB_HOST; 8916395Skarels } else { 9021846Skarels net = i & IN_CLASSC_NET; 9121846Skarels host = i & IN_CLASSC_HOST; 9216395Skarels } 9316395Skarels 9416429Skarels /* 9521846Skarels * Check whether network is a subnet; 9616429Skarels * if so, use the modified interpretation of `host'. 9716429Skarels */ 9821846Skarels for (ifp = ifnet; ifp; ifp = ifp->int_next) 9921846Skarels if ((ifp->int_netmask & net) == ifp->int_net) 10021846Skarels return (host &~ ifp->int_subnetmask); 10116429Skarels return (host); 10216395Skarels } 103