47 #include <sys/param.h>
48 #include <netinet/in.h>
49 #include <arpa/inet.h>
52 #define IN_CLASSD_NET 0xf0000000
53 #define IN_CLASSD_NSHIFT 28
78 #define MASK_STYLE_CLASS (1 << 0)
79 #define MASK_STYLE_SUBNET (1 << 1)
80 #define MASK_STYLE_HOST (1 << 2)
91 static const char *mynetworks_core(
const char *style)
93 const char *myname =
"mynetworks_core";
101 struct sockaddr_storage *sa;
102 struct sockaddr_storage *ma;
103 int net_mask_count = 0;
116 "all network protocols are disabled",
120 mask_style =
name_mask(
"mynetworks mask style", mask_styles, style);
129 for (i = 0, junk = mask_style; junk != 0; junk >>= 1U)
132 msg_fatal(
"bad %s value: %s; specify exactly one value",
139 for (sa = my_addr_list->
addrs, ma = my_mask_list->
addrs;
140 sa < my_addr_list->addrs + my_addr_list->
used;
150 switch (mask_style) {
157 if (IN_CLASSA(addr)) {
158 mask = IN_CLASSA_NET;
159 shift = IN_CLASSA_NSHIFT;
160 }
else if (IN_CLASSB(addr)) {
161 mask = IN_CLASSB_NET;
162 shift = IN_CLASSB_NSHIFT;
163 }
else if (IN_CLASSC(addr)) {
164 mask = IN_CLASSC_NET;
165 shift = IN_CLASSC_NSHIFT;
166 }
else if (IN_CLASSD(addr)) {
170 msg_fatal(
"%s: unknown address class: %s",
194 msg_panic(
"unknown mynetworks mask style: %s",
197 net.s_addr = htonl(addr & mask);
209 struct sockaddr_in6 net6;
211 switch (mask_style) {
225 ac = (
unsigned char *) &SOCK_ADDR_IN6_ADDR(ma);
226 end = ac +
sizeof(SOCK_ADDR_IN6_ADDR(ma));
229 if ((ch = *ac++) == (
unsigned char) ~0U) {
248 msg_panic(
"unknown mynetworks mask style: %s",
252 net6 = *SOCK_ADDR_IN6_PTR(sa);
253 mask_addr((
unsigned char *) &net6.sin6_addr,
254 sizeof(net6.sin6_addr),
265 msg_warn(
"%s: skipping unknown address family %d",
278 if (net_mask_count > 1) {
282 for (cpp = argv->
argv; cpp < argv->argv + argv->
argc; cpp++)
297 static const char *result;
308 static const char *result;
321 int main(
int argc,
char **argv)
326 msg_fatal(
"usage: %s protocols mask_style interface_list (e.g. \"all subnet all\")",
330 var_mynetworks_style = argv[2];
331 var_inet_interfaces = argv[3];
#define MYNETWORKS_STYLE_SUBNET
void mask_addr(unsigned char *addr_bytes, unsigned addr_byte_count, unsigned network_bits)
char * mystrdup(const char *str)
void been_here_free(BH_TABLE *dup_filter)
ARGV * argv_free(ARGV *argvp)
NORETURN msg_panic(const char *fmt,...)
#define inet_proto_info()
int main(int argc, char **argv)
INET_PROTO_INFO * inet_proto_init(const char *context, const char *protocols)
struct sockaddr_storage * addrs
#define SOCKADDR_TO_HOSTADDR(sa, salen, host, port, sock)
BH_TABLE * been_here_init(int limit, int flags)
const char * mynetworks(void)
const char * mynetworks_host(void)
char buf[MAI_HOSTADDR_STRSIZE]
VSTRING * vstring_sprintf_append(VSTRING *vp, const char *format,...)
#define VSTRING_RESET(vp)
#define SOCK_ADDR_PTR(ptr)
INET_ADDR_LIST * own_inet_mask_list(void)
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
#define name_mask(tag, table, str)
NORETURN msg_fatal(const char *fmt,...)
ARGV * argv_split(const char *, const char *)
int been_here_fixed(BH_TABLE *dup_filter, const char *string)
INET_ADDR_LIST * own_inet_addr_list(void)
#define VAR_MYNETWORKS_STYLE
#define MYNETWORKS_STYLE_HOST
#define SOCK_ADDR_LEN(sa)
#define SOCK_ADDR_FAMILY(ptr)
#define MASK_STYLE_SUBNET
#define MYNETWORKS_STYLE_CLASS
#define SOCK_ADDR_IN_ADDR(sa)
char * var_inet_interfaces
char * var_mynetworks_style
char * vstring_export(VSTRING *vp)
void msg_info(const char *fmt,...)