|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: static char sccsid[] = "@(#)af.c 5.10 (Berkeley) 6/1/90";
22: #endif /* not lint */
23:
24: #include "defs.h"
25:
26: /*
27: * Address family support routines
28: */
29: int inet_hash(), inet_netmatch(), inet_output(),
30: inet_portmatch(), inet_portcheck(),
31: inet_checkhost(), inet_rtflags(), inet_sendroute(), inet_canon();
32: char *inet_format();
33:
34: #define NIL { 0 }
35: #define INET \
36: { inet_hash, inet_netmatch, inet_output, \
37: inet_portmatch, inet_portcheck, inet_checkhost, \
38: inet_rtflags, inet_sendroute, inet_canon, \
39: inet_format \
40: }
41:
42: struct afswitch afswitch[AF_MAX] = {
43: NIL, /* 0- unused */
44: NIL, /* 1- Unix domain, unused */
45: INET, /* Internet */
46: };
47:
48: int af_max = sizeof(afswitch) / sizeof(afswitch[0]);
49:
50: struct sockaddr_in inet_default = {
51: #ifdef RTM_ADD
52: sizeof (inet_default),
53: #endif
54: AF_INET, INADDR_ANY };
55:
56: inet_hash(sin, hp)
57: register struct sockaddr_in *sin;
58: struct afhash *hp;
59: {
60: register u_long n;
61:
62: n = inet_netof(sin->sin_addr);
63: if (n)
64: while ((n & 0xff) == 0)
65: n >>= 8;
66: hp->afh_nethash = n;
67: hp->afh_hosthash = ntohl(sin->sin_addr.s_addr);
68: hp->afh_hosthash &= 0x7fffffff;
69: }
70:
71: inet_netmatch(sin1, sin2)
72: struct sockaddr_in *sin1, *sin2;
73: {
74:
75: return (inet_netof(sin1->sin_addr) == inet_netof(sin2->sin_addr));
76: }
77:
78: /*
79: * Verify the message is from the right port.
80: */
81: inet_portmatch(sin)
82: register struct sockaddr_in *sin;
83: {
84:
85: return (sin->sin_port == sp->s_port);
86: }
87:
88: /*
89: * Verify the message is from a "trusted" port.
90: */
91: inet_portcheck(sin)
92: struct sockaddr_in *sin;
93: {
94:
95: return (ntohs(sin->sin_port) <= IPPORT_RESERVED);
96: }
97:
98: /*
99: * Internet output routine.
100: */
101: inet_output(s, flags, sin, size)
102: int s, flags;
103: struct sockaddr_in *sin;
104: int size;
105: {
106: struct sockaddr_in dst;
107:
108: dst = *sin;
109: sin = &dst;
110: if (sin->sin_port == 0)
111: sin->sin_port = sp->s_port;
112: if (sin->sin_len == 0)
113: sin->sin_len = sizeof (*sin);
114: if (sendto(s, packet, size, flags, sin, sizeof (*sin)) < 0)
115: perror("sendto");
116: }
117:
118: /*
119: * Return 1 if the address is believed
120: * for an Internet host -- THIS IS A KLUDGE.
121: */
122: inet_checkhost(sin)
123: struct sockaddr_in *sin;
124: {
125: u_long i = ntohl(sin->sin_addr.s_addr);
126:
127: #ifndef IN_EXPERIMENTAL
128: #define IN_EXPERIMENTAL(i) (((long) (i) & 0xe0000000) == 0xe0000000)
129: #endif
130:
131: if (IN_EXPERIMENTAL(i) || sin->sin_port != 0)
132: return (0);
133: if (i != 0 && (i & 0xff000000) == 0)
134: return (0);
135: for (i = 0; i < sizeof(sin->sin_zero)/sizeof(sin->sin_zero[0]); i++)
136: if (sin->sin_zero[i])
137: return (0);
138: return (1);
139: }
140:
141: inet_canon(sin)
142: struct sockaddr_in *sin;
143: {
144:
145: sin->sin_port = 0;
146: sin->sin_len = sizeof(*sin);
147: }
148:
149: char *
150: inet_format(sin)
151: struct sockaddr_in *sin;
152: {
153: char *inet_ntoa();
154:
155: return (inet_ntoa(sin->sin_addr));
156: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.