/* * Copyright (c) 1983 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ #if defined(DOSCCS) && !defined(lint) static char sccsid[] = "@(#)af.c 5.4.1 (2.11BSD GTE) 1/1/94"; #endif #include "defs.h" /* * Address family support routines */ int inet_hash(), inet_netmatch(), inet_output(), inet_portmatch(), inet_portcheck(), inet_checkhost(), inet_rtflags(), inet_sendsubnet(), inet_canon(); char *inet_format(); #define NIL { 0 } #define INET \ { inet_hash, inet_netmatch, inet_output, \ inet_portmatch, inet_portcheck, inet_checkhost, \ inet_rtflags, inet_sendsubnet, inet_canon, \ inet_format \ } struct afswitch afswitch[AF_MAX] = { NIL, /* 0- unused */ NIL, /* 1- Unix domain, unused */ INET, /* Internet */ }; int af_max = sizeof(afswitch) / sizeof(afswitch[0]); struct sockaddr_in inet_default = { AF_INET, INADDR_ANY }; inet_hash(sin, hp) register struct sockaddr_in *sin; struct afhash *hp; { u_long n; n = inet_netof(sin->sin_addr); if (n) while ((n & 0xff) == 0) { n >>= 8; } hp->afh_nethash = n; hp->afh_hosthash = ntohl(sin->sin_addr.s_addr); #ifdef pdp11 hp->afh_hosthash &= 0x7fff; #else hp->afh_hosthash &= 0x7fffffff; #endif } 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. */ inet_portmatch(sin) register struct sockaddr_in *sin; { return (sin->sin_port == sp->s_port); } /* * Verify the message is from a "trusted" port. */ inet_portcheck(sin) struct sockaddr_in *sin; { return (ntohs(sin->sin_port) <= IPPORT_RESERVED); } /* * Internet output routine. */ inet_output(s, flags, sin, size) int s, flags; struct sockaddr_in *sin; int size; { struct sockaddr_in dst; dst = *sin; sin = &dst; if (sin->sin_port == 0) sin->sin_port = sp->s_port; if (sendto(s, packet, size, flags, sin, sizeof (*sin)) < 0) perror("sendto"); } /* * Return 1 if the address is believed * for an Internet host -- THIS IS A KLUDGE. */ inet_checkhost(sin) struct sockaddr_in *sin; { u_long n = ntohl(sin->sin_addr.s_addr); int i; #ifdef IN_BADCLASS #undef IN_BADCLASS #endif IN_BADCLASS #define IN_BADCLASS(n) (((long) (n) & 0xe0000000) == 0xe0000000) if (IN_BADCLASS(n) || sin->sin_port != 0) return (0); if (n != 0 && (n & 0xff000000) == 0) return (0); for (i = 0; i < sizeof(sin->sin_zero)/sizeof(sin->sin_zero[0]); i++) if (sin->sin_zero[i]) return (0); return (1); } inet_canon(sin) struct sockaddr_in *sin; { sin->sin_port = 0; } char * inet_format(sin) struct sockaddr_in *sin; { char *inet_ntoa(); return (inet_ntoa(sin->sin_addr)); }