12#include "wvautoconf.h"
18# include <sys/types.h>
29# include <sys/socket.h>
31#if HAVE_NET_ETHERNET_H
32# include <net/ethernet.h>
37#if HAVE_NETINET_IF_ETHER_H
38# include <netinet/if_ether.h>
41# include <netinet/in.h>
46#define ETHER_ADDR_LEN 6
50typedef unsigned int uint32_t;
51typedef unsigned short uint16_t;
56static const char * type_wvaddr =
"WvAddr";
57static const char * type_wvipaddr =
"WvIPAddr";
58static const char * type_wvipnet =
"WvIPNet";
59static const char * type_wvipportaddr =
"WvIPPortAddr";
61#define WVADDR type_wvaddr
62#define WVIPADDR type_wvipaddr
63#define WVIPNET type_wvipnet
64#define WVIPPORTADDR type_wvipportaddr
74 static const char strings[][20];
100 WvEncap(CapType _cap = Unknown)
105 operator CapType ()
const
109 {
return strings[cap]; }
121 virtual WvString printable()
const = 0;
125 virtual ~WvAddr() {};
126 static WvAddr *gen(
struct sockaddr *addr);
128 virtual WvEncap encap()
const = 0;
130 {
return printable(); }
132 virtual bool comparator(
const WvAddr *a2,
bool first_pass =
true)
const;
134 virtual const char *type()
const
137 virtual bool isbroadcast()
const;
139 virtual struct sockaddr *sockaddr()
const = 0;
140 virtual size_t sockaddr_len()
const = 0;
141 virtual const unsigned char *rawdata()
const;
142 virtual size_t rawdata_len()
const;
144 virtual unsigned WvHash()
const;
146 bool operator== (
const WvAddr &a2)
const
147 {
return comparator(&a2); }
148 bool operator!= (
const WvAddr &a2)
const
149 {
return ! (*
this == a2); }
154unsigned WvHash(
const WvAddr &addr);
161class WvStringAddr :
public WvAddr
170 WvStringAddr(WvStringParm s,
const WvEncap &_cap);
171 WvStringAddr(
const struct sockaddr *_addr);
172 virtual ~WvStringAddr();
174 virtual struct sockaddr *sockaddr()
const;
175 virtual size_t sockaddr_len()
const;
176 virtual const unsigned char *rawdata()
const;
177 virtual size_t rawdata_len()
const;
186class WvEtherAddr :
public WvAddr
188 unsigned char binaddr[ETHER_ADDR_LEN];
194 WvEtherAddr(
const unsigned char _binaddr[ETHER_ADDR_LEN] = NULL)
195 {
if (_binaddr) memcpy(binaddr, _binaddr, ETHER_ADDR_LEN); }
196 WvEtherAddr(
const char string[])
197 { string_init(
string); }
198 WvEtherAddr(WvStringParm
string)
199 { string_init(
string); }
200 void string_init(
const char string[]);
201 WvEtherAddr(
const struct sockaddr *addr)
202 { memcpy(binaddr, (
void *)addr->sa_data, ETHER_ADDR_LEN); }
203 virtual ~WvEtherAddr();
206 virtual bool isbroadcast()
const;
207 virtual struct sockaddr *sockaddr()
const;
208 virtual size_t sockaddr_len()
const;
209 virtual const unsigned char *rawdata()
const;
210 virtual size_t rawdata_len()
const;
215class WvARCnetAddr :
public WvAddr
217 unsigned char binaddr;
223 WvARCnetAddr(
const unsigned char _binaddr[1] = NULL)
224 {
if (_binaddr) binaddr = _binaddr[0]; }
225 WvARCnetAddr(
const char string[])
226 { binaddr = strtoul(
string, NULL, 16); }
227 WvARCnetAddr(WvStringParm
string)
228 { binaddr = strtoul(
string, NULL, 16); }
229 WvARCnetAddr(
const struct sockaddr *addr)
230 { binaddr = ((
unsigned char *)addr->sa_data)[0]; }
231 virtual ~WvARCnetAddr();
234 virtual struct sockaddr *sockaddr()
const;
235 virtual size_t sockaddr_len()
const;
236 virtual const unsigned char *rawdata()
const;
237 virtual size_t rawdata_len()
const;
249class WvIPAddr :
public WvAddr
254 unsigned char binaddr[4];
256 WvIPAddr(
const unsigned char *_binaddr)
257 {
if (_binaddr) memcpy(binaddr, _binaddr, 4); }
258 WvIPAddr(
const uint32_t _binaddr = 0)
259 { memcpy(binaddr, &_binaddr, 4); }
260 WvIPAddr(
const char string[])
261 { string_init(
string); }
262 WvIPAddr(WvStringParm
string)
263 { string_init(
string); }
264 void string_init(
const char string[]);
265 WvIPAddr(
const struct sockaddr *addr)
267 (
void *)&((
struct sockaddr_in *)addr)->sin_addr.s_addr, 4); }
268 WvIPAddr(
const WvIPAddr &_addr)
269 { memcpy(binaddr, _addr.binaddr, 4); }
272 virtual bool comparator(
const WvAddr *a2,
bool first_pass =
true)
const;
273 virtual const char *type()
const
274 {
return WVIPADDR; };
276 WvIPAddr operator& (
const WvIPAddr &a2)
const;
277 WvIPAddr operator| (
const WvIPAddr &a2)
const;
278 WvIPAddr operator^ (
const WvIPAddr &a2)
const;
279 WvIPAddr operator~ ()
const;
280 WvIPAddr operator+ (
int n)
const;
281 WvIPAddr operator- (
int n)
const;
283 uint32_t addr()
const
284 {
return *(uint32_t *)binaddr; }
287 {
return addr() == 0; }
291 virtual struct sockaddr *sockaddr()
const;
292 virtual size_t sockaddr_len()
const;
293 virtual const unsigned char *rawdata()
const;
294 virtual size_t rawdata_len()
const;
312class WvIPNet :
public WvIPAddr
320 WvIPNet(
const char string[]) : WvIPAddr(
string)
321 { string_init(
string); }
322 WvIPNet(WvStringParm
string) : WvIPAddr(
string)
323 { string_init(
string); }
324 void string_init(
const char string[]);
325 WvIPNet(
const WvIPAddr &
base,
const WvIPAddr &_mask);
327 virtual bool comparator(
const WvAddr *a2,
bool first_pass =
true)
const;
328 virtual const char *type()
const
344 virtual unsigned WvHash()
const;
351 WvIPAddr network()
const
352 {
return *
this & mask; }
353 WvIPAddr broadcast()
const
354 {
return *
this | ~mask; }
357 void include(
const WvIPNet &addr);
360 bool includes(
const WvIPNet &addr)
const;
377 {
return mask.binaddr[0] == 0; }
381 {
return mask.binaddr[3] == 255; }
393class WvIPPortAddr :
public WvIPAddr
402 WvIPPortAddr(
const unsigned char _ipaddr[4], uint16_t _port = 0)
403 : WvIPAddr(_ipaddr), port(_port) { };
404 WvIPPortAddr(
const WvIPAddr &_ipaddr, uint16_t _port = 0);
405 WvIPPortAddr(
const char string[]) : WvIPAddr(
string)
406 { string_init(
string); }
407 WvIPPortAddr(WvStringParm
string) : WvIPAddr(
string)
408 { string_init(
string); }
409 void string_init(
const char string[]);
410 WvIPPortAddr(uint16_t _port);
411 WvIPPortAddr(
const char string[], uint16_t _port);
413 WvIPPortAddr(
struct sockaddr_in *sin) : WvIPAddr(sin->sin_addr.s_addr)
414 { port = ntohs(sin->sin_port); }
415 virtual ~WvIPPortAddr();
417 virtual bool comparator(
const WvAddr *a2,
bool first_pass =
true)
const;
418 virtual const char *type()
const
419 {
return WVIPPORTADDR; };
421 virtual struct sockaddr *sockaddr()
const;
424 virtual unsigned WvHash()
const;
429class WvUnixAddr :
public WvAddr
436 WvUnixAddr(
const char *_sockname);
437 WvUnixAddr(WvStringParm _sockname);
438 WvUnixAddr(
const WvUnixAddr &_addr);
439 virtual ~WvUnixAddr();
443 virtual struct sockaddr *sockaddr()
const;
444 virtual size_t sockaddr_len()
const;
445 virtual const unsigned char *rawdata()
const;
446 virtual size_t rawdata_len()
const;
Base class for different address types, each of which will have the ability to convert itself to/from...
Common packet encapsulation types, with the ability to convert a Linux ARPHRD_* value or (struct sock...
An IP address is made up of a "dotted quad" – four decimal numbers in the form www....
bool includes(const WvIPNet &addr) const
determine whether the given address is already included in this net
void include(const WvIPNet &addr)
adjust the netmask so that 'addr' would be included in this network
WvIPNet()
construct an empty IPNet for later copying (probably by operator=)
int bits() const
weird netmasks such as 255.0.255.0 (easy example) are almost never used – they have '0' bits in the m...
virtual unsigned WvHash() const
Override the hash and comparison functions.
WvIPAddr base() const
Get the 'base IP address' component, netmask, network, and broadcast.
bool is_default() const
is this net the default gateway?
bool is_host() const
is it a plain host?
WvString is an implementation of a simple and efficient printable-string class.