#ifndef lint static char sccsid[] = "@(#)af.c 4.10 1/11/83"; #endif #include "defs.h" /* * Address family support routines */ int null_hash(), null_netmatch(), null_output(), null_portmatch(), null_portcheck(), null_checkhost(), null_canon(); int inet_hash(), inet_netmatch(), inet_output(), inet_portmatch(), inet_portcheck(), inet_checkhost(), inet_canon(); #define NIL \ { null_hash, null_netmatch, null_output, \ null_portmatch, null_portcheck, null_checkhost, \ null_canon } #define INET \ { inet_hash, inet_netmatch, inet_output, \ inet_portmatch, inet_portcheck, inet_checkhost, \ inet_canon } struct afswitch afswitch[AF_MAX] = { NIL, NIL, INET, INET, NIL, NIL, NIL, NIL, NIL, NIL, NIL }; inet_hash(sin, hp) register struct sockaddr_in *sin; struct afhash *hp; { hp->afh_nethash = 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. */ inet_portmatch(sin) register struct sockaddr_in *sin; { #ifdef COMPAT if (ntohs(sin->sin_port) == ntohs(sp->s_port) + 1) return (1); #endif 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; { return (inet_lnaof(sin->sin_addr) != 0); } inet_canon(sin) struct sockaddr_in *sin; { sin->sin_port = 0; } /*ARGSUSED*/ null_hash(addr, hp) struct sockaddr *addr; struct afhash *hp; { hp->afh_nethash = hp->afh_hosthash = 0; } /*ARGSUSED*/ null_netmatch(a1, a2) struct sockaddr *a1, *a2; { return (0); } /*ARGSUSED*/ null_output(s, f, a1, n) int s, f; struct sockaddr *a1; int n; { ; } /*ARGSUSED*/ null_portmatch(a1) struct sockaddr *a1; { return (0); } /*ARGSUSED*/ null_portcheck(a1) struct sockaddr *a1; { return (0); } /*ARGSUSED*/ null_checkhost(a1) struct sockaddr *a1; { return (0); } /*ARGSUSED*/ null_canon(a1) struct sockaddr *a1; { ; }