Integrate new IP type from Tom Ivar Helbekkmo.

This commit is contained in:
Bruce Momjian 1998-10-03 05:41:01 +00:00
parent 607cd930d5
commit 2d69fd90b9
33 changed files with 3774 additions and 5868 deletions

View File

@ -31,10 +31,6 @@ int8 -
64-bit integer arithmetic for Postgres
by Thomas G. Lockhart <Thomas.Lockhart@jpl.nasa.gov>
ip_and_mac -
PostgreSQL type extensions for IP and MAC addresses
by Tom Ivar Helbekkmo <tih@Hamartun.Priv.NO>
isbn_issn -
PostgreSQL type extensions for ISBN (books) and ISSN (serials)
by Garrett A. Wollman <wollman@khavrinen.lcs.mit.edu>

View File

@ -1,27 +0,0 @@
#
# PostgreSQL types for IP and MAC addresses
#
# $Id: Makefile,v 1.5 1998/06/16 05:35:10 momjian Exp $
all: ip.so mac.so
ip.so: ip.o
ld -Bshareable -o ip.so ip.o
ip.o: ip.c
cc -g -O -fPIC -I/usr/local/pgsql/include -c ip.c
mac.so: mac.o
ld -Bshareable -o mac.so mac.o
mac.o: mac.c mac.h
cc -g -O -fPIC -I/usr/local/pgsql/include -c mac.c
install: ip.so mac.so
install -c ip.so mac.so /usr/local/pgsql/contrib/ip_and_macs
clean:
rm -f *.o *.so *.b
#
# eof
#

View File

@ -1,43 +0,0 @@
This directory contain 2 new classes - macaddr to store mac addresses
written by (Bergen, Norway, 1998-01-31, Tom Ivar Helbekkmo
(tih@Hamartun.Priv.NO)), and ipaddr type and ipaddr_ops operator class,
rewritten by me (alex@relcom.EU.net, Aleksei Roudnev, Moscow, Russia,
25.05.98) and written first by Bergen.
To see the description of macaddr type, read README.ORIG file. To see
the description of ipaddr type, read ipaddr.html file.
^^^^^^^^^^^
This ipaddr type differ slightly from the original one. First, if you
input '193.124.23.0' it sets /24 prefix instead of /32 (this is in
accordance to CISCO's notification and our internal data bases and
records); if you input '0.0.0.0' it's '0.0.0.0/0' (default) but not NULL
or NOADDR value.
Then, you can store ADDRESS/PREFIX pair, even if ADDRESS is not the
subnet address (for example, you can store interface address and mask at
the single attribute). This allow us to determine, for example, which
interfaces/routers are accessible by connected network for our interface
(select * from database where '193.124.23.4' @ interface_address);
Then, it have been written a few new functions and a few operators
(addr1 @ addr - TRUE if addr1 is the part of subnet addr2);
'ipaddr_print' function allow you to convert address to any form you
want; and so on.
And then, I add ipi.sql setup script and test1.sql + test2.sql test
scripts to allow and test indexing by this new class.
This ipaddr type/opclass are used for our internal IP ROUTING and
ACCOUNTING data base, and I hope it shpuld be usefull for more people.
For those who like crazy tasks, I propose to realise 'RTREE' indexing
method to allow effectively use '@' operation for the binding statistic
records to the customers etc networks. Note 'ipaddr' type can be written
as 'start,end' coordination pair and it's possible to define all '<<,
&<, @@, etc graphical operators over this type.
25.05.1998, Aleksei Roudnev, alex@relcom.EU.net, Relcom, Moscow, Russia. /+7-095-194-1995.
==========================================================================================

View File

@ -1,56 +0,0 @@
PostgreSQL type extensions for IP and MAC addresses.
---------------------------------------------------
$Id: README.ORIG,v 1.2 1998/06/16 05:35:10 momjian Exp $
I needed to record IP and MAC level ethernet addresses in a data
base, and I really didn't want to store them as plain strings, with
no enforced error checking, so I put together the accompanying code
as my first experiment with adding a data type to PostgreSQL. I
then thought that this might be useful to others, both directly and
as a very simple example of how to do this sort of thing, so here
it is, in the hope that it will be useful.
IP addresses are implemented as a 6 byte struct (this may be 1 byte
more than is useful, but I figured that since it has to be at least 5,
it might as well be an even number of bytes) that contains the four
byte address and a mask width. The external representation of an IP
address looks like '158.37.96.15/32' (or just '158.37.96.15', which is
understood to mean the same thing). This address happens to be part
of a subnet where I work; '158.37.96.0/24', which itself is a part of
the larger subnet allocated to our site, which is '158.37.96.0/21',
which again, if you go by the old book, is part of the class "B" net
called '158.37.0.0/16'.
Input and output functions are supplied, along with the "normal" <,
<=, =, >=, > and <> operators, which all do what you expect. In
addition, there is a function to check whether a given address is a
member of a given subnet: ipaddr_in_net(addr, net), and functions to
return the netmask and the broadcast address of a given network:
ipaddr_mask(net) and ipaddr_bcast(net).
MAC level ethernet addresses are implemented as a 6 byte struct that
contains the address as unsigned chars. Several input forms are
accepted; the following are all the same address: '08002b:010203',
'08002b-010203', '0800.2b01.0203', '08-00-2b-01-02-03' and
'08:00:2b:01:02:03'. Upper and lower case is accepted for the digits
'a' through 'f'. Output is always in the latter of the given forms.
As with IP addresses, input and output functions are supplied as well
as the "normal" operators, which do what you expect. As an extra
feature, a function macaddr_manuf() is defined, which returns the name
of the manufacturer as a string. This is currently held in a
hard-coded struct internal to the C module -- it might be smarter to
put this information into an actual data base table, and look up the
manufacturer there. (Another TODO, for both new data types, is to
interface them to indices. If anyone can explain this to me in a way
that is easier to understand than the current documentation, I would
be most grateful!)
I don't know what changes are needed to the Makefile for other systems
than the one I'm running (NetBSD 1.3), but anyway: to install on a BSD
system: fix the path names in the SQL files and the Makefile if you
need to, then make, make install, slurp the SQL files into psql or
whatever, and you're off. Enjoy!
Bergen, Norway, 1998-01-31, Tom Ivar Helbekkmo (tih@Hamartun.Priv.NO).

View File

@ -1,448 +0,0 @@
/*
* PostgreSQL type definitions for IP addresses.
*
* $Id: ip.c,v 1.5 1998/06/16 05:35:10 momjian Exp $
*/
#include <stdio.h>
#include <postgres.h>
#include <utils/palloc.h>
/*
* This is the internal storage format for IP addresses:
*/
typedef struct ipaddr
{
uint32 address;
int16 width;
} ipaddr;
/*
* Various forward declarations:
*/
ipaddr *ipaddr_in(char *str);
char *ipaddr_out(ipaddr * addr);
bool ipaddr_lt(ipaddr * a1, ipaddr * a2);
bool ipaddr_le(ipaddr * a1, ipaddr * a2);
bool ipaddr_eq(ipaddr * a1, ipaddr * a2);
bool ipaddr_ge(ipaddr * a1, ipaddr * a2);
bool ipaddr_gt(ipaddr * a1, ipaddr * a2);
bool ipaddr_ne(ipaddr * a1, ipaddr * a2);
int4 ipaddr_cmp(ipaddr * a1, ipaddr * a2);
bool ipaddr_in_net(ipaddr * a1, ipaddr * a2);
ipaddr *ipaddr_mask(ipaddr * a);
ipaddr *ipaddr_bcast(ipaddr * a);
/*
* Build a mask of a given width:
*/
unsigned long
build_mask(unsigned char bits)
{
unsigned long mask = 0;
int i;
for (i = 0; i < bits; i++)
mask = (mask >> 1) | 0x80000000;
return mask;
}
/*
* IP address reader. Note how the count returned by sscanf()
* is used to determine whether the mask size was specified.
*/
ipaddr *
ipaddr_in(char *str)
{
int a,
b,
c,
d,
w;
ipaddr *result;
int count;
if (strlen(str) > 0)
{
count = sscanf(str, "%d.%d.%d.%d/%d", &a, &b, &c, &d, &w);
if (count < 4)
{
elog(ERROR, "ipaddr_in: error in parsing \"%s\"", str);
return (NULL);
}
if ( count == 3 ) {
d = 0;
count = 4;
};
if (count == 4)
{
w = 32;
if ( a >= 192 && a < 224 && d == 0 ) w = 24;
if ( a >= 128 && a < 192 && d == 0 && c == 0 ) w = 16;
if ( a > 0 && a < 128 && c == 0 && b == 0 && a < 128 ) w = 8;
if ( a == 0 && b == 0 && c == 0 && d == 0 ) w = 0;
};
if ((a < 0) || (a > 255) || (b < 0) || (b > 255) ||
(c < 0) || (c > 255) || (d < 0) || (d > 255) ||
(w < 0) || (w > 32))
{
elog(ERROR, "ipaddr_in: illegal address \"%s\"", str);
return (NULL);
}
}
else
{
a = b = c = d = w = 255; /* special case for missing address */
}
result = (ipaddr *) palloc(sizeof(ipaddr));
result->address = (uint32) ((a << 24) | (b << 16) | (c << 8) | d);
result->width = w;
return (result);
}
/*
* IP address output function. Note mask size specification
* generated only for subnets, not for plain host addresses.
*/
char *
ipaddr_out(ipaddr * addr)
{
char *result;
int a, b, c, d, w;
if (addr == NULL)
return (NULL);
result = (char *) palloc(32);
w = addr->width;
a = (addr->address >> 24) & 0xff;
b = (addr->address >> 16) & 0xff;
c = (addr->address >> 8) & 0xff;
d = (addr->address >> 0) & 0xff;
/* Check by missing address (w > 32 ) */
if ( w >= 0 && w <= 32 )
{
/* In case of NATURAL network don't output the prefix */
if ( (a == 0 && b == 0 && c == 0 && d == 0 && w == 0 ) ||
(a < 128 && b == 0 && c == 0 && d == 0 && w == 8 ) ||
(a < 192 && c == 0 && d == 0 && w == 16 ) ||
(a < 224 && d == 0 && w == 24 ) ||
( d != 0 ) ) w = -1;
if (w == -1 )
sprintf(result, "%d.%d.%d.%d",a,b,c,d);
else
sprintf(result, "%d.%d.%d.%d/%d",a,b,c,d,w);
}
else
{
result[0] = 0; /* special case for missing address */
}
return (result);
}
/*
* Print ipaddr by format
* %A - address
* %M - maska
* %P - prefix
* %B - negated maska
*/
# define TXT_LEN_0 4
text *
ipaddr_print(ipaddr * addr, text *fmt)
{
text *result;
char *p, *op;
uint32 aaa;
int a, b, c, d;
if (addr == NULL)
return (NULL);
result = (text *) palloc( sizeof(text) + 64 );
/* Check by missing address (w > 32 ) */
for ( p = fmt->vl_dat, op = result->vl_dat; *p && (p - fmt->vl_dat) < (fmt->vl_len - TXT_LEN_0) && (op - result->vl_dat) < 48; p++) {
if ( *p != '%' ) {
*op++ = *p;
continue;
};
p++;
if ( *p == 'A' )
{
aaa = addr->address;
goto pta;
};
if ( *p == 'M' ) {
aaa = build_mask(addr->width);
goto pta;
}
if ( *p == 'B' ) {
aaa = build_mask(32 - addr->width) >> addr->width;
goto pta;
}
if ( *p == 'P' ) {
sprintf(op,"%d",addr->width);
while ( *op) op++;
continue;
};
*op++ = *p;
continue;
pta:
a = (aaa >> 24) & 0xff;
b = (aaa >> 16) & 0xff;
c = (aaa >> 8) & 0xff;
d = (aaa >> 0) & 0xff;
sprintf(op, "%d.%d.%d.%d",a,b,c,d);
while ( *op ) op++;
continue;
};
*op = 0;
result->vl_len = (op - result->vl_dat) + TXT_LEN_0;
return (result);
}
/*
* Boolean tests for magnitude.
*/
bool
ipaddr_lt(ipaddr * a1, ipaddr * a2)
{
if ( a1->address == a2->address ) return(a1->width < a2->width);
return (a1->address < a2->address);
};
bool
ipaddr_le(ipaddr * a1, ipaddr * a2)
{
if ( a1->address == a2->address ) return(a1->width <= a2->width);
return (a1->address <= a2->address);
};
bool
ipaddr_eq(ipaddr * a1, ipaddr * a2)
{
if ( a1->address == a2->address ) return(a1->width == a2->width);
return (a1->address == a2->address);
};
bool
ipaddr_ge(ipaddr * a1, ipaddr * a2)
{
if ( a1->address == a2->address ) return(a1->width >= a2->width);
return (a1->address >= a2->address);
};
bool
ipaddr_gt(ipaddr * a1, ipaddr * a2)
{
if ( a1->address == a2->address ) return(a1->width > a2->width);
return (a1->address > a2->address);
};
bool
ipaddr_ne(ipaddr * a1, ipaddr * a2)
{
if ( a1->address == a2->address ) return(a1->width != a2->width);
return (a1->address != a2->address);
};
/*
* Comparison function for sorting:
*/
int4
ipaddr_cmp(ipaddr * a1, ipaddr * a2)
{
if (a1->address < a2->address)
return -1;
else if (a1->address > a2->address)
return 1;
else
{
if (a1->width < a2->width)
return -1;
else if (a1->width > a2->width)
return 1;
}
return 0;
}
/*
* The number of hosts in the network
*/
int4
ipaddr_len(ipaddr * a)
{
if ( a->width > 32 || a->width < 0 ) return(0);
return(1 << (32 - a->width));
}
/*
* The number of network bits
*/
int4
ipaddr_pref(ipaddr * a)
{
if ( a->width > 32 || a->width < 0 ) return(0);
return(a->width);
}
/*
* The host addr as an integer
*/
int4
ipaddr_integer(ipaddr * a)
{
return(a->address);
}
/*
* Test whether an address is within a given subnet:
*/
bool
ipaddr_in_net(ipaddr * a1, ipaddr * a2)
{
uint32 maskbits;
if (a1->width < a2->width)
return FALSE;
if ((a1->width == 32) && (a2->width == 32))
return ipaddr_eq(a1, a2);
maskbits = build_mask(a2->width);
if ((a1->address & maskbits) == (a2->address & maskbits))
return TRUE;
return FALSE;
}
/*
* Test whether an address is the network or a host in the network:
*/
bool
ipaddr_is_net(ipaddr * a)
{
uint32 maskbits;
if (a->width == 32)
return FALSE;
maskbits = build_mask(a->width);
if ( (a->address & maskbits) == a->address )
return TRUE;
return FALSE;
}
/*
* Pick out just the mask of a network:
*/
ipaddr *
ipaddr_mask(ipaddr * a)
{
ipaddr *result;
result = (ipaddr *) palloc(sizeof(ipaddr));
result->address = build_mask(a->width);
result->width = 32;
return result;
}
/*
* Return the broadcast address of a network:
*/
ipaddr *
ipaddr_bcast(ipaddr * a)
{
ipaddr *result;
result = (ipaddr *) palloc(sizeof(ipaddr));
result->address = a->address;
result->address |= (build_mask(32 - a->width) >> a->width);
result->width = 32;
return result;
}
/*
* Return the base network of the address/network:
*/
ipaddr *
ipaddr_net(ipaddr * a)
{
ipaddr *result;
result = (ipaddr *) palloc(sizeof(ipaddr));
result->address = a->address;
result->address &= build_mask(a->width);
result->width = a->width;
return result;
}
/*
* Compose ipaddr from ADDR and PREFIX
*/
ipaddr *
ipaddr_compose(int4 addr, int4 pref)
{
ipaddr *result;
result = (ipaddr *) palloc(sizeof(ipaddr));
if ( pref < 0 || pref > 32 ) {
pref = 255;
addr = 0;
};
result->address = addr;
result->width = pref;
return result;
}
/*
* Plus and Minus operators
*/
ipaddr *
ipaddr_plus(ipaddr * a, int4 i)
{
ipaddr *result;
result = (ipaddr *) palloc(sizeof(ipaddr));
result->address = a->address + i;
result->width = a->width;
return result;
}
ipaddr *
ipaddr_minus(ipaddr * a, int4 i)
{
ipaddr *result;
result = (ipaddr *) palloc(sizeof(ipaddr));
result->address = a->address - i;
result->width = a->width;
return result;
}
/*
* eof
*/

View File

@ -1,301 +0,0 @@
--
-- PostgreSQL code for IP addresses.
--
-- $Id: ip.sql,v 1.5 1998/06/16 05:35:10 momjian Exp $
-- Invoced from 1998/02/14 17:58:04 scrappy
--
-- New - INPUT/OUTPUT, functions, indexing by btree, test.
-- PART # 1 - ip.sql - load new type, functions and operators.
-- Then you should execute ipi.sql - add ipaddr_ops class to allow indexing.
load '/usr/local/pgsql/contrib/ip_and_macs/ip.so';
--
-- Input and output functions and the type itself:
-- Note - we input 193.124.23.1 as /32, and 193.124.23.0 as /24.
-- We output /24 network withouth /24 suffix, and /32 hosts wothouth suffixes
-- if it is not '0' address of /24 network.
-- Just the same, we threat 0.0.0.0 as 0.0.0.0/0 == DEFAULT.
--
create function ipaddr_in(opaque)
returns opaque
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
create function ipaddr_out(opaque)
returns opaque
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
create type ipaddr (
internallength = 6,
externallength = variable,
input = ipaddr_in,
output = ipaddr_out
);
--
-- Print address by format
-- %A - address
-- %P - /Pref
-- %M - maska
-- %B - reversed maska
drop function ipaddr_print;
create function ipaddr_print(ipaddr, text)
returns text
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
);
--
-- The various boolean tests:
-- In case if addresseas are equal, we compare prefix length
-- It means 193.124.23.0/24 < 193.124.23.0/32
--
create function ipaddr_lt(ipaddr, ipaddr)
returns bool
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
create function ipaddr_le(ipaddr, ipaddr)
returns bool
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
create function ipaddr_eq(ipaddr, ipaddr)
returns bool
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
create function ipaddr_ge(ipaddr, ipaddr)
returns bool
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
create function ipaddr_gt(ipaddr, ipaddr)
returns bool
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
create function ipaddr_ne(ipaddr, ipaddr)
returns bool
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
--
-- Test if a1 is in net a2
-- Return TRUE if a1 is IN a2 subnet or if a1 == a2
--
create function ipaddr_in_net(ipaddr, ipaddr)
returns bool
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
--
-- Return the network from the host/network address. This means
-- 193.124.23.4/24 -> 193.124.23.0/24.
-- This allow to use interface address (with the real netmask) to create
-- network, and to link interfaces and addresses belongs to the same network.
--
create function ipaddr_net(ipaddr)
returns ipaddr
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
--
-- Return TRUE if addr describe NETWORK, not host in the network
-- It's equivalent to ipaddr_net(a) == a
--
create function ipaddr_is_net(ipaddr)
returns boolean
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
--
-- Return the number of the hosts in the network
--
create function ipaddr_len(ipaddr)
returns int4
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
--
-- Return the prefix length of the network
--
create function ipaddr_pref(ipaddr)
returns int4
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
--
-- Convert network into the integer.
-- Can be used for 'compose' function
--
create function ipaddr_integer(ipaddr)
returns int4
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
--
-- Compose ipaddr from the ADDRESS and PREF
-- ipaddr_compose(ipaddr_integer(a),ipaddr_pref(a)) == a
--
create function ipaddr_compose(int4,int4)
returns ipaddr
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
--
-- Return MASK for the network
--
create function ipaddr_mask(ipaddr)
returns ipaddr
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
--
-- Return BROADCAST address for the network
--
create function ipaddr_bcast(ipaddr)
returns ipaddr
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
--
-- Compare 2 addresses. First, compare addresses, then, compare prefixes (if the addresses
-- are the same).
--
create function ipaddr_cmp(ipaddr,ipaddr)
returns int4
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
--
-- Plus and Minus operators
--
create function ipaddr_plus(ipaddr,int4)
returns ipaddr
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
create function ipaddr_minus(ipaddr,int4)
returns ipaddr
as '/usr/local/pgsql/contrib/ip_and_macs/ip.so'
language 'c';
--
-- Now the operators. Note how some of the parameters to some
-- of the 'create operator' commands are commented out. This
-- is because they reference as yet undefined operators, and
-- will be implicitly defined when those are, further down.
--
-- drop operator < ( ipaddr, ipaddr);
create operator < (
leftarg = ipaddr,
rightarg = ipaddr,
-- negator = >=,
procedure = ipaddr_lt,
restrict = intltsel,
join = intltjoinsel
);
-- drop operator <= (ipaddr,ipaddr);
create operator <= (
leftarg = ipaddr,
rightarg = ipaddr,
-- negator = >,
procedure = ipaddr_le,
restrict = intltsel,
join = intltjoinsel
);
-- drop operator = (ipaddr,ipaddr);
create operator = (
leftarg = ipaddr,
rightarg = ipaddr,
commutator = =,
-- negator = <>,
restrict = eqsel,
join = eqjoinsel,
procedure = ipaddr_eq
);
-- drop operator >= (ipaddr,ipaddr);
create operator >= (
leftarg = ipaddr,
rightarg = ipaddr,
negator = <,
procedure = ipaddr_ge,
restrict = intgtsel,
join = intgtjoinsel
);
-- drop operator > (ipaddr,ipaddr);
create operator > (
leftarg = ipaddr,
rightarg = ipaddr,
negator = <=,
procedure = ipaddr_gt,
restrict = intgtsel,
join = intgtjoinsel
);
-- drop operator <> (ipaddr,ipaddr);
create operator <> (
leftarg = ipaddr,
rightarg = ipaddr,
negator = =,
procedure = ipaddr_ne,
restrict = neqsel,
join = neqjoinsel
);
create operator @ (
leftarg = ipaddr,
rightarg = ipaddr,
procedure = ipaddr_in_net
);
create operator + (
leftarg = ipaddr,
rightarg = int4,
procedure = ipaddr_plus
);
create operator - (
leftarg = ipaddr,
rightarg = int4,
procedure = ipaddr_minus
);
-- *****************************************************************************************
-- * For now, you have: input/output (remember, '193.124.23.0' means /24 network, *
-- * '193.124.23.1' means /32 host) *
-- * <, <=, = <>, >=, > relational operations; host @ net (host is the part of the net) op *
-- * varchar ipaddr_print(addr, '%A/%P %M %B') - print by pattern function *
-- * ipaddr ipaddr_mask(a),ipaddr_bcast(a),ipaddr_net(a) functions (mask,bcast, start addr)*
-- * int4 ipaddr_len(a) - lenght of subnet; ipaddr_pref(a) - prefix length, *
-- * int4 ipaddr_integer(a) - integer value; ipaddr ipaddr_compose(integer_addr,pref_len) *
-- * compose ipaddr from addr and mask *
-- * '+' and '-' operators (ipaddr = ipaddr + integer),(ipaddr = ipaddr - integer) ops *
-- *****************************************************************************************
-- * R E A D T H I S T E X T B E F O R E E X I T I N G : *
-- * Now you should execute ipi.sql to allow BTREE indexing on this class. *
-- *****************************************************************************************
-- eof

View File

@ -1,257 +0,0 @@
/*
* PostgreSQL type definitions for IP addresses.
*
* $Id: ip_orig.c,v 1.1 1998/06/16 05:35:11 momjian Exp $
*/
#include <stdio.h>
#include <postgres.h>
#include <utils/palloc.h>
/*
* This is the internal storage format for IP addresses:
*/
typedef struct ipaddr
{
uint32 address;
int16 width;
} ipaddr;
/*
* Various forward declarations:
*/
ipaddr *ipaddr_in(char *str);
char *ipaddr_out(ipaddr * addr);
bool ipaddr_lt(ipaddr * a1, ipaddr * a2);
bool ipaddr_le(ipaddr * a1, ipaddr * a2);
bool ipaddr_eq(ipaddr * a1, ipaddr * a2);
bool ipaddr_ge(ipaddr * a1, ipaddr * a2);
bool ipaddr_gt(ipaddr * a1, ipaddr * a2);
bool ipaddr_ne(ipaddr * a1, ipaddr * a2);
int4 ipaddr_cmp(ipaddr * a1, ipaddr * a2);
bool ipaddr_in_net(ipaddr * a1, ipaddr * a2);
ipaddr *ipaddr_mask(ipaddr * a);
ipaddr *ipaddr_bcast(ipaddr * a);
/*
* Build a mask of a given width:
*/
unsigned long
build_mask(unsigned char bits)
{
unsigned long mask = 0;
int i;
for (i = 0; i < bits; i++)
mask = (mask >> 1) | 0x80000000;
return mask;
}
/*
* IP address reader. Note how the count returned by sscanf()
* is used to determine whether the mask size was specified.
*/
ipaddr *
ipaddr_in(char *str)
{
int a,
b,
c,
d,
w;
ipaddr *result;
int count;
if (strlen(str) > 0)
{
count = sscanf(str, "%d.%d.%d.%d/%d", &a, &b, &c, &d, &w);
if (count < 4)
{
elog(ERROR, "ipaddr_in: error in parsing \"%s\"", str);
return (NULL);
}
if (count == 4)
w = 32;
if ((a < 0) || (a > 255) || (b < 0) || (b > 255) ||
(c < 0) || (c > 255) || (d < 0) || (d > 255) ||
(w < 0) || (w > 32))
{
elog(ERROR, "ipaddr_in: illegal address \"%s\"", str);
return (NULL);
}
}
else
{
a = b = c = d = w = 0; /* special case for missing address */
}
result = (ipaddr *) palloc(sizeof(ipaddr));
result->address = (uint32) ((a << 24) | (b << 16) | (c << 8) | d);
result->address &= build_mask(w);
result->width = w;
return (result);
}
/*
* IP address output function. Note mask size specification
* generated only for subnets, not for plain host addresses.
*/
char *
ipaddr_out(ipaddr * addr)
{
char *result;
if (addr == NULL)
return (NULL);
result = (char *) palloc(32);
if (addr->address > 0)
{
if (addr->width == 32)
sprintf(result, "%d.%d.%d.%d",
(addr->address >> 24) & 0xff,
(addr->address >> 16) & 0xff,
(addr->address >> 8) & 0xff,
addr->address & 0xff);
else
sprintf(result, "%d.%d.%d.%d/%d",
(addr->address >> 24) & 0xff,
(addr->address >> 16) & 0xff,
(addr->address >> 8) & 0xff,
addr->address & 0xff,
addr->width);
}
else
{
result[0] = 0; /* special case for missing address */
}
return (result);
}
/*
* Boolean tests for magnitude.
*/
bool
ipaddr_lt(ipaddr * a1, ipaddr * a2)
{
return (a1->address < a2->address);
};
bool
ipaddr_le(ipaddr * a1, ipaddr * a2)
{
return (a1->address <= a2->address);
};
bool
ipaddr_eq(ipaddr * a1, ipaddr * a2)
{
return (a1->address == a2->address);
};
bool
ipaddr_ge(ipaddr * a1, ipaddr * a2)
{
return (a1->address >= a2->address);
};
bool
ipaddr_gt(ipaddr * a1, ipaddr * a2)
{
return (a1->address > a2->address);
};
bool
ipaddr_ne(ipaddr * a1, ipaddr * a2)
{
return (a1->address != a2->address);
};
/*
* Comparison function for sorting:
*/
int4
ipaddr_cmp(ipaddr * a1, ipaddr * a2)
{
if (a1->address < a2->address)
return -1;
else if (a1->address > a2->address)
return 1;
else
return 0;
}
/*
* Test whether an address is within a given subnet:
*/
bool
ipaddr_in_net(ipaddr * a1, ipaddr * a2)
{
uint32 maskbits;
if (a1->width < a2->width)
return FALSE;
if ((a1->width == 32) && (a2->width == 32))
return ipaddr_eq(a1, a2);
maskbits = build_mask(a2->width);
if ((a1->address & maskbits) == (a2->address & maskbits))
return TRUE;
return FALSE;
}
/*
* Pick out just the mask of a network:
*/
ipaddr *
ipaddr_mask(ipaddr * a)
{
ipaddr *result;
result = (ipaddr *) palloc(sizeof(ipaddr));
result->address = build_mask(a->width);
result->width = 32;
return result;
}
/*
* Return the broadcast address of a network:
*/
ipaddr *
ipaddr_bcast(ipaddr * a)
{
ipaddr *result;
result = (ipaddr *) palloc(sizeof(ipaddr));
result->address = a->address;
result->address |= (build_mask(32 - a->width) >> a->width);
result->width = 32;
return result;
}
/*
* eof
*/

View File

@ -1,488 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE></TITLE>
<META NAME="GENERATOR" CONTENT="Mozilla/3.04Gold (X11; I; FreeBSD 2.2.5-RELEASE i386) [Netscape]">
</HEAD>
<BODY>
<H2>New object class for the IP ADDRESSES manipulations.</H2>
<H3>1. Description:</H3>
<UL>
<P>Type name: <B>ipaddr<BR>
</B>Data lenght: <B>6 bytes<BR>
</B>Data context: <B>ip address and prefix length</B></P>
</UL>
<H3><B>2. How to install:</B></H3>
<UL>
<P>Use script <B>ip.sql </B>to add new type, new functions and operators
to the data base.</P>
<P>Use script <B>ipi.sql </B>to add new type and new operator class ipaddr_ops
to the index system and allow indexing by this new type (with search by
'<B>&gt;</B>', '<B>&gt;=</B>', '<B>&lt;</B>', '<B>&lt;=</B>', '<B>=</B>'
boolean operators).</P>
<P>Use scripts '<B>test1.sql'</B> and '<B>test2.sql'</B> (edit second script
first) to check if indexing work properly.</P>
</UL>
<H3>3. Input / output formsts.</H3>
<P>New type stores IP address and IP prefix in the single data attribute.
To input data, you should use the form</P>
<UL>
<P><B><I>DDD</I>.<I>DDD</I>.<I>DDD</I>.<I>DDD</I>/<I>P</I>P</B></P>
</UL>
<P>for the address <B>DDD.DDD.DDD.DDD</B> and prefix <B>PP</B> (prefix
is len from 0 (for 0.0.0.0) to 32 (for 255.255.255.255)). You can miss
/PP n two cases:</P>
<UL>
<LI>You enter host address (this means /32 prefix) and this is not the
address of the natural class A, B or C network.</LI>
<LI>You enter natural class A, B, C network with the /8, /16 and /24 prefix.</LI>
</UL>
<P>For example, <B>193.124.23.0</B> should be read as '<B>193.124.23.0/24</B>'
network, and '<B>193.124.23.1</B>' should be read as <B>/32 </B>host address.
To enter interface address <B>193.124.23.6/24</B>, you should use exact
form '<B>193.124.23.6/24'</B>.</P>
<P>The address '0.0.0.0' means '0.0.0.0/0', this is <B>default</B> in terms
of routers.</P>
<P><B>ipaddr</B> type data are printed just in the same form (to allow
input/output compatibility) - <B>193.124.23.0/24</B> should be printed
as '<B>193.124.23.0</B>' and '<B>193.124.23.1/32</B>' should be printed
as '<B>193.124.23.1</B>'.</P>
<P>There is special function to convert ipaddr data into string by the
format:</P>
<UL>
<P>char ipaddr_print(ipaddr,format)</P>
</UL>
<P>format consist of plain text and %C special characters:</P>
<UL>
<P><B>%A</B> - address in form ddd.ddd.ddd.ddd,<BR>
<B>%M </B>- network mask in form ddd.ddd.ddd.ddd,<BR>
<B>%B </B>- negated mask ('0.0.0.7' for '/29' prefix, for example),<BR>
<B>%P</B> - prefix (withouth '/' delimiter).</P>
</UL>
<H3>4. Operators.</H3>
<TABLE ALIGN=ABSCENTER BORDER=2 CELLSPACING=0 CELLPADDING=0 >
<TR>
<TD>Left argument<BR>
A1</TD>
<TD>Op</TD>
<TD>Right argument<BR>
A2</TD>
<TD>Result<BR>
R</TD>
<TD>Description</TD>
</TR>
<TR>
<TD>ipaddr</TD>
<TD>&lt;</TD>
<TD>ipaddr</TD>
<TD>boolean</TD>
<TD>Compare addresses, if they are equal, compare prefixes,</TD>
</TR>
<TR>
<TD>ipaddr</TD>
<TD>&lt;=</TD>
<TD>ipaddr</TD>
<TD>boolean</TD>
<TD>Compare addresses, if they are equal, compare prefixes,</TD>
</TR>
<TR>
<TD>ipaddr</TD>
<TD>=</TD>
<TD>ipaddr</TD>
<TD>boolean</TD>
<TD>Compare addresses, if they are equal, compare prefixes,</TD>
</TR>
<TR>
<TD>ipaddr</TD>
<TD>&gt;=</TD>
<TD>ipaddr</TD>
<TD>boolean</TD>
<TD>Compare addresses, if they are equal, compare prefixes,</TD>
</TR>
<TR>
<TD>ipaddr</TD>
<TD>&gt;</TD>
<TD>ipaddr</TD>
<TD>boolean</TD>
<TD>Compare addresses, if they are equal, compare prefixes,</TD>
</TR>
<TR>
<TD>ipaddr</TD>
<TD>&lt;&gt;</TD>
<TD>ipaddr</TD>
<TD>boolean</TD>
<TD>Compare addresses, if they are equal, compare prefixes,</TD>
</TR>
<TR>
<TD>ipaddr</TD>
<TD>@</TD>
<TD>ipaddr</TD>
<TD>boolean</TD>
<TD>True if A1 is the part of network (subnetwork) A2 or if A1 = A2</TD>
</TR>
<TR>
<TD>ipaddr</TD>
<TD>+</TD>
<TD>int4</TD>
<TD>ipaddr</TD>
<TD>Increase address A1 on A2 value (A2 is integer).</TD>
</TR>
<TR>
<TD>ipaddr </TD>
<TD>-</TD>
<TD>int4</TD>
<TD>ipaddr</TD>
<TD>Decrease address A1 on A2.</TD>
</TR>
</TABLE>
<H3>5. Functions.</H3>
<P>There is a lot of functions defined for new ipaddr data type. Some of
them are duplicated by operators described above, some are not. </P>
<TABLE ALIGN=ABSCENTER BORDER=2 CELLSPACING=0 CELLPADDING=0 >
<TR>
<TD>Function(arguments)</TD>
<TD>Function type</TD>
<TD>Description</TD>
<TD>Operator</TD>
</TR>
<TR>
<TD>ipaddr_print(ipaddr, text)</TD>
<TD>text</TD>
<TD>Converts ipaddr to the text string by format from the second argument.
Format can contain %A - address, %M - mask, %B - reversed mask, %P - prefix,
and any other characters.</TD>
<TD></TD>
</TR>
<TR>
<TD>ipaddr_lt(ipaddr, ipaddr)</TD>
<TD>boolean</TD>
<TD>Compare by '&lt;'</TD>
<TD>&lt;</TD>
</TR>
<TR>
<TD>ipaddr_le(ipaddr,ipaddr)</TD>
<TD>boolean</TD>
<TD>Compare by '&lt;='</TD>
<TD>&lt;=</TD>
</TR>
<TR>
<TD>ipaddr_eq(ipaddr, ipaddr)</TD>
<TD>boolean</TD>
<TD>Compare by '='</TD>
<TD>=</TD>
</TR>
<TR>
<TD>ipaddr_ne(ipaddr, ipaddr)</TD>
<TD>boolean</TD>
<TD>Compare by '&lt;&gt;'</TD>
<TD>&lt;&gt;</TD>
</TR>
<TR>
<TD>ipaddr_ge(ipaddr, ipaddr)</TD>
<TD>boolean</TD>
<TD>Compare by '&gt;='</TD>
<TD>&gt;=</TD>
</TR>
<TR>
<TD>ipaddr_gt(ipaddr, ipaddr)</TD>
<TD>boolean</TD>
<TD>Compare by '&gt;'</TD>
<TD>&gt;</TD>
</TR>
<TR>
<TD>ipaddr_in_net(ipaddr, ipaddr)</TD>
<TD>boolean</TD>
<TD><B>True</B> if fisrt argument is the host or subnetwork of the second
argument (first address is equal or included into the second one)</TD>
<TD>@</TD>
</TR>
<TR>
<TD>ipaddr_net(ipaddr)</TD>
<TD>ipaddr</TD>
<TD>Return the network (with the 0 in host bits) for the argument; for
example ipaddr_net('193.124.23.1/24') = '193.124.23.0';</TD>
<TD></TD>
</TR>
<TR>
<TD>ipaddr_bcast(ipaddr)</TD>
<TD>ipaddr</TD>
<TD>Return broadcast address (with the /32 prefix) for the network described
by argument.</TD>
<TD></TD>
</TR>
<TR>
<TD>ipaddr_is_net(ipaddr)</TD>
<TD>boolean</TD>
<TD><B>True</B> if ipaddr is network address; <B>false</B> if its' the
host in the network. For the /32 addresses, returns <B>false</B>.</TD>
<TD></TD>
</TR>
<TR>
<TD>ipaddr_mask(ipaddr)</TD>
<TD>ipaddr</TD>
<TD>Return netmask (with /32 prefix) for the network.</TD>
<TD></TD>
</TR>
<TR>
<TD>ipaddr_prefix(ipaddr)</TD>
<TD>int4</TD>
<TD>Return the prefix size (from 0 to 32).</TD>
<TD></TD>
</TR>
<TR>
<TD>ipaddr_len(ipaddr)</TD>
<TD>int4</TD>
<TD>Return the number of addresses in the particular network (for example,
256 for /24 prefix).</TD>
<TD></TD>
</TR>
<TR>
<TD>ipaddr_integer(ipaddr)</TD>
<TD>int4</TD>
<TD>Return IP address (withouth the prefix) as integer.</TD>
<TD></TD>
</TR>
<TR>
<TD>ipaddr_compose(int4,int4)</TD>
<TD>ipaddr</TD>
<TD>Compose ipaddr object from ip address (first argument) and prefix lenght
(second argument). ipaddr_compose(ipaddr_integer(a),ipaddr_prefix(a)) =
a.</TD>
<TD></TD>
</TR>
<TR>
<TD>ipaddr_plus(ipaddr, int4)</TD>
<TD>ipaddr</TD>
<TD>Operator PLUS (addres increased, prefix does not changed)</TD>
<TD>+</TD>
</TR>
<TR>
<TD>ipaddr_minus(ipaddr, int4)</TD>
<TD>ipaddr</TD>
<TD>Operator MINUS (address decreased, prefix does not changed).</TD>
<TD>-</TD>
</TR>
<TR>
<TD>ipaddr_cmp(ipaddr, ipaddr)</TD>
<TD>int4</TD>
<TD>Compare it's arguments and return -1, 0 or +1.</TD>
<TD></TD>
</TR>
</TABLE>
<H3>5. Usage.</H3>
<P>New type opens many interesting futures for the ip routing or ip accounting
networks. For example, you can search all interfaces connected to the same
phisical network by comparing ipaddr_net(interface_address) /if you store
address as address/prefix pair in the single attribute, and so on.</P>
<P>Unfortunately, I had not time (and was not too familiar with RTree ideas
used in Postgres) to check if it's possible to use RTree indexing for the
fast routing lookups by data base. It's important task because usial usage
of this future is _determine the nearest network the particular address
contain to, and link the accounting record to this network_. And so on.</P>
<P>Write any questions or wishes to me by e-mail. This is BETA version
of this package for now, because we are building our IP routing data base
just now and did not tested all this fucntions under heavy conditions;
through I hope this functions are too simple for the hidden bugs, and they
was tested carefully at the simple tests.</P>
<H3>6. Installation.</H3>
<OL>
<LI>Translate shared library ip.so:<BR>
make</LI>
<LI>Install shared library to the proper place (/usr/local/pgsql/contrib/ip_and_macs)<BR>
make install<BR>
(in case if your system is not FreeBSD, it can be nessesary modify 'Makefile'
before).</LI>
<LI>Public to the accessible place scripts ip.sql (installation of data
type), ipi.sql (describing of this data type for the proper indexing),
test1.sql, test2.sql, test.DATA (test and data). Modify test1.sql in accordance
to real location of the data files.</LI>
<LI>To add new data type into your data base, exec scripts in this data
base:<BR>
psql DATA_BASE<BR>
\i ip.sql -- change this to the real location<BR>
\i ipi.sql -- change this to the real location</LI>
<LI>To test this data type, exec test1.sql and test2.sql SQL scripts.</LI>
</OL>
<H3>7. Download.</H3>
<P>You can download this data type from <B>http://relcom.EU.net/ip_class.tar.gz</B></P>
<H3><BR>
</H3>
<P>
<HR WIDTH="100%"></P>
<P>Aleksei Roudnev, The Network Operation Centre, Relcom Network; Moscow,
Russia.</P>
<UL><B></B></UL>
<UL></UL>
</BODY>
</HTML>

View File

@ -1,64 +0,0 @@
begin;
select pgam.oid from pg_am pgam
where amname = 'btree';
--
-- Temporary oper table
--
-- drop table tmp_op;
create table tmp_op ( oprname name, opi int2);
--
-- Fill in this table
--
insert into tmp_op values('<','1');
insert into tmp_op values('<=','2');
insert into tmp_op values('=','3');
insert into tmp_op values('>=','4');
insert into tmp_op values('>','5');
select * from tmp_op;
--
-- Add record to the pg_opclass
--
DELETE FROM pg_opclass WHERE opcname = 'ipaddr_ops';
INSERT INTO pg_opclass (opcname,opcdeftype)
select 'ipaddr_ops',oid from pg_type where typname = 'ipaddr';
--
-- And determine oid
--
SELECT opc.oid,opc.opcname
FROM pg_opclass opc
WHERE opc.opcname = 'ipaddr_ops';
--
SELECT o.oid AS opoid, o.oprname
INTO TABLE ipaddr_tmp
FROM pg_operator o, pg_type t
WHERE o.oprleft = t.oid and o.oprright = t.oid and t.typname = 'ipaddr';
SELECT * FROM ipaddr_tmp;
--
INSERT INTO pg_amop (amopid, amopclaid, amopopr, amopstrategy, amopselect, amopnpages)
SELECT am.oid,opcl.oid,c.opoid,t.opi,'btreesel'::regproc, 'btreenpage'::regproc
FROM pg_am am, pg_opclass opcl, ipaddr_tmp c, tmp_op t
WHERE t.oprname = c.oprname
and amname = 'btree'
and opcname = 'ipaddr_ops';
--
SELECT prc.oid, prc.proname FROM pg_proc prc
WHERE prc.proname = 'ipaddr_cmp';
--
INSERT INTO pg_amproc (amid, amopclaid, amproc, amprocnum)
SELECT pgam.oid, opc.oid,prc.oid,'1'::int2
FROM pg_am pgam,
pg_opclass opc,
pg_proc prc
WHERE prc.proname = 'ipaddr_cmp'
and pgam.amname = 'btree'
and opc.opcname = 'ipaddr_ops';
drop table tmp_op;
DROP TABLE ipaddr_tmp;
COMMIT;
-- *****************************************************************
-- * Now you should test this by running test1.sql and test2.sql *
-- * In test2, be sure the 'explain' operator show you *
-- * search by index in the last line of output *
-- *****************************************************************

View File

@ -1,244 +0,0 @@
/*
* PostgreSQL type definitions for MAC addresses.
*
* $Id: mac.c,v 1.3 1998/02/26 04:27:44 momjian Exp $
*/
#include <stdio.h>
#include <postgres.h>
#include <utils/palloc.h>
#include "mac.h"
/*
* This is the internal storage format for MAC addresses:
*/
typedef struct macaddr
{
unsigned char a;
unsigned char b;
unsigned char c;
unsigned char d;
unsigned char e;
unsigned char f;
} macaddr;
/*
* Various forward declarations:
*/
macaddr *macaddr_in(char *str);
char *macaddr_out(macaddr * addr);
bool macaddr_lt(macaddr * a1, macaddr * a2);
bool macaddr_le(macaddr * a1, macaddr * a2);
bool macaddr_eq(macaddr * a1, macaddr * a2);
bool macaddr_ge(macaddr * a1, macaddr * a2);
bool macaddr_gt(macaddr * a1, macaddr * a2);
bool macaddr_ne(macaddr * a1, macaddr * a2);
int4 macaddr_cmp(macaddr * a1, macaddr * a2);
text *macaddr_manuf(macaddr * addr);
/*
* Utility macros used for sorting and comparing:
*/
#define hibits(addr) \
((unsigned long)((addr->a<<16)|(addr->b<<8)|(addr->c)))
#define lobits(addr) \
((unsigned long)((addr->c<<16)|(addr->e<<8)|(addr->f)))
/*
* MAC address reader. Accepts several common notations.
*/
macaddr *
macaddr_in(char *str)
{
int a,
b,
c,
d,
e,
f;
macaddr *result;
int count;
if (strlen(str) > 0)
{
count = sscanf(str, "%x:%x:%x:%x:%x:%x", &a, &b, &c, &d, &e, &f);
if (count != 6)
count = sscanf(str, "%x-%x-%x-%x-%x-%x", &a, &b, &c, &d, &e, &f);
if (count != 6)
count = sscanf(str, "%2x%2x%2x:%2x%2x%2x", &a, &b, &c, &d, &e, &f);
if (count != 6)
count = sscanf(str, "%2x%2x%2x-%2x%2x%2x", &a, &b, &c, &d, &e, &f);
if (count != 6)
count = sscanf(str, "%2x%2x.%2x%2x.%2x%2x", &a, &b, &c, &d, &e, &f);
if (count != 6)
{
elog(ERROR, "macaddr_in: error in parsing \"%s\"", str);
return (NULL);
}
if ((a < 0) || (a > 255) || (b < 0) || (b > 255) ||
(c < 0) || (c > 255) || (d < 0) || (d > 255) ||
(e < 0) || (e > 255) || (f < 0) || (f > 255))
{
elog(ERROR, "macaddr_in: illegal address \"%s\"", str);
return (NULL);
}
}
else
{
a = b = c = d = e = f = 0; /* special case for missing
* address */
}
result = (macaddr *) palloc(sizeof(macaddr));
result->a = a;
result->b = b;
result->c = c;
result->d = d;
result->e = e;
result->f = f;
return (result);
}
/*
* MAC address output function. Fixed format.
*/
char *
macaddr_out(macaddr * addr)
{
char *result;
if (addr == NULL)
return (NULL);
result = (char *) palloc(32);
if ((hibits(addr) > 0) || (lobits(addr) > 0))
{
sprintf(result, "%02x:%02x:%02x:%02x:%02x:%02x",
addr->a, addr->b, addr->c, addr->d, addr->e, addr->f);
}
else
{
result[0] = 0; /* special case for missing address */
}
return (result);
}
/*
* Boolean tests.
*/
bool
macaddr_lt(macaddr * a1, macaddr * a2)
{
return ((hibits(a1) < hibits(a2)) ||
((hibits(a1) == hibits(a2)) && lobits(a1) < lobits(a2)));
};
bool
macaddr_le(macaddr * a1, macaddr * a2)
{
return ((hibits(a1) < hibits(a2)) ||
((hibits(a1) == hibits(a2)) && lobits(a1) <= lobits(a2)));
};
bool
macaddr_eq(macaddr * a1, macaddr * a2)
{
return ((hibits(a1) == hibits(a2)) && (lobits(a1) == lobits(a2)));
};
bool
macaddr_ge(macaddr * a1, macaddr * a2)
{
return ((hibits(a1) > hibits(a2)) ||
((hibits(a1) == hibits(a2)) && lobits(a1) >= lobits(a2)));
};
bool
macaddr_gt(macaddr * a1, macaddr * a2)
{
return ((hibits(a1) > hibits(a2)) ||
((hibits(a1) == hibits(a2)) && lobits(a1) > lobits(a2)));
};
bool
macaddr_ne(macaddr * a1, macaddr * a2)
{
return ((hibits(a1) != hibits(a2)) || (lobits(a1) != lobits(a2)));
};
/*
* Comparison function for sorting:
*/
int4
macaddr_cmp(macaddr * a1, macaddr * a2)
{
if (hibits(a1) < hibits(a2))
return -1;
else if (hibits(a1) > hibits(a2))
return 1;
else if (lobits(a1) < lobits(a2))
return -1;
else if (lobits(a1) > lobits(a2))
return 1;
else
return 0;
}
/*
* The special manufacturer fetching function. See "mac.h".
*/
text *
macaddr_manuf(macaddr * addr)
{
manufacturer *manuf;
int length;
text *result;
for (manuf = manufacturers; manuf->name != NULL; manuf++)
{
if ((manuf->a == addr->a) &&
(manuf->b == addr->b) &&
(manuf->c == addr->c))
break;
}
if (manuf->name == NULL)
{
result = palloc(VARHDRSZ + 1);
memset(result, 0, VARHDRSZ + 1);
VARSIZE(result) = VARHDRSZ + 1;
}
else
{
length = strlen(manuf->name) + 1;
result = palloc(length + VARHDRSZ);
memset(result, 0, length + VARHDRSZ);
VARSIZE(result) = length + VARHDRSZ;
memcpy(VARDATA(result), manuf->name, length);
}
return result;
}
/*
* eof
*/

View File

@ -1,133 +0,0 @@
/*
* PostgreSQL type definitions for MAC addresses.
*
* $Id: mac.h,v 1.3 1998/02/26 04:27:50 momjian Exp $
*/
typedef struct manufacturer
{
unsigned char a;
unsigned char b;
unsigned char c;
char *name;
} manufacturer;
manufacturer manufacturers[] = {
{0x00, 0x00, 0x0C, "Cisco"},
{0x00, 0x00, 0x0E, "Fujitsu"},
{0x00, 0x00, 0x0F, "NeXT"},
{0x00, 0x00, 0x10, "Sytek"},
{0x00, 0x00, 0x1D, "Cabletron"},
{0x00, 0x00, 0x20, "DIAB"},
{0x00, 0x00, 0x22, "Visual Technology"},
{0x00, 0x00, 0x2A, "TRW"},
{0x00, 0x00, 0x32, "GPT Limited"},
{0x00, 0x00, 0x5A, "S & Koch"},
{0x00, 0x00, 0x5E, "IANA"},
{0x00, 0x00, 0x65, "Network General"},
{0x00, 0x00, 0x6B, "MIPS"},
{0x00, 0x00, 0x77, "MIPS"},
{0x00, 0x00, 0x7A, "Ardent"},
{0x00, 0x00, 0x89, "Cayman Systems"},
{0x00, 0x00, 0x93, "Proteon"},
{0x00, 0x00, 0x9F, "Ameristar Technology"},
{0x00, 0x00, 0xA2, "Wellfleet"},
{0x00, 0x00, 0xA3, "Network Application Technology"},
{0x00, 0x00, 0xA6, "Network General"},
{0x00, 0x00, 0xA7, "NCD"},
{0x00, 0x00, 0xA9, "Network Systems"},
{0x00, 0x00, 0xAA, "Xerox"},
{0x00, 0x00, 0xB3, "CIMLinc"},
{0x00, 0x00, 0xB7, "Dove Fastnet"},
{0x00, 0x00, 0xBC, "Allen-Bradley"},
{0x00, 0x00, 0xC0, "Western Digital"},
{0x00, 0x00, 0xC5, "Farallon"},
{0x00, 0x00, 0xC6, "Hewlett-Packard"},
{0x00, 0x00, 0xC8, "Altos"},
{0x00, 0x00, 0xC9, "Emulex"},
{0x00, 0x00, 0xD7, "Dartmouth College"},
{0x00, 0x00, 0xD8, "3Com (?)"},
{0x00, 0x00, 0xDD, "Gould"},
{0x00, 0x00, 0xDE, "Unigraph"},
{0x00, 0x00, 0xE2, "Acer Counterpoint"},
{0x00, 0x00, 0xEF, "Alantec"},
{0x00, 0x00, 0xFD, "High Level Hardware"},
{0x00, 0x01, 0x02, "BBN internal usage"},
{0x00, 0x20, 0xAF, "3Com"},
{0x00, 0x17, 0x00, "Kabel"},
{0x00, 0x80, 0x64, "Wyse Technology"},
{0x00, 0x80, 0x2B, "IMAC (?)"},
{0x00, 0x80, 0x2D, "Xylogics, Inc."},
{0x00, 0x80, 0x8C, "Frontier Software Development"},
{0x00, 0x80, 0xC2, "IEEE 802.1 Committee"},
{0x00, 0x80, 0xD3, "Shiva"},
{0x00, 0xAA, 0x00, "Intel"},
{0x00, 0xDD, 0x00, "Ungermann-Bass"},
{0x00, 0xDD, 0x01, "Ungermann-Bass"},
{0x02, 0x07, 0x01, "Racal InterLan"},
{0x02, 0x04, 0x06, "BBN internal usage"},
{0x02, 0x60, 0x86, "Satelcom MegaPac"},
{0x02, 0x60, 0x8C, "3Com"},
{0x02, 0xCF, 0x1F, "CMC"},
{0x08, 0x00, 0x02, "3Com"},
{0x08, 0x00, 0x03, "ACC"},
{0x08, 0x00, 0x05, "Symbolics"},
{0x08, 0x00, 0x08, "BBN"},
{0x08, 0x00, 0x09, "Hewlett-Packard"},
{0x08, 0x00, 0x0A, "Nestar Systems"},
{0x08, 0x00, 0x0B, "Unisys"},
{0x08, 0x00, 0x11, "Tektronix"},
{0x08, 0x00, 0x14, "Excelan"},
{0x08, 0x00, 0x17, "NSC"},
{0x08, 0x00, 0x1A, "Data General"},
{0x08, 0x00, 0x1B, "Data General"},
{0x08, 0x00, 0x1E, "Apollo"},
{0x08, 0x00, 0x20, "Sun"},
{0x08, 0x00, 0x22, "NBI"},
{0x08, 0x00, 0x25, "CDC"},
{0x08, 0x00, 0x26, "Norsk Data"},
{0x08, 0x00, 0x27, "PCS Computer Systems GmbH"},
{0x08, 0x00, 0x28, "Texas Instruments"},
{0x08, 0x00, 0x2B, "DEC"},
{0x08, 0x00, 0x2E, "Metaphor"},
{0x08, 0x00, 0x2F, "Prime Computer"},
{0x08, 0x00, 0x36, "Intergraph"},
{0x08, 0x00, 0x37, "Fujitsu-Xerox"},
{0x08, 0x00, 0x38, "Bull"},
{0x08, 0x00, 0x39, "Spider Systems"},
{0x08, 0x00, 0x41, "DCA Digital Comm. Assoc."},
{0x08, 0x00, 0x45, "Xylogics (?)"},
{0x08, 0x00, 0x46, "Sony"},
{0x08, 0x00, 0x47, "Sequent"},
{0x08, 0x00, 0x49, "Univation"},
{0x08, 0x00, 0x4C, "Encore"},
{0x08, 0x00, 0x4E, "BICC"},
{0x08, 0x00, 0x56, "Stanford University"},
{0x08, 0x00, 0x58, "DECsystem 20 (?)"},
{0x08, 0x00, 0x5A, "IBM"},
{0x08, 0x00, 0x67, "Comdesign"},
{0x08, 0x00, 0x68, "Ridge"},
{0x08, 0x00, 0x69, "Silicon Graphics"},
{0x08, 0x00, 0x6E, "Concurrent"},
{0x08, 0x00, 0x75, "DDE"},
{0x08, 0x00, 0x7C, "Vitalink"},
{0x08, 0x00, 0x80, "XIOS"},
{0x08, 0x00, 0x86, "Imagen/QMS"},
{0x08, 0x00, 0x87, "Xyplex"},
{0x08, 0x00, 0x89, "Kinetics"},
{0x08, 0x00, 0x8B, "Pyramid"},
{0x08, 0x00, 0x8D, "XyVision"},
{0x08, 0x00, 0x90, "Retix Inc"},
{0x48, 0x44, 0x53, "HDS (?)"},
{0x80, 0x00, 0x10, "AT&T"},
{0xAA, 0x00, 0x00, "DEC"},
{0xAA, 0x00, 0x01, "DEC"},
{0xAA, 0x00, 0x02, "DEC"},
{0xAA, 0x00, 0x03, "DEC"},
{0xAA, 0x00, 0x04, "DEC"},
{0x00, 0x00, 0x00, NULL}
};
/*
* eof
*/

View File

@ -1,125 +0,0 @@
--
-- PostgreSQL code for MAC addresses.
--
-- $Id: mac.sql,v 1.4 1998/06/16 05:35:11 momjian Exp $
--
load '/usr/local/pgsql/contrib/ip_and_macs/mac.so';
--
-- Input and output functions and the type itself:
--
create function macaddr_in(opaque)
returns opaque
as '/usr/local/pgsql/contrib/ip_and_macs/mac.so'
language 'c';
create function macaddr_out(opaque)
returns opaque
as '/usr/local/pgsql/contrib/ip_and_macs/mac.so'
language 'c';
create type macaddr (
internallength = 6,
externallength = variable,
input = macaddr_in,
output = macaddr_out
);
--
-- The boolean tests:
--
create function macaddr_lt(macaddr, macaddr)
returns bool
as '/usr/local/pgsql/contrib/ip_and_macs/mac.so'
language 'c';
create function macaddr_le(macaddr, macaddr)
returns bool
as '/usr/local/pgsql/contrib/ip_and_macs/mac.so'
language 'c';
create function macaddr_eq(macaddr, macaddr)
returns bool
as '/usr/local/pgsql/contrib/ip_and_macs/mac.so'
language 'c';
create function macaddr_ge(macaddr, macaddr)
returns bool
as '/usr/local/pgsql/contrib/ip_and_macs/mac.so'
language 'c';
create function macaddr_gt(macaddr, macaddr)
returns bool
as '/usr/local/pgsql/contrib/ip_and_macs/mac.so'
language 'c';
create function macaddr_ne(macaddr, macaddr)
returns bool
as '/usr/local/pgsql/contrib/ip_and_macs/mac.so'
language 'c';
--
-- Now the operators. Note how some of the parameters to some
-- of the 'create operator' commands are commented out. This
-- is because they reference as yet undefined operators, and
-- will be implicitly defined when those are, further down.
--
create operator < (
leftarg = macaddr,
rightarg = macaddr,
-- negator = >=,
procedure = macaddr_lt
);
create operator <= (
leftarg = macaddr,
rightarg = macaddr,
-- negator = >,
procedure = macaddr_le
);
create operator = (
leftarg = macaddr,
rightarg = macaddr,
commutator = =,
-- negator = <>,
procedure = macaddr_eq
);
create operator >= (
leftarg = macaddr,
rightarg = macaddr,
negator = <,
procedure = macaddr_ge
);
create operator > (
leftarg = macaddr,
rightarg = macaddr,
negator = <=,
procedure = macaddr_gt
);
create operator <> (
leftarg = macaddr,
rightarg = macaddr,
negator = =,
procedure = macaddr_ne
);
--
-- Finally, the special manufacurer matching function:
--
create function macaddr_manuf(macaddr)
returns text
as '/usr/local/pgsql/contrib/ip_and_macs/mac.so'
language 'c';
--
-- eof
--

View File

@ -1,5 +0,0 @@
insert into xx values('193.124.23.2','host2');
insert into xx values('193.124.23.3','host3');
insert into xx values('193.124.22.1','host4');
insert into xx values('193.124.22.2','host5');
insert into xx values('193.124.22.3','host6');

View File

@ -1,999 +0,0 @@
193.125.80.35 193.232.202.80 2 880
193.125.80.35 194.87.0.22 2 574
194.87.42.38 195.16.106.31 262 10696
204.62.245.169 193.125.24.10 14 833
193.125.80.35 195.24.128.65 3 180
193.125.80.35 195.54.2.1 2 630
193.125.80.35 195.54.192.33 7 448
194.87.42.38 195.16.106.22 14 736
193.125.80.35 195.210.140.7 3 1068
194.87.41.131 195.46.160.46 10 681
194.87.37.2 194.135.213.244 66 9088
194.87.36.193 195.9.53.1 8 464
194.87.36.193 194.135.2.7 8 464
194.87.36.1 195.24.224.1 2 716
194.87.34.44 195.16.96.2 2 164
194.87.31.230 195.46.160.92 10 757
194.87.24.93 195.46.160.46 9 664
194.87.24.93 195.16.104.35 8 598
194.87.23.28 195.210.155.149 22 1249
194.87.22.107 195.46.160.34 76 3630
194.87.18.152 195.90.162.2 15 666
194.87.18.152 195.90.128.107 1 66
193.125.80.35 62.76.114.44 2 880
194.87.16.174 195.46.160.120 17 2276
204.62.245.168 194.226.45.36 8 444
194.87.16.78 195.16.104.35 8 720
194.87.16.61 195.16.96.22 29 1248
194.87.16.39 194.220.215.66 324 25148
194.87.16.10 195.128.133.65 57 4301
194.87.16.10 194.135.176.121 237 18379
193.125.80.38 194.84.69.5 21 1929
193.125.80.38 212.46.1.30 40 3758
204.62.245.168 144.206.160.32 8 450
193.125.80.44 195.151.199.4 45 2520
194.87.15.158 195.46.160.46 2 112
193.125.80.60 193.232.127.78 2 880
193.125.80.60 193.232.202.80 2 864
194.87.15.138 195.16.110.7 2 112
193.125.80.60 195.96.65.2 2 864
194.87.15.138 193.124.110.130 2 112
194.87.15.1 195.90.130.133 3 84
193.125.80.144 212.46.4.3 311 21140
193.125.80.163 194.84.132.222 261 110114
193.125.80.163 194.87.12.50 582 38097
193.125.80.163 194.87.13.2 34 2499
194.87.14.221 195.46.165.215 5 382
193.125.81.139 195.34.34.70 107 7799
193.125.81.140 194.67.115.130 5 220
204.62.245.167 195.222.130.72 9 475
204.62.245.167 193.125.242.225 2 88
194.87.14.221 195.46.163.47 117 99564
193.125.81.146 194.87.5.3 12 672
193.125.81.146 194.87.12.50 4 224
193.125.81.146 194.87.13.2 5 280
194.87.14.221 195.46.162.91 137 21211
193.125.81.146 195.161.0.34 2 112
193.125.81.146 195.218.135.39 2 112
194.87.14.221 195.12.32.8 131 132002
194.87.14.221 193.124.252.73 530 214220
193.125.81.148 194.67.146.145 201 8040
193.125.81.148 194.87.5.3 49 3140
193.125.81.148 194.87.12.50 230 12526
193.125.81.148 194.87.13.2 31 2042
194.87.14.216 195.210.154.154 68 32028
193.125.81.148 194.190.218.2 8 611
193.125.81.148 195.161.0.34 17 1473
193.125.81.148 195.218.135.39 245 16647
193.125.81.152 193.193.192.2 215 14797
193.125.81.152 194.87.13.2 12 748
193.125.81.152 195.24.128.65 27 1896
193.125.81.152 195.54.192.118 53 3209
194.87.14.216 195.210.154.152 83 81270
193.125.84.12 195.46.160.45 47 2373
193.125.84.154 195.90.128.107 1 62
193.125.84.154 195.90.140.2 1 62
194.87.14.203 195.210.130.62 6 821
194.87.14.152 195.46.160.69 12 2172
193.125.86.4 195.19.32.1 176 89133
194.87.14.73 195.90.162.2 41 42955
194.87.14.53 195.46.162.75 149 138236
194.87.14.51 195.210.190.19 19 10290
194.87.14.6 195.46.163.31 22 24836
193.125.90.34 194.87.161.7 2 208
193.125.90.34 194.87.161.229 13 8867
193.125.90.34 195.54.17.33 644 81839
194.87.14.5 193.124.97.131 53 12784
193.125.90.130 194.58.95.62 82 7119
194.87.13.26 212.248.36.8 14 7757
194.87.13.26 195.98.162.111 80 39391
194.87.13.26 195.98.161.25 70 76902
194.87.13.26 195.46.165.196 30 14838
194.87.13.26 195.46.161.219 47 39327
193.125.95.121 193.124.1.131 248 101051
194.87.13.26 194.85.149.13 28 24599
194.87.13.21 195.98.162.9 32 16101
194.87.13.21 195.90.136.148 84 93861
193.125.95.121 194.186.254.26 79 5470
194.87.13.21 195.46.162.244 10 400
194.87.13.21 195.12.32.182 96 53171
194.87.13.20 212.248.36.8 14 6798
194.87.13.20 212.20.8.250 358 438254
194.87.13.20 195.222.130.242 4 550
194.87.13.20 195.222.130.77 8 6753
193.125.95.124 192.124.176.69 4 538
193.125.95.124 193.124.5.54 2 126
194.87.13.20 195.210.143.145 4 168
193.125.95.124 193.124.110.129 21 2181
193.125.95.124 193.124.148.81 2 310
194.87.13.20 195.210.136.25 4 626
193.125.95.124 194.67.2.97 3 382
193.125.95.124 194.84.222.2 3 382
194.87.13.20 195.208.94.133 115 122276
194.87.13.20 195.182.129.11 15 17177
194.87.13.20 195.170.195.70 14 14313
204.62.245.167 193.124.97.135 9 472
194.87.13.20 195.144.198.159 90 40576
194.87.13.20 195.144.192.198 79 91293
193.125.95.124 195.222.130.67 9 745
194.87.13.20 195.128.144.246 14 12816
194.87.13.20 195.128.140.71 17 15901
194.87.13.20 195.128.140.3 44 47802
194.87.13.20 195.128.132.20 25 27119
194.87.13.20 195.128.128.98 28 15369
194.87.13.20 195.98.162.188 2 3000
193.125.98.254 194.190.170.19 26 1456
193.125.98.254 195.72.225.204 73 4088
204.62.245.166 195.9.80.194 2 88
204.62.245.161 193.124.182.40 2 138
204.62.132.32 193.124.97.131 3 618
193.125.103.137 195.46.163.141 7 372
194.87.13.20 195.98.162.170 4 628
193.125.121.1 193.124.22.22 2 136
193.125.121.121 194.85.157.200 790 31921
193.125.125.253 193.124.22.65 80 5411
193.125.127.42 193.124.22.65 18 1368
193.125.127.42 194.190.170.19 1227 63804
194.87.13.20 195.98.162.155 73 70166
194.87.13.20 195.98.162.9 323 163018
194.87.13.20 195.98.161.32 10 9756
194.87.13.20 195.98.161.25 4 1208
194.87.13.20 195.90.180.25 3 568
194.87.13.20 195.90.162.2 4 738
194.87.13.20 195.54.8.139 42 53309
194.87.13.20 195.54.5.129 27 13705
194.87.13.20 195.46.164.25 11 12641
194.87.13.20 195.46.164.16 62 74088
194.87.13.20 195.46.163.158 35 37649
194.87.13.20 195.46.163.89 52 57716
194.87.13.20 195.46.163.15 11 12641
193.125.132.129 193.124.215.71 26 4734
193.125.132.129 193.124.222.161 5 220
194.87.13.20 195.46.162.196 13 12813
194.87.13.20 195.46.162.173 30 36193
194.87.13.20 195.46.161.242 69 82486
194.87.13.20 195.46.161.210 15 13392
194.87.13.20 195.46.161.209 43 39183
193.125.132.129 194.190.211.25 2 80
194.87.13.20 195.46.161.111 85 93111
194.87.13.20 195.46.161.100 41 8909
194.87.13.20 195.16.102.4 5 3716
194.87.13.20 195.16.101.109 17 20273
194.87.13.20 195.16.101.101 93 112303
194.87.13.20 195.16.98.99 152 171268
194.87.13.20 195.9.103.3 11 12641
194.87.13.20 194.220.53.195 303 100520
194.87.13.20 194.190.56.83 8 1096
194.87.13.20 194.85.149.18 43 48875
194.87.13.20 194.85.137.152 30 34921
194.87.13.20 194.58.169.23 5 590
194.87.13.20 194.58.92.67 10 1044
194.87.13.20 194.58.72.102 34 31635
194.87.13.20 194.58.47.81 4 172
194.87.13.20 193.124.241.239 53 51597
193.125.142.40 195.54.3.15 7 500
193.125.142.40 195.90.183.40 1 40
193.125.143.130 195.90.128.103 13 11141
193.125.143.135 195.46.160.46 45 2957
204.62.129.195 195.19.1.132 10 4438
193.125.148.150 193.124.22.65 12 912
194.87.13.20 193.124.121.65 4 2216
194.87.13.20 193.124.114.33 8 1084
194.87.13.16 195.98.162.134 259 254892
194.87.13.16 195.46.165.162 292 145058
194.87.13.16 195.46.162.200 51 42010
194.87.13.16 195.46.160.69 97 45411
194.87.13.16 193.124.97.35 74 81434
194.87.13.15 212.20.1.95 11 10485
194.87.13.15 195.210.136.135 16 15786
194.87.13.15 195.210.131.39 6 3168
193.125.152.1 147.45.130.1 2 326
194.87.13.15 195.98.162.153 136 143332
194.87.13.15 195.98.162.9 308 168069
194.87.13.15 195.46.165.185 1183 633028
194.87.13.15 195.46.165.166 2 104
194.87.13.15 195.46.164.44 70 53112
194.87.13.15 195.46.163.156 159 113967
194.87.13.15 195.46.162.241 64 20483
194.87.13.15 195.46.162.30 120 95284
194.87.13.15 195.16.101.67 115 82325
194.87.13.15 195.9.90.85 7 600
194.87.13.15 194.135.176.88 92 7543
193.125.152.1 193.124.5.54 382 18328
193.125.152.1 193.124.22.22 271 246786
193.125.152.1 193.124.22.65 58 3504
193.125.152.1 193.124.22.68 12 1443
193.125.152.1 193.124.22.69 535 50134
193.125.152.1 193.124.22.70 10 1187
193.125.152.1 193.124.22.71 430 57506
193.125.152.1 193.124.22.72 57 7236
193.125.152.1 193.124.22.73 12 1443
193.125.152.1 193.124.22.74 9 1059
193.125.152.1 193.124.22.75 237 33658
193.125.152.1 193.124.22.77 266 37279
193.125.152.1 193.124.22.81 2265 522913
193.125.152.1 193.124.22.83 739 88013
193.125.152.1 193.124.36.45 1639 813217
193.125.152.1 193.124.57.65 219 74665
194.87.13.15 194.135.2.7 75 27476
194.87.13.15 193.124.252.73 254 110171
193.125.152.1 193.124.182.41 4 160
193.125.152.1 193.124.241.3 15 2284
193.125.152.1 193.124.241.14 1 244
193.125.152.1 193.124.241.18 3 636
193.125.152.1 193.124.241.29 19 3767
193.125.152.1 193.124.241.40 13 3140
193.125.152.1 193.124.241.53 32 7802
193.125.152.1 193.124.241.58 2 420
193.125.152.1 193.124.241.75 1 244
193.125.152.1 193.124.241.84 4 670
193.125.152.1 193.124.241.123 16 3574
193.125.152.1 193.124.241.154 2 524
193.125.152.1 193.124.241.158 44 10519
193.125.152.1 193.124.241.229 1 200
193.125.152.1 193.124.241.239 22 4490
193.125.152.1 193.124.241.249 6 1748
193.125.152.1 193.125.65.235 321 13793
193.125.152.1 193.125.80.35 2 476
194.87.13.15 193.124.241.39 512 271010
194.87.13.15 193.124.32.49 1119 1170153
194.87.13.14 195.210.136.135 188 193578
193.125.152.1 193.232.0.205 24 1555
193.125.152.1 193.232.21.26 17 1138
193.125.152.1 193.232.21.31 24 2206
193.125.152.1 193.232.69.159 8 1176
193.125.152.1 193.232.88.17 19 1387
193.125.152.1 193.232.119.131 783 31804
193.125.152.1 193.232.202.12 2 818
193.125.152.1 193.233.86.14 11 660
193.125.152.1 193.233.86.33 11 660
193.125.152.1 193.233.208.3 3 738
194.87.13.12 212.248.36.8 5 1763
194.87.13.12 212.20.8.250 49 37420
194.87.13.12 195.210.182.31 50 3544
194.87.13.12 195.210.179.4 37 33062
193.125.152.1 194.58.169.17 357 155601
193.125.152.1 194.58.201.193 6 774
193.125.152.1 194.58.230.92 8 1576
193.125.152.1 194.58.230.110 1 60
193.125.152.1 194.67.2.97 10 2760
193.125.152.1 194.67.90.1 8 448
194.87.13.12 195.210.154.48 37 13937
194.87.13.12 195.210.130.50 20 2117
193.125.152.1 194.84.23.125 16 1168
193.125.152.1 194.84.41.68 298 127287
193.125.152.1 194.84.42.17 16 1325
193.125.152.1 194.84.96.2 44 10261
193.125.152.1 194.84.204.222 1 112
193.125.152.1 194.84.242.126 10 2178
193.125.152.1 194.85.80.238 18 1178
193.125.152.1 194.85.128.10 25 1375
193.125.152.1 194.85.137.89 8 440
194.87.13.12 195.208.94.133 33 20968
193.125.152.1 194.85.224.33 28 1708
193.125.152.1 194.85.224.34 26 1586
193.125.152.1 194.87.0.20 12 873
193.125.152.1 194.87.5.3 8 448
193.125.152.1 194.87.5.21 2 518
193.125.152.1 194.87.13.2 4 224
193.125.152.1 194.87.44.1 1 146
193.125.152.1 194.87.210.41 2 402
194.87.13.12 195.182.129.11 23 15865
194.87.13.12 195.170.195.70 63 44135
194.87.13.12 195.144.192.198 31 6314
193.125.152.1 194.117.64.34 20 1271
193.125.152.1 194.135.34.19 13 2470
193.125.152.1 194.135.34.85 12 2254
193.125.152.1 194.135.34.136 6 866
193.125.152.1 194.135.34.150 2 488
193.125.152.1 194.135.34.159 1 467
193.125.152.1 194.135.34.212 11 2560
193.125.152.1 194.135.34.229 2 337
193.125.152.1 194.135.34.233 4 680
193.125.152.1 194.135.102.10 2 414
193.125.152.1 194.135.178.74 7 1162
193.125.152.1 194.154.93.80 2 284
194.87.13.12 195.128.140.3 14 872
193.125.152.1 194.190.218.2 2 518
194.87.13.12 195.128.130.2 4 352
194.87.13.12 195.98.162.155 75 60095
194.87.13.12 195.98.162.78 98 64468
193.125.152.1 194.220.36.1 37 2850
193.125.152.1 194.220.146.79 2 522
194.87.13.12 195.98.162.9 62 13543
194.87.13.12 195.98.161.59 7 476
194.87.13.12 195.98.161.32 12 865
204.62.128.51 195.19.1.132 43 38029
204.62.128.48 193.124.97.153 9 3356
204.59.144.222 194.85.149.1 2 266
193.125.152.1 195.5.128.130 2 512
194.87.13.12 195.98.161.25 8 3438
193.125.152.1 195.16.104.35 5 280
193.125.152.1 195.34.19.108 2 312
193.125.152.1 195.34.32.11 2 476
193.125.152.1 195.34.41.33 9 504
194.87.13.12 195.90.136.148 32 3564
194.87.13.12 195.90.136.143 10 890
193.125.152.1 195.46.160.2 8 448
193.125.152.1 195.46.160.34 2 630
193.125.152.1 195.54.193.9 18 1405
193.125.152.1 195.91.133.77 4 1212
193.125.152.1 195.98.55.1 18 1405
193.125.152.1 195.133.94.129 23 1485
193.125.152.1 195.138.67.91 8 544
193.125.152.1 195.138.80.33 19 1245
193.125.152.1 195.138.80.34 20 1308
193.125.152.1 195.146.64.131 4 472
193.125.152.1 195.161.8.6 19 1445
193.125.152.1 195.161.8.159 42 3569
194.87.13.12 195.54.8.139 74 6178
193.125.152.1 195.208.141.38 2 512
193.125.152.1 195.209.37.18 2 670
193.125.152.1 195.209.39.133 8 1698
194.87.13.12 195.46.165.250 2 80
193.125.152.1 195.218.133.114 24 1905
194.87.13.12 195.46.165.196 9 3478
193.125.152.1 195.230.64.66 101 4508
193.125.152.1 195.239.88.50 37 1480
193.125.152.1 195.239.193.64 2 476
193.125.152.1 195.239.210.2 2 500
194.87.13.12 195.46.164.25 69 4776
194.87.13.12 195.46.164.17 28 16790
194.87.13.12 195.46.163.158 30 6337
194.87.13.12 195.46.163.89 56 28328
194.87.13.12 195.46.163.15 8 336
194.87.13.12 195.46.162.213 4 160
194.87.13.12 195.46.162.206 41 25676
194.87.13.12 195.46.162.196 54 38487
194.87.13.12 195.46.162.173 63 40346
194.87.13.12 195.46.162.55 7 657
194.87.13.12 195.46.162.31 5 200
194.87.13.12 195.46.161.242 67 20130
194.87.13.12 195.46.161.219 5 1831
194.87.13.12 195.46.161.210 12 13389
194.87.13.12 195.46.161.209 64 26136
194.87.13.12 195.46.161.111 47 3947
194.87.13.12 195.16.101.109 31 2924
194.87.13.12 195.16.101.101 42 3051
194.87.13.12 195.16.98.99 13 903
194.87.13.12 195.9.103.3 74 5122
194.87.13.12 194.220.215.111 75 5304
194.87.13.12 194.220.215.110 22 2367
194.87.13.12 194.220.215.66 6 539
194.87.13.12 194.190.82.40 14 1558
194.87.13.12 193.125.19.101 23 2074
194.87.13.12 193.124.241.239 10 4274
194.87.13.12 193.124.114.33 42 13726
193.125.152.1 62.76.114.44 9 2780
194.87.13.8 212.20.8.250 110 87859
194.87.13.8 195.222.130.242 4 527
194.87.13.8 195.210.182.31 9 1222
194.87.13.8 195.210.179.4 14 15689
194.87.13.8 195.210.154.48 13 1602
194.87.13.8 195.210.136.135 163 171207
194.87.13.8 195.210.130.50 8 6213
194.87.13.8 195.210.128.65 6 408
194.87.13.8 195.208.94.133 63 43061
194.87.13.8 195.208.76.33 5 355
194.87.13.8 195.208.67.19 400 446069
194.87.13.8 195.208.64.146 50 39549
194.87.13.8 195.208.64.144 12 12685
194.87.13.8 195.182.129.11 16 18647
194.87.13.8 195.170.195.70 14 2119
194.87.13.8 195.146.70.100 49 27151
194.87.13.8 195.144.198.159 12 1336
194.87.13.8 195.144.192.198 16 2213
194.87.13.8 195.128.140.71 15 6105
194.87.13.8 195.128.140.3 8 821
194.87.13.8 195.98.162.170 5 699
194.87.13.8 195.98.162.155 43 43382
194.87.13.8 195.98.162.153 12 8634
194.87.13.8 195.98.162.78 57 25228
194.87.13.8 195.98.162.9 94 33009
194.87.13.8 195.98.161.57 4 6000
194.87.13.8 195.98.161.41 52 57725
194.87.13.8 195.98.161.32 6 433
194.87.13.8 195.96.174.178 17 20989
194.87.13.8 195.96.163.66 13 8510
194.87.13.8 195.90.188.105 169 68987
194.87.13.8 195.90.188.98 13 13679
194.87.13.8 195.90.185.38 100 23568
194.87.13.8 195.90.162.2 26 9575
194.87.13.8 195.90.136.148 25 3160
194.87.13.8 195.90.136.143 4 2024
194.87.13.8 195.90.132.57 4 1398
194.87.13.8 195.54.8.139 33 10681
194.87.13.8 195.54.5.129 4 735
194.87.13.8 195.46.165.250 5 697
194.87.13.8 195.46.165.215 23 10108
194.87.13.8 195.46.164.25 25 2325
194.87.13.8 195.46.164.17 16 11423
194.87.13.8 195.46.164.16 9 6253
194.87.13.8 195.46.163.171 50 24920
194.87.13.8 195.46.163.158 19 6681
194.87.13.8 195.46.163.156 18 19033
194.87.13.8 195.46.163.123 11 10683
194.87.13.8 195.46.163.89 69 36648
194.87.13.8 195.46.163.15 4 353
194.87.13.8 195.46.163.7 173 112297
194.87.13.8 195.46.162.206 12 2050
194.87.13.8 195.46.162.196 30 35369
194.87.13.8 195.46.162.184 80 104089
194.87.13.8 195.46.162.173 18 16346
194.87.13.8 195.46.162.91 306 246711
194.87.13.8 195.46.162.55 5 393
194.87.13.8 195.46.162.31 9 557
194.87.13.8 195.46.162.13 10 1014
194.87.13.8 195.46.161.242 44 35502
194.87.13.8 195.46.161.210 15 18274
194.87.13.8 195.46.161.209 24 15531
194.87.13.8 195.46.161.186 31 27219
194.87.13.8 195.46.161.170 9 1482
194.87.13.8 195.46.161.133 21 24725
194.87.13.8 195.46.161.123 11 10683
194.87.13.8 195.46.161.111 26 2791
194.87.13.8 195.46.161.83 25 10320
194.87.13.8 195.46.161.71 124 123406
194.87.13.8 195.46.160.69 11 10785
194.87.13.8 195.16.101.109 5 393
193.125.152.3 158.250.39.28 2 126
193.125.152.3 158.250.100.24 2 734
193.125.152.3 159.93.17.7 4 234
194.87.13.8 195.16.101.101 57 53033
194.87.13.8 195.16.98.99 100 68835
194.87.13.8 195.16.98.37 24 4428
194.87.13.8 195.12.35.2 18 17726
194.87.13.8 195.9.103.3 76 32081
194.87.13.8 195.9.96.7 22 14498
194.87.13.8 194.220.215.111 16 2352
194.87.13.8 194.220.215.110 13 1554
194.87.13.8 194.220.215.66 5 759
194.87.13.8 194.220.53.195 7 797
194.87.13.8 194.135.178.214 70 27886
194.87.13.8 194.135.111.18 260 289019
194.87.13.8 194.85.149.18 6 475
194.87.13.8 194.58.72.102 5 703
194.87.13.8 193.124.241.239 13 6926
194.87.13.8 193.124.241.39 31 18403
194.87.13.8 193.124.121.118 17 1675
194.87.13.8 193.124.114.33 43 19148
194.87.13.6 195.98.162.153 2 120
194.87.13.2 212.20.8.250 16 3749
194.87.13.2 212.20.8.246 5 1259
194.87.13.2 212.20.1.95 33 7367
194.87.13.2 195.238.68.234 9 2454
194.87.13.2 195.222.138.108 7 1203
194.87.13.2 195.222.130.242 21 5860
194.87.13.2 195.210.190.19 19 4260
194.87.13.2 195.210.189.1 5 1119
194.87.13.2 195.210.182.31 35 26895
194.87.13.2 195.210.176.170 4 1079
194.87.13.2 195.210.174.6 5 1119
194.87.13.2 195.210.164.25 5 1119
194.87.13.2 195.210.154.164 9 2484
194.87.13.2 195.210.154.152 8 1376
193.125.152.3 192.188.189.3 2 136
194.87.13.2 195.210.154.48 43 28721
194.87.13.2 195.210.150.2 31 6855
194.87.13.2 195.210.148.242 17 2910
194.87.13.2 195.210.143.145 7 2110
194.87.13.2 195.210.136.145 20 3862
194.87.13.2 195.210.136.135 9 1423
194.87.13.2 195.210.136.131 7 1353
194.87.13.2 195.210.130.50 16 14690
194.87.13.2 195.208.94.133 33 9913
194.87.13.2 195.208.93.154 9 1411
194.87.13.2 195.208.72.139 4 1079
194.87.13.2 195.208.72.47 8 2154
194.87.13.2 195.208.67.19 4 1079
194.87.13.2 195.208.67.10 8 1376
194.87.13.2 195.208.64.152 4 1079
194.87.13.2 195.208.64.144 6 2066
193.125.152.3 193.124.5.37 11 1336
193.125.152.3 193.124.5.50 2 266
193.125.152.3 193.124.5.54 4 692
193.125.152.3 193.124.22.22 11 2138
193.125.152.3 193.124.22.65 141 15806
193.125.152.3 193.124.32.129 5 1116
193.125.152.3 193.124.57.100 3 197
193.125.152.3 193.124.76.86 1 278
194.87.13.2 195.208.64.129 6 1167
193.125.152.3 193.124.110.130 2 766
193.125.152.3 193.124.134.19 4 548
194.87.13.2 195.182.129.8 9 3525
193.125.152.3 193.124.148.73 9 1408
193.125.152.3 193.124.171.67 2 354
193.125.152.3 193.124.182.40 2 144
193.125.152.3 193.124.241.39 2 356
193.125.152.3 193.124.241.83 4 866
194.87.13.2 195.182.128.2 39 9020
193.125.152.3 193.124.250.22 79 12968
193.125.152.3 193.125.80.35 2 300
194.87.13.2 195.170.195.70 55 42078
194.87.13.2 195.146.71.226 5 1119
194.87.13.2 195.146.71.178 53 11410
194.87.13.2 195.146.70.100 6 2070
194.87.13.2 195.146.70.97 7 1199
194.87.13.2 195.144.198.159 44 14597
194.87.13.2 195.144.192.198 17 4040
194.87.13.2 195.128.144.142 7 2110
194.87.13.2 195.128.144.133 6 2342
194.87.13.2 195.128.140.71 19 16072
194.87.13.2 195.128.140.3 22 5159
194.87.13.2 195.128.139.110 13 2642
194.87.13.2 195.128.139.94 18 6772
193.125.152.3 193.193.193.100 2 132
193.125.152.3 193.193.193.107 4 1148
193.125.152.3 193.193.226.226 3 489
194.87.13.2 195.128.138.136 6 1309
194.87.13.2 195.128.136.186 20 4622
193.125.152.3 193.232.8.20 5 323
193.125.152.3 193.232.68.1 2 120
193.125.152.3 193.232.88.17 44 4923
193.125.152.3 193.232.88.125 2 388
193.125.152.3 193.232.112.1 2 134
193.125.152.3 193.232.127.78 20 4237
193.125.152.3 193.232.212.12 9 1177
193.125.152.3 193.232.232.66 4 1210
193.125.152.3 193.233.48.9 7 447
193.125.152.3 193.233.48.65 2 130
193.125.152.3 193.233.56.200 2 294
193.125.152.3 193.233.78.1 2 276
193.125.152.3 193.233.86.14 4 240
193.125.152.3 193.233.86.33 4 240
193.125.152.3 193.233.192.19 2 118
193.125.152.3 193.233.208.3 4 238
193.125.152.3 193.233.224.1 4 800
194.87.13.2 195.128.136.71 6 1159
194.87.13.2 195.128.134.99 5 1264
194.87.13.2 195.128.132.70 23 6787
194.87.13.2 195.128.129.155 4 1079
194.87.13.2 195.128.128.98 30 17304
193.125.152.3 194.44.157.250 2 134
194.87.13.2 195.128.128.70 5 2372
194.87.13.2 195.128.128.66 8 2422
193.125.152.3 194.58.101.95 12 2368
193.125.152.3 194.58.124.24 2 320
194.87.13.2 195.128.128.3 5 1187
193.125.152.3 194.58.230.249 7 1050
194.87.13.2 195.112.226.35 23 956
193.125.152.3 194.67.1.154 9 1436
193.125.152.3 194.67.2.97 11 1861
193.125.152.3 194.67.2.98 12 973
193.125.152.3 194.67.66.176 2 122
193.125.152.3 194.67.82.228 2 552
193.125.152.3 194.67.110.2 4 688
193.125.152.3 194.67.114.81 3 198
193.125.152.3 194.67.114.193 5 330
193.125.152.3 194.67.115.35 5 330
193.125.152.3 194.67.115.38 2 412
193.125.152.3 194.67.128.130 2 330
194.87.13.2 195.98.162.189 11 2282
194.87.13.2 195.98.162.182 10 3433
194.87.13.2 195.98.162.170 56 55418
194.87.13.2 195.98.162.165 12 2318
193.125.152.3 194.84.2.73 2 298
193.125.152.3 194.84.17.34 17 2183
193.125.152.3 194.84.21.18 6 1320
193.125.152.3 194.84.23.125 21 1523
193.125.152.3 194.84.31.233 11 5316
193.125.152.3 194.84.32.67 2 138
193.125.152.3 194.84.39.28 7 981
193.125.152.3 194.84.48.11 2 130
193.125.152.3 194.84.54.130 2 358
193.125.152.3 194.84.86.6 1 58
193.125.152.3 194.84.96.57 6 387
193.125.152.3 194.84.122.1 20 1460
193.125.152.3 194.84.132.2 8 2208
193.125.152.3 194.84.167.1 2 146
193.125.152.3 194.84.168.49 4 670
193.125.152.3 194.84.204.131 2 146
193.125.152.3 194.84.204.222 2 476
193.125.152.3 194.84.206.3 5 305
193.125.152.3 194.84.206.193 18 1098
193.125.152.3 194.84.223.2 2 148
193.125.152.3 194.84.243.71 2 300
194.87.13.2 195.98.162.164 9 1287
194.87.13.2 195.98.162.160 29 8361
194.87.13.2 195.98.162.155 8 2174
194.87.13.2 195.98.162.151 15 3499
194.87.13.2 195.98.162.147 6 1300
193.125.152.3 194.85.128.10 28 1552
193.125.152.3 194.85.137.89 76 4180
194.87.13.2 195.98.162.141 22 5639
194.87.13.2 195.98.162.135 35 10480
194.87.13.2 195.98.162.131 31 25682
194.87.13.2 195.98.162.118 5 1262
194.87.13.2 195.98.162.114 6 1159
193.125.152.3 194.85.200.204 6 816
193.125.152.3 194.85.224.33 68 4150
193.125.152.3 194.85.224.34 64 3904
193.125.152.3 194.87.0.8 4 294
193.125.152.3 194.87.0.22 50 8498
193.125.152.3 194.87.0.242 24 4272
193.125.152.3 194.87.37.2 2 308
193.125.152.3 194.87.43.111 2 114
193.125.152.3 194.87.110.35 2 114
193.125.152.3 194.87.157.34 2 318
193.125.152.3 194.87.161.7 2 430
193.125.152.3 194.87.162.120 2 308
193.125.152.3 194.87.186.1 4 692
193.125.152.3 194.87.210.41 2 112
193.125.152.3 194.87.224.99 5 875
193.125.152.3 194.87.233.66 2 238
193.125.152.3 194.87.239.39 2 358
194.87.13.2 195.98.162.111 5 1119
194.87.13.2 195.98.162.102 7 1341
194.87.13.2 195.98.162.97 5 2030
194.87.13.2 195.98.162.94 13 2362
194.87.13.2 195.98.162.78 134 104964
194.87.13.2 195.98.162.77 6 1163
194.87.13.2 195.98.162.73 15 5512
194.87.13.2 195.98.162.72 26 5763
194.87.13.2 195.98.162.66 4 1225
194.87.13.2 195.98.162.9 231 74902
194.87.13.2 195.98.161.71 13 3581
193.125.152.3 194.135.2.131 16 3134
193.125.152.3 194.135.34.42 3 733
193.125.152.3 194.135.34.85 11 2042
193.125.152.3 194.135.34.136 6 866
194.87.13.2 195.98.161.67 10 2513
193.125.152.3 194.135.102.10 8 1490
193.125.152.3 194.135.161.11 13 1287
193.125.152.3 194.154.82.67 2 304
193.125.152.3 194.154.82.122 2 102
194.87.13.2 195.98.161.59 20 4472
193.125.152.3 194.186.38.34 2 298
193.125.152.3 194.186.113.254 5 644
193.125.152.3 194.186.170.253 2 476
193.125.152.3 194.186.208.51 4 550
193.125.152.3 194.186.212.137 2 336
193.125.152.3 194.186.254.23 2 360
194.87.13.2 195.98.161.57 28 6345
193.125.152.3 194.190.105.2 2 232
193.125.152.3 194.190.163.127 6 702
193.125.152.3 194.190.195.66 4 268
193.125.152.3 194.190.199.1 2 430
193.125.152.3 194.190.215.113 10 1471
193.125.152.3 194.190.216.124 2 448
193.125.152.3 194.190.218.2 4 598
194.87.13.2 195.98.161.46 8 1387
194.87.13.2 195.98.161.40 11 3193
194.87.13.2 195.98.161.33 13 3387
194.87.13.2 195.98.160.174 5 1119
194.87.13.2 195.98.160.148 11 1907
194.87.13.2 195.98.160.146 8 428
194.87.13.2 195.96.163.66 37 22436
194.87.13.2 195.90.188.112 8 2150
194.87.13.2 195.90.188.111 5 1237
193.125.152.3 194.220.146.79 2 322
194.87.13.2 195.90.188.105 27 7280
193.125.152.3 194.226.167.195 14 1947
194.87.13.2 195.90.188.101 1 1089
194.87.13.2 195.90.186.228 7 1332
194.87.13.2 195.90.185.38 20 3294
194.87.13.2 195.90.183.122 12 3627
194.87.13.2 195.90.180.25 22 18568
204.58.155.18 144.206.2.1 3 173
204.57.67.249 194.58.72.120 4 160
204.57.67.150 195.146.67.100 5 200
204.57.67.150 194.58.72.120 4 160
204.57.67.146 195.146.67.100 5 200
204.57.67.146 194.58.72.120 4 160
194.87.13.2 195.90.180.12 4 1300
194.87.13.2 195.90.162.2 53 15773
193.125.152.3 195.5.128.130 4 814
193.125.152.3 195.5.141.6 11 1500
193.125.152.3 195.5.151.21 5 615
194.87.13.2 195.90.158.23 3 1035
194.87.13.2 195.90.152.133 3 124
193.125.152.3 195.7.179.36 4 744
194.87.13.2 195.90.146.80 4 1075
194.87.13.2 195.90.145.35 6 2070
193.125.152.3 195.9.90.65 66 14486
193.125.152.3 195.9.90.70 3 615
193.125.152.3 195.9.94.33 2 140
193.125.152.3 195.12.66.1 4 250
193.125.152.3 195.16.96.2 3 482
193.125.152.3 195.16.101.2 2 126
193.125.152.3 195.16.114.47 3 192
194.87.13.2 195.90.145.1 3 1180
193.125.152.3 195.19.160.1 6 1066
193.125.152.3 195.19.188.66 4 248
194.87.13.2 195.90.142.27 7 2280
194.87.13.2 195.90.137.230 4 1075
194.87.13.2 195.90.136.148 4 1276
194.87.13.2 195.90.136.143 4 1260
194.87.13.2 195.90.136.135 6 2066
193.125.152.3 195.26.160.48 3 434
193.125.152.3 195.34.0.1 4 618
193.125.152.3 195.34.17.13 4 843
193.125.152.3 195.34.32.11 2 352
193.125.152.3 195.34.41.33 3 495
193.125.152.3 195.46.160.4 7 1412
193.125.152.3 195.46.163.120 42 9840
193.125.152.3 195.54.2.1 9 1433
193.125.152.3 195.54.192.33 20 2704
193.125.152.3 195.54.193.30 2 230
194.87.13.2 195.90.136.82 10 2230
194.87.13.2 195.90.134.250 7 2387
193.125.152.3 195.90.128.103 2 455
193.125.152.3 195.90.128.107 3 197
193.125.152.3 195.90.136.1 2 286
193.125.152.3 195.90.158.139 6 318
193.125.152.3 195.90.184.66 15 2690
193.125.152.3 195.91.133.54 28 5845
193.125.152.3 195.96.65.2 23 5249
193.125.152.3 195.98.64.65 2 494
193.125.152.3 195.98.162.10 2 520
193.125.152.3 195.98.163.16 2 144
194.87.13.2 195.90.132.67 7 1199
194.87.13.2 195.90.132.57 9 2318
193.125.152.3 195.128.128.1 18 1801
193.125.152.3 195.133.0.8 6 420
193.125.152.3 195.133.103.1 2 274
194.87.13.2 195.90.132.10 7 2256
193.125.152.3 195.146.64.42 5 736
193.125.152.3 195.146.72.34 4 232
194.87.13.2 195.90.132.3 9 2190
194.87.13.2 195.90.128.103 27 7388
193.125.152.3 195.151.16.12 2 288
193.125.152.3 195.151.16.13 2 436
193.125.152.3 195.151.35.66 9 1339
193.125.152.3 195.151.108.130 2 280
193.125.152.3 195.151.163.75 3 552
193.125.152.3 195.161.0.135 6 543
193.125.152.3 195.161.20.33 3 552
193.125.152.3 195.161.21.2 3 186
193.125.152.3 195.161.21.130 5 291
193.125.152.3 195.178.199.130 2 104
193.125.152.3 195.208.49.11 2 282
193.125.152.3 195.208.72.3 3 363
193.125.152.3 195.208.93.132 3 416
194.87.13.2 195.72.224.74 16 3667
194.87.13.2 195.54.8.139 28 17598
193.125.152.3 195.208.248.36 2 512
193.125.152.3 195.208.252.2 2 346
193.125.152.3 195.208.252.180 2 118
193.125.152.3 195.209.0.6 4 236
193.125.152.3 195.209.63.161 2 446
193.125.152.3 195.210.128.6 2 264
194.87.13.2 195.54.6.67 5 1266
194.87.13.2 195.54.5.129 60 27325
193.125.152.3 195.218.218.37 4 264
193.125.152.3 195.222.130.67 3 186
193.125.152.3 195.239.46.189 2 706
193.125.152.3 195.239.193.64 2 374
193.125.152.3 195.239.210.2 1 51
194.87.13.2 195.54.2.8 6 1438
194.87.13.2 195.46.165.248 16 6178
194.87.13.2 195.46.165.239 10 4284
194.87.13.2 195.46.165.227 8 2254
194.87.13.2 195.46.165.226 11 6825
194.87.13.2 195.46.165.204 6 2070
194.87.13.2 195.46.165.200 70 42657
194.87.13.2 195.46.165.196 10 4963
194.87.13.2 195.46.165.194 7 2110
194.87.13.2 195.46.165.193 10 5874
194.87.13.2 195.46.165.191 7 2400
194.87.13.2 195.46.165.172 14 11492
194.87.13.2 195.46.165.162 19 11262
194.87.13.2 195.46.165.158 7 2382
194.87.13.2 195.46.165.151 8 2254
194.87.13.2 195.46.165.145 161 74887
194.87.13.2 195.46.165.135 26 11996
194.87.13.2 195.46.165.133 14 5629
194.87.13.2 195.46.164.27 11 2278
194.87.13.2 195.46.164.25 64 67188
194.87.13.2 195.46.164.17 35 26017
194.87.13.2 195.46.164.16 6 1300
194.87.13.2 195.46.164.8 14 5798
194.87.13.2 195.46.164.6 5 1254
194.87.13.2 195.46.164.2 4 1079
194.87.13.2 195.46.163.180 5 1187
194.87.13.2 195.46.163.178 25 2053
194.87.13.2 195.46.163.174 5 1119
194.87.13.2 195.46.163.160 8 1365
194.87.13.2 195.46.163.159 5 1119
194.87.13.2 195.46.163.158 28 17225
194.87.13.2 195.46.163.156 16 3397
194.87.13.2 195.46.163.147 6 1163
194.87.13.2 195.46.163.136 5 1119
194.87.13.2 195.46.163.133 10 2370
194.87.13.2 195.46.163.132 6 1284
194.87.13.2 195.46.163.123 15 3503
194.87.13.2 195.46.163.120 14 3613
194.87.13.2 195.46.163.105 6 1294
194.87.13.2 195.46.163.94 5 1119
194.87.13.2 195.46.163.89 132 107364
194.87.13.2 195.46.163.76 13 2646
194.87.13.2 195.46.163.65 20 4627
194.87.13.2 195.46.163.60 8 1239
194.87.13.2 195.46.163.47 7 2110
194.87.13.2 195.46.163.38 17 3593
194.87.13.2 195.46.163.31 9 2378
194.87.13.2 195.46.163.30 14 2506
194.87.13.2 195.46.163.13 18 3681
194.87.13.2 195.46.163.7 21 3885
194.87.13.2 195.46.162.243 19 4865
194.87.13.2 195.46.162.226 8 2440
194.87.13.2 195.46.162.221 21 2981
194.87.13.2 195.46.162.218 5 1265
194.87.13.2 195.46.162.213 5 1257
194.87.13.2 195.46.162.206 59 43287
194.87.13.2 195.46.162.203 5 1119
194.87.13.2 195.46.162.196 18 14883
194.87.13.2 195.46.162.193 5 1119
194.87.13.2 195.46.162.184 13 1455
194.87.13.2 195.46.162.180 5 1119
194.87.13.2 195.46.162.179 9 3109
194.87.13.2 195.46.162.177 4 1079
194.87.13.2 195.46.162.173 8 2499
194.87.13.2 195.46.162.172 6 1159
194.87.13.2 195.46.162.169 8 2420
194.87.13.2 195.46.162.165 4 1079
194.87.13.2 195.46.162.120 5 1119
194.87.13.2 195.46.162.119 5 1262
194.87.13.2 195.46.162.104 4 1079
194.87.13.2 195.46.162.100 6 1290
194.87.13.2 195.46.162.72 5 1119
194.87.13.2 195.46.162.70 10 2373
194.87.13.2 195.46.162.60 14 3601
194.87.13.2 195.46.162.55 27 28360
194.87.13.2 195.46.162.53 7 1203
194.87.13.2 195.46.162.47 21 3887
194.87.13.2 195.46.162.42 12 2624
194.87.13.2 195.46.162.40 11 2420
194.87.13.2 195.46.162.34 11 2411
194.87.13.2 195.46.162.30 7 1207
194.87.13.2 195.46.162.28 18 3603
194.87.13.2 195.46.162.13 42 51477
194.87.13.2 195.46.162.8 5 1119
194.87.13.2 195.46.162.6 9 2452
194.87.13.2 195.46.162.1 14 2562
194.87.13.2 195.46.161.252 5 1119
194.87.13.2 195.46.161.251 21 4943
194.87.13.2 195.46.161.236 5 1260
193.125.152.3 212.192.34.200 2 298
193.125.152.3 212.248.39.3 3 174
194.87.13.2 195.46.161.233 5 1262
194.87.13.2 195.46.161.224 11 1508
194.87.13.2 195.46.161.217 22 5891
194.87.13.2 195.46.161.209 11 2619
194.87.13.2 195.46.161.207 20 2351
193.125.152.3 62.76.0.1 12 888
193.125.152.3 62.76.114.44 4 861
194.87.13.2 195.46.161.205 5 1119
194.87.13.2 195.46.161.201 5 1262
194.87.13.2 195.46.161.199 13 4623
194.87.13.2 195.46.161.186 90 82991
193.125.152.4 193.124.1.131 20 1742
193.125.152.4 193.124.22.81 402 73761
193.125.152.4 193.124.36.34 37 8132
193.125.152.4 193.124.188.65 101 48405
193.125.152.4 193.125.44.76 6 240
193.125.152.4 193.125.80.35 37 3336
193.125.152.4 193.233.208.3 4 240
193.125.152.4 194.58.38.18 36 3384
194.87.13.2 195.46.161.184 5 1119
193.125.152.4 194.58.124.17 39 3399
193.125.152.4 194.58.212.34 25 3742
193.125.152.4 194.67.80.42 25 1795
193.125.152.4 194.84.44.35 18 1638
193.125.152.4 194.87.0.20 82 19845
193.125.152.4 194.87.160.195 17 1150
193.125.152.4 194.87.206.137 19 1690
193.125.152.4 194.87.211.1 103 8898
194.87.13.2 195.46.161.177 6 2360
194.87.13.2 195.46.161.172 5 1259
193.125.152.4 194.154.92.129 31 5655
193.125.152.4 194.186.221.251 19 1238
193.125.152.4 194.186.254.26 62 31955
193.125.152.4 194.190.194.33 16 1534
194.87.13.2 195.46.161.171 16 3685
204.57.67.27 194.58.72.120 4 160
193.125.152.4 195.9.16.2 23 1913
193.125.152.4 195.12.66.81 16 1534
194.87.13.2 195.46.161.170 32 7476
193.125.152.4 195.54.2.7 17 1586
193.125.152.4 195.58.1.145 35 7789
193.125.152.4 195.90.136.21 94 11466
193.125.152.4 195.222.130.67 17 1577
193.125.152.4 195.239.88.50 21 1220
194.87.13.2 195.46.161.164 7 2364
194.87.13.2 195.46.161.156 12 2478
194.87.13.2 195.46.161.155 6 1296
194.87.13.2 195.46.161.154 11 2282
194.87.13.2 195.46.161.153 5 1256
194.87.13.2 195.46.161.146 6 252
194.87.13.2 195.46.161.113 11 3596
194.87.13.2 195.46.161.111 16 3598
193.125.152.5 193.124.22.65 18 1368
194.87.13.2 195.46.161.109 4 1079
194.87.13.2 195.46.161.85 10 1383
194.87.13.2 195.46.161.84 21 4799
194.87.13.2 195.46.161.83 121 57225
194.87.13.2 195.46.161.75 3 124
193.125.152.6 193.124.22.22 2 88
193.125.152.6 193.124.22.65 15 930
193.125.152.6 193.232.119.131 2 80
194.87.13.2 195.46.160.69 147 34960
193.125.152.6 194.226.235.33 6 254
194.87.13.2 195.38.160.38 10 1591
194.87.13.2 195.16.108.139 10 9589
193.125.152.6 195.91.161.2 4 176
193.125.152.6 195.128.140.2 19 5145
193.125.152.6 195.161.24.66 23 1283
194.87.13.2 195.16.108.135 8 3272
194.87.13.2 195.16.102.4 8 2154
194.87.13.2 195.16.101.101 4 1280
194.87.13.2 195.16.101.67 72 52581
193.125.152.6 212.46.3.250 4 176
193.125.152.8 193.124.22.65 4 224
194.87.13.2 195.16.98.235 22 3020
193.125.152.8 193.124.224.35 14 2571
194.87.13.2 195.16.98.230 7 1330
194.87.13.2 195.16.98.209 10 3463
194.87.13.2 195.16.98.204 27 5394
194.87.13.2 195.16.98.194 13 3269
194.87.13.2 195.16.98.193 14 4507
194.87.13.2 195.16.98.99 7 1400
194.87.13.2 195.16.98.37 44 49756
194.87.13.2 195.16.98.13 14 3317
193.125.152.10 158.250.26.145 18 1368
194.87.13.2 195.16.96.9 11 2554
194.87.13.2 195.12.32.170 8 3451
193.125.152.10 193.124.22.65 18 1368
193.125.152.10 193.233.11.84 4 304
193.125.152.10 194.67.64.33 18 1368
193.125.152.10 194.67.65.17 18 1368
193.125.152.10 194.67.65.18 18 1368
193.125.152.10 194.67.65.130 18 1368
193.125.152.10 194.67.106.209 20 1520
193.125.152.10 194.84.127.22 12 912
194.87.13.2 195.12.32.165 27 4363
194.87.13.2 195.12.32.52 5 2138
194.87.13.2 195.12.32.7 4 1219
193.125.152.10 194.190.105.2 2 152
193.125.152.10 194.190.105.4 1 76
193.125.152.10 194.190.105.7 2 152
193.125.152.10 195.5.128.42 18 1368
193.125.152.10 195.5.138.6 18 1368
193.125.152.10 195.5.138.44 16 1216
193.125.152.10 195.26.160.48 15 1140
193.125.152.10 195.26.160.50 18 1368
193.125.152.10 195.54.192.1 2 152
193.125.152.10 195.54.192.43 2 152
193.125.152.10 195.133.94.129 4 336
193.125.152.10 195.151.111.45 13 988
194.87.13.2 195.9.176.153 18 5299
194.87.13.2 195.9.103.3 184 183787
194.87.13.2 195.9.96.7 96 66779
193.125.152.12 193.124.22.65 2 152
193.125.152.15 193.124.22.65 18 1368
193.125.152.16 193.124.22.65 15 1140
193.125.152.17 193.124.22.22 12 906
193.125.152.17 193.124.22.65 12 912
193.125.152.18 193.124.22.65 2 152
204.57.67.9 195.146.67.100 5 200
194.87.13.2 195.9.94.33 11 2544
193.125.152.19 193.124.22.65 13 988
194.87.13.2 195.9.90.85 139 61939
194.87.13.2 195.9.67.45 18 3485
193.125.152.23 193.124.22.65 4 246
194.87.13.2 195.9.47.230 7 2488
193.125.152.23 194.87.0.28 3783 538698
193.125.152.23 194.186.254.26 6986 644105
194.87.13.2 194.220.215.111 73 61702
193.125.152.24 192.124.174.67 5717 2168144
194.87.13.2 194.220.215.110 56 45039
193.125.152.24 193.124.97.131 504 27627
194.87.13.2 194.220.215.66 59 35775
194.87.13.2 194.220.169.1 32 14343
193.125.152.24 193.125.95.121 1040 572488
194.87.13.2 194.220.140.106 6 1159
194.87.13.2 194.190.105.4 40 8033
194.87.13.2 194.190.82.40 34 24976
193.125.152.24 194.58.72.102 2072 1038564
193.125.152.24 194.58.110.33 649 310072
194.87.13.2 194.190.56.83 11 1499

View File

@ -1,71 +0,0 @@
--
-- A quick test of the IP address code
--
-- $Id: test.sql,v 1.2 1998/06/16 05:35:12 momjian Exp $
-- This is original test (it was written before my changes in this class). alex.
-- temporary table:
create table addresses (address ipaddr);
-- sample data from two subnets:
insert into addresses values ('158.37.96.15');
insert into addresses values ('158.37.96.16');
insert into addresses values ('158.37.96.17');
insert into addresses values ('158.37.97.15');
insert into addresses values ('158.37.97.16');
insert into addresses values ('158.37.97.17');
insert into addresses values ('158.37.98.15');
insert into addresses values ('158.37.98.16');
insert into addresses values ('158.37.98.17');
insert into addresses values ('158.37.96.150');
insert into addresses values ('158.37.96.160');
insert into addresses values ('158.37.96.170');
insert into addresses values ('158.37.97.150');
insert into addresses values ('158.37.97.160');
insert into addresses values ('158.37.97.170');
insert into addresses values ('158.37.98.150');
insert into addresses values ('158.37.98.160');
insert into addresses values ('158.37.98.170');
-- show them all:
select * from addresses;
-- select the ones in subnet 96:
select * from addresses where ipaddr_in_net(address, '158.37.96.0/24');
-- select the ones not in subnet 96:
select * from addresses where not ipaddr_in_net(address, '158.37.96.0/24');
-- select the ones in subnet 97:
select * from addresses where ipaddr_in_net(address, '158.37.97.0/24');
-- select the ones not in subnet 97:
select * from addresses where not ipaddr_in_net(address, '158.37.97.0/24');
-- select the ones in subnet 96 or 97, sorted:
select * from addresses where ipaddr_in_net(address, '158.37.96.0/23')
order by address;
-- now some networks:
create table networks (network ipaddr);
-- now the subnets mentioned above:
insert into networks values ('158.37.96.0/24');
insert into networks values ('158.37.97.0/24');
insert into networks values ('158.37.98.0/24');
-- select the netmasks of the net containing each:
select address, ipaddr_mask(network) from addresses, networks
where ipaddr_in_net(address, network);
-- select the broadcast address of the net containing each:
select address, ipaddr_bcast(network) from addresses, networks
where ipaddr_in_net(address, network);
-- tidy up:
drop table addresses;
drop table networks;
--
-- eof
--

View File

@ -1,11 +0,0 @@
drop table stat_t;
create table stat_t(i1 ipaddr, i2 ipaddr, p int4, b int4);
create index stat_i1 on stat_t using btree (i1 ipaddr_ops);
create index stat_i2 on stat_t using btree (i2 ipaddr_ops);
copy stat_t from '/v/noc/src/ip_class/test.DATA' using delimiters ' ';
--
-- Please, check if your test data are not in /v/noc/src/ip_class/test.DATA file,
-- edit test1.sql file and repeatr it.
--
-- If everything is OK, you should run test2.sql now
--

View File

@ -1,26 +0,0 @@
vacuum verbose analyze stat_t (i1,i2);
--
--
select i2,sum(b) as b
into tmp
from stat_t
where i1 >= '144.206.0.0' and i1 <= '144.206.255.255'
group by i2;
insert into tmp
select '0.0.0.0' as i2,sum(b) as k
from tmp
where b < 10 * 1024;
delete from tmp
where b < 10 * 1024 and i2 <> '0.0.0.0';
select i2,b / 1024 as k from tmp
order by k desc;
select ipaddr_print(i2,'%A/%P'),b from tmp where i2 = '0.0.0.0';
drop table tmp;
explain select i2,sum(b) as b
into tmp
from stat_t
where i1 >= '144.206.0.0' and i1 <= '144.206.255.255'
group by i2;
-- ********************************************************
-- * Now remove test table by 'drop table stat_t' command *
-- ********************************************************

74
doc/README.ipaddr Normal file
View File

@ -0,0 +1,74 @@
PostgreSQL type extensions for IP and MAC addresses.
---------------------------------------------------
$Id: README.ipaddr,v 1.1 1998/10/03 05:40:41 momjian Exp $
I needed to record IP and MAC level ethernet addresses in a data
base, and I really didn't want to store them as plain strings, with
no enforced error checking, so I put together the accompanying code
as my first experiment with adding a data type to PostgreSQL. I
then thought that this might be useful to others, both directly and
as a very simple example of how to do this sort of thing, so I
submitted it to the PostgreSQL project for inclusion in the contrib
directory. Since then, that directory has been modified to contain
Aleksei Roudnev's implementation, which is based on mine.
For those who have seen my previous contribution of these types, note
that much has changed: I've modified the IP address type to work the
way Paul Vixie did with his CIDR type. In fact, I've pretty much just
stolen his solution, modifying it into my framework in such a way as
to facilitate the addition of IPV6 handling code in the future. I've
pretty much ignored Aleksei's C code, but I've added his SQL code to
enter the necessary operators into the various system tables needed to
make the types indexable.
IP addresses are implemented as a struct of fixed in-memory length,
but variable on-disk storage size. For IPV4, it contains the address
family (AF_INET), the CIDR prefix length and four byte address. For
IPV6, the address family will be different, and the address longer.
The external representation of an IP address generally looks like
'158.37.96.15/32'. This address happens to be part of a subnet where
I work; '158.37.96.0/24', which itself is a part of the larger subnet
allocated to our site, which is '158.37.96.0/21', which again, if you
go by the old book, is part of the class "B" net '158.37.0.0/16'.
Input and output functions are supplied, along with the "normal" <,
<=, =, >=, > and <> operators, which all do what you expect. In
addition, there are operators to check for networks or addresses being
subnets of or addresses contained within other networks. << tests
whether the left operand is contained within the right, <<= includes
equality, >> and >>= do the same things the opposite way.
The input and output functions use routines from Paul Vixie's BIND,
and I've snarfed the source files inet_net_ntop.c and inet_net_pton.c
directly from a recent distribution of that code. They are included
here to avoid the need to fetch and install the BIND libraries to be
able to use this code. IANAL, but it looks from the copyright
messages in the files as if this should be acceptable. Read the
documentation in inet_net_pton.c to see the legal input formats.
MAC level ethernet addresses are implemented as a 6 byte struct that
contains the address as unsigned chars. Several input forms are
accepted; the following are all the same address: '08002b:010203',
'08002b-010203', '0800.2b01.0203', '08-00-2b-01-02-03' and
'08:00:2b:01:02:03'. Upper and lower case is accepted for the digits
'a' through 'f'. Output is always in the latter of the given forms.
As with IP addresses, input and output functions are supplied as well
as the "normal" operators, which do what you expect. As an extra
feature, a function macaddr_manuf() is defined, which returns the name
of the manufacturer as a string. This is currently held in a
hard-coded struct internal to the C module -- it might be smarter to
put this information into an actual data base table, and look up the
manufacturer there.
Many thanks to Aleksei Roudnev and Paul Vixie for their fine work!
I don't know what changes are needed to the Makefile for other systems
than the one I'm running (NetBSD 1.3), but anyway: to install on a BSD
system: fix the path names in the Makefile if you need to, then make,
make install, slurp the SQL files into psql or whatever, and you're
off. Enjoy!
Bergen, Norway, 1998-08-09, Tom Ivar Helbekkmo (tih@nhh.no).

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
# Makefile for utils/adt
#
# IDENTIFICATION
# $Header: /cvsroot/pgsql/src/backend/utils/adt/Makefile,v 1.17 1998/08/24 01:38:04 momjian Exp $
# $Header: /cvsroot/pgsql/src/backend/utils/adt/Makefile,v 1.18 1998/10/03 05:40:47 momjian Exp $
#
#-------------------------------------------------------------------------
@ -23,7 +23,8 @@ OBJS = acl.o arrayfuncs.o arrayutils.o bool.o cash.o char.o chunk.o \
misc.o nabstime.o name.o not_in.o numutils.o \
oid.o oracle_compat.o \
regexp.o regproc.o ruleutils.o selfuncs.o sets.o \
tid.o timestamp.o varchar.o varlena.o version.o
tid.o timestamp.o varchar.o varlena.o version.o \
ip.o mac.o inet_net_ntop.o inet_net_pton.o
all: SUBSYS.o

View File

@ -0,0 +1,137 @@
/*
* Copyright (c) 1996 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static const char rcsid[] = "$Id: inet_net_ntop.c,v 1.1 1998/10/03 05:40:48 momjian Exp $";
#endif
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef SPRINTF_CHAR
#define SPRINTF(x) strlen(sprintf/**/x)
#else
#define SPRINTF(x) ((size_t)sprintf x)
#endif
static char *inet_net_ntop_ipv4(const u_char *src, int bits,
char *dst, size_t size);
/*
* char *
* inet_net_ntop(af, src, bits, dst, size)
* convert network number from network to presentation format.
* generates CIDR style result always.
* return:
* pointer to dst, or NULL if an error occurred (check errno).
* author:
* Paul Vixie (ISC), July 1996
*/
char *
inet_net_ntop(int af, const void *src, int bits, char *dst, size_t size)
{
switch (af)
{
case AF_INET:
return (inet_net_ntop_ipv4(src, bits, dst, size));
default:
errno = EAFNOSUPPORT;
return (NULL);
}
}
/*
* static char *
* inet_net_ntop_ipv4(src, bits, dst, size)
* convert IPv4 network number from network to presentation format.
* generates CIDR style result always.
* return:
* pointer to dst, or NULL if an error occurred (check errno).
* note:
* network byte order assumed. this means 192.5.5.240/28 has
* 0x11110000 in its fourth octet.
* author:
* Paul Vixie (ISC), July 1996
*/
static char *
inet_net_ntop_ipv4(const u_char *src, int bits, char *dst, size_t size)
{
char *odst = dst;
char *t;
u_int m;
int b;
if (bits < 0 || bits > 32)
{
errno = EINVAL;
return (NULL);
}
if (bits == 0)
{
if (size < sizeof "0")
goto emsgsize;
*dst++ = '0';
*dst = '\0';
}
/* Format whole octets. */
for (b = bits / 8; b > 0; b--)
{
if (size < sizeof "255.")
goto emsgsize;
t = dst;
dst += SPRINTF((dst, "%u", *src++));
if (b > 1)
{
*dst++ = '.';
*dst = '\0';
}
size -= (size_t) (dst - t);
}
/* Format partial octet. */
b = bits % 8;
if (b > 0)
{
if (size < sizeof ".255")
goto emsgsize;
t = dst;
if (dst != odst)
*dst++ = '.';
m = ((1 << b) - 1) << (8 - b);
dst += SPRINTF((dst, "%u", *src & m));
size -= (size_t) (dst - t);
}
/* Format CIDR /width. */
if (size < sizeof "/32")
goto emsgsize;
dst += SPRINTF((dst, "/%u", bits));
return (odst);
emsgsize:
errno = EMSGSIZE;
return (NULL);
}

View File

@ -0,0 +1,217 @@
/*
* Copyright (c) 1996 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static const char rcsid[] = "$Id: inet_net_pton.c,v 1.1 1998/10/03 05:40:49 momjian Exp $";
#endif
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef SPRINTF_CHAR
#define SPRINTF(x) strlen(sprintf/**/x)
#else
#define SPRINTF(x) ((size_t)sprintf x)
#endif
static int inet_net_pton_ipv4(const char *src, u_char *dst, size_t size);
/*
* static int
* inet_net_pton(af, src, dst, size)
* convert network number from presentation to network format.
* accepts hex octets, hex strings, decimal octets, and /CIDR.
* "size" is in bytes and describes "dst".
* return:
* number of bits, either imputed classfully or specified with /CIDR,
* or -1 if some failure occurred (check errno). ENOENT means it was
* not a valid network specification.
* author:
* Paul Vixie (ISC), June 1996
*/
int
inet_net_pton(int af, const char *src, void *dst, size_t size)
{
switch (af)
{
case AF_INET:
return (inet_net_pton_ipv4(src, dst, size));
default:
errno = EAFNOSUPPORT;
return (-1);
}
}
/*
* static int
* inet_net_pton_ipv4(src, dst, size)
* convert IPv4 network number from presentation to network format.
* accepts hex octets, hex strings, decimal octets, and /CIDR.
* "size" is in bytes and describes "dst".
* return:
* number of bits, either imputed classfully or specified with /CIDR,
* or -1 if some failure occurred (check errno). ENOENT means it was
* not an IPv4 network specification.
* note:
* network byte order assumed. this means 192.5.5.240/28 has
* 0x11110000 in its fourth octet.
* author:
* Paul Vixie (ISC), June 1996
*/
static int
inet_net_pton_ipv4(const char *src, u_char *dst, size_t size)
{
static const char
xdigits[] = "0123456789abcdef",
digits[] = "0123456789";
int n,
ch,
tmp,
dirty,
bits;
const u_char *odst = dst;
ch = *src++;
if (ch == '0' && (src[0] == 'x' || src[0] == 'X')
&& isascii(src[1]) && isxdigit(src[1]))
{
/* Hexadecimal: Eat nybble string. */
if (size <= 0)
goto emsgsize;
*dst = 0, dirty = 0;
src++; /* skip x or X. */
while ((ch = *src++) != '\0' &&
isascii(ch) && isxdigit(ch))
{
if (isupper(ch))
ch = tolower(ch);
n = strchr(xdigits, ch) - xdigits;
assert(n >= 0 && n <= 15);
*dst |= n;
if (!dirty++)
*dst <<= 4;
else if (size-- > 0)
*++dst = 0, dirty = 0;
else
goto emsgsize;
}
if (dirty)
size--;
}
else if (isascii(ch) && isdigit(ch))
{
/* Decimal: eat dotted digit string. */
for (;;)
{
tmp = 0;
do
{
n = strchr(digits, ch) - digits;
assert(n >= 0 && n <= 9);
tmp *= 10;
tmp += n;
if (tmp > 255)
goto enoent;
} while ((ch = *src++) != '\0' &&
isascii(ch) && isdigit(ch));
if (size-- <= 0)
goto emsgsize;
*dst++ = (u_char) tmp;
if (ch == '\0' || ch == '/')
break;
if (ch != '.')
goto enoent;
ch = *src++;
if (!isascii(ch) || !isdigit(ch))
goto enoent;
}
}
else
goto enoent;
bits = -1;
if (ch == '/' && isascii(src[0]) && isdigit(src[0]) && dst > odst)
{
/* CIDR width specifier. Nothing can follow it. */
ch = *src++; /* Skip over the /. */
bits = 0;
do
{
n = strchr(digits, ch) - digits;
assert(n >= 0 && n <= 9);
bits *= 10;
bits += n;
} while ((ch = *src++) != '\0' &&
isascii(ch) && isdigit(ch));
if (ch != '\0')
goto enoent;
if (bits > 32)
goto emsgsize;
}
/* Firey death and destruction unless we prefetched EOS. */
if (ch != '\0')
goto enoent;
/* If nothing was written to the destination, we found no address. */
if (dst == odst)
goto enoent;
/* If no CIDR spec was given, infer width from net class. */
if (bits == -1)
{
if (*odst >= 240) /* Class E */
bits = 32;
else if (*odst >= 224) /* Class D */
bits = 4;
else if (*odst >= 192) /* Class C */
bits = 24;
else if (*odst >= 128) /* Class B */
bits = 16;
else
/* Class A */
bits = 8;
/* If imputed mask is narrower than specified octets, widen. */
if (bits >= 8 && bits < ((dst - odst) * 8))
bits = (dst - odst) * 8;
}
/* Extend network to cover the actual mask. */
while (bits > ((dst - odst) * 8))
{
if (size-- <= 0)
goto emsgsize;
*dst++ = '\0';
}
return (bits);
enoent:
errno = ENOENT;
return (-1);
emsgsize:
errno = EMSGSIZE;
return (-1);
}

283
src/backend/utils/adt/ip.c Normal file
View File

@ -0,0 +1,283 @@
/*
* PostgreSQL type definitions for IP addresses. This
* is for IP V4 CIDR notation, but prepared for V6: just
* add the necessary bits where the comments indicate.
*
* $Id: ip.c,v 1.1 1998/10/03 05:40:49 momjian Exp $
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <postgres.h>
#include <utils/palloc.h>
#include <utils/mac.h>
/*
* Access macros. Add IPV6 support.
*/
#define ip_addrsize(ipaddrptr) \
(((ipaddr_struct *)VARDATA(ipaddrptr))->family == AF_INET ? 4 : -1)
#define ip_family(ipaddrptr) \
(((ipaddr_struct *)VARDATA(ipaddrptr))->family)
#define ip_bits(ipaddrptr) \
(((ipaddr_struct *)VARDATA(ipaddrptr))->bits)
#define ip_v4addr(ipaddrptr) \
(((ipaddr_struct *)VARDATA(ipaddrptr))->addr.ipv4_addr)
/*
* IP address reader.
*/
ipaddr *
ipaddr_in(char *src)
{
int bits;
ipaddr *dst;
dst = palloc(VARHDRSZ + sizeof(ipaddr_struct));
if (dst == NULL)
{
elog(ERROR, "unable to allocate memory in ipaddr_in()");
return (NULL);
}
/* First, try for an IP V4 address: */
ip_family(dst) = AF_INET;
bits = inet_net_pton(ip_family(dst), src, &ip_v4addr(dst), ip_addrsize(dst));
if ((bits < 0) || (bits > 32))
{
/* Go for an IPV6 address here, before faulting out: */
elog(ERROR, "could not parse \"%s\"", src);
pfree(dst);
return (NULL);
}
VARSIZE(dst) = VARHDRSZ
+ ((char *) &ip_v4addr(dst) - (char *) VARDATA(dst))
+ ip_addrsize(dst);
ip_bits(dst) = bits;
return (dst);
}
/*
* IP address output function.
*/
char *
ipaddr_out(ipaddr *src)
{
char *dst,
tmp[sizeof("255.255.255.255/32")];
if (ip_family(src) == AF_INET)
{
/* It's an IP V4 address: */
if (inet_net_ntop(AF_INET, &ip_v4addr(src), ip_bits(src),
tmp, sizeof(tmp)) < 0)
{
elog(ERROR, "unable to print address (%s)", strerror(errno));
return (NULL);
}
}
else
{
/* Go for an IPV6 address here, before faulting out: */
elog(ERROR, "unknown address family (%d)", ip_family(src));
return (NULL);
}
dst = palloc(strlen(tmp) + 1);
if (dst == NULL)
{
elog(ERROR, "unable to allocate memory in ipaddr_out()");
return (NULL);
}
strcpy(dst, tmp);
return (dst);
}
/*
* Boolean tests for magnitude. Add V4/V6 testing!
*/
bool
ipaddr_lt(ipaddr *a1, ipaddr *a2)
{
if ((ip_family(a1) == AF_INET) && (ip_family(a2) == AF_INET))
{
int order = v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a2));
return ((order < 0) || ((order == 0) && (ip_bits(a1) < ip_bits(a2))));
}
else
{
/* Go for an IPV6 address here, before faulting out: */
elog(ERROR, "cannot compare address families %d and %d",
ip_family(a1), ip_family(a2));
return (FALSE);
}
}
bool
ipaddr_le(ipaddr *a1, ipaddr *a2)
{
return (ipaddr_lt(a1, a2) || ipaddr_eq(a1, a2));
}
bool
ipaddr_eq(ipaddr *a1, ipaddr *a2)
{
if ((ip_family(a1) == AF_INET) && (ip_family(a2) == AF_INET))
{
return ((ip_bits(a1) == ip_bits(a2))
&& (v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a1)) == 0));
}
else
{
/* Go for an IPV6 address here, before faulting out: */
elog(ERROR, "cannot compare address families %d and %d",
ip_family(a1), ip_family(a2));
return (FALSE);
}
}
bool
ipaddr_ge(ipaddr *a1, ipaddr *a2)
{
return (ipaddr_gt(a1, a2) || ipaddr_eq(a1, a2));
}
bool
ipaddr_gt(ipaddr *a1, ipaddr *a2)
{
if ((ip_family(a1) == AF_INET) && (ip_family(a2) == AF_INET))
{
int order = v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a2));
return ((order > 0) || ((order == 0) && (ip_bits(a1) > ip_bits(a2))));
}
else
{
/* Go for an IPV6 address here, before faulting out: */
elog(ERROR, "cannot compare address families %d and %d",
ip_family(a1), ip_family(a2));
return (FALSE);
}
}
bool
ipaddr_ne(ipaddr *a1, ipaddr *a2)
{
return (!ipaddr_eq(a1, a2));
}
bool
ipaddr_sub(ipaddr *a1, ipaddr *a2)
{
if ((ip_family(a1) == AF_INET) && (ip_family(a2) == AF_INET))
{
return ((ip_bits(a1) > ip_bits(a2))
&& (v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a2)) == 0));
}
else
{
/* Go for an IPV6 address here, before faulting out: */
elog(ERROR, "cannot compare address families %d and %d",
ip_family(a1), ip_family(a2));
return (FALSE);
}
}
bool
ipaddr_subeq(ipaddr *a1, ipaddr *a2)
{
if ((ip_family(a1) == AF_INET) && (ip_family(a2) == AF_INET))
{
return ((ip_bits(a1) >= ip_bits(a2))
&& (v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a2)) == 0));
}
else
{
/* Go for an IPV6 address here, before faulting out: */
elog(ERROR, "cannot compare address families %d and %d",
ip_family(a1), ip_family(a2));
return (FALSE);
}
}
bool
ipaddr_sup(ipaddr *a1, ipaddr *a2)
{
if ((ip_family(a1) == AF_INET) && (ip_family(a2) == AF_INET))
{
return ((ip_bits(a1) < ip_bits(a2))
&& (v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a1)) == 0));
}
else
{
/* Go for an IPV6 address here, before faulting out: */
elog(ERROR, "cannot compare address families %d and %d",
ip_family(a1), ip_family(a2));
return (FALSE);
}
}
bool
ipaddr_supeq(ipaddr *a1, ipaddr *a2)
{
if ((ip_family(a1) == AF_INET) && (ip_family(a2) == AF_INET))
{
return ((ip_bits(a1) <= ip_bits(a2))
&& (v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a1)) == 0));
}
else
{
/* Go for an IPV6 address here, before faulting out: */
elog(ERROR, "cannot compare address families %d and %d",
ip_family(a1), ip_family(a2));
return (FALSE);
}
}
/*
* Comparison function for sorting. Add V4/V6 testing!
*/
int4
ipaddr_cmp(ipaddr *a1, ipaddr *a2)
{
if (ntohl(ip_v4addr(a1)) < ntohl(ip_v4addr(a2)))
return (-1);
else if (ntohl(ip_v4addr(a1)) > ntohl(ip_v4addr(a2)))
return (1);
return 0;
}
/*
* Bitwise comparison for V4 addresses. Add V6 implementation!
*/
int
v4bitncmp(u_int32_t a1, u_int32_t a2, int bits)
{
unsigned long mask = 0;
int i;
for (i = 0; i < bits; i++)
mask = (mask >> 1) | 0x80000000;
a1 = ntohl(a1);
a2 = ntohl(a2);
if ((a1 & mask) < (a2 & mask))
return (-1);
else if ((a1 & mask) > (a2 & mask))
return (1);
return (0);
}

323
src/backend/utils/adt/mac.c Normal file
View File

@ -0,0 +1,323 @@
/*
* PostgreSQL type definitions for MAC addresses.
*
* $Id: mac.c,v 1.1 1998/10/03 05:40:50 momjian Exp $
*/
#include <stdio.h>
#include <postgres.h>
#include <utils/palloc.h>
#include <utils/mac.h>
manufacturer manufacturers[] = {
{0x00, 0x00, 0x0C, "Cisco"},
{0x00, 0x00, 0x0E, "Fujitsu"},
{0x00, 0x00, 0x0F, "NeXT"},
{0x00, 0x00, 0x10, "Sytek"},
{0x00, 0x00, 0x1D, "Cabletron"},
{0x00, 0x00, 0x20, "DIAB"},
{0x00, 0x00, 0x22, "Visual Technology"},
{0x00, 0x00, 0x2A, "TRW"},
{0x00, 0x00, 0x32, "GPT Limited"},
{0x00, 0x00, 0x5A, "S & Koch"},
{0x00, 0x00, 0x5E, "IANA"},
{0x00, 0x00, 0x65, "Network General"},
{0x00, 0x00, 0x6B, "MIPS"},
{0x00, 0x00, 0x77, "MIPS"},
{0x00, 0x00, 0x7A, "Ardent"},
{0x00, 0x00, 0x89, "Cayman Systems"},
{0x00, 0x00, 0x93, "Proteon"},
{0x00, 0x00, 0x9F, "Ameristar Technology"},
{0x00, 0x00, 0xA2, "Wellfleet"},
{0x00, 0x00, 0xA3, "Network Application Technology"},
{0x00, 0x00, 0xA6, "Network General"},
{0x00, 0x00, 0xA7, "NCD"},
{0x00, 0x00, 0xA9, "Network Systems"},
{0x00, 0x00, 0xAA, "Xerox"},
{0x00, 0x00, 0xB3, "CIMLinc"},
{0x00, 0x00, 0xB7, "Dove Fastnet"},
{0x00, 0x00, 0xBC, "Allen-Bradley"},
{0x00, 0x00, 0xC0, "Western Digital"},
{0x00, 0x00, 0xC5, "Farallon"},
{0x00, 0x00, 0xC6, "Hewlett-Packard"},
{0x00, 0x00, 0xC8, "Altos"},
{0x00, 0x00, 0xC9, "Emulex"},
{0x00, 0x00, 0xD7, "Dartmouth College"},
{0x00, 0x00, 0xD8, "3Com (?)"},
{0x00, 0x00, 0xDD, "Gould"},
{0x00, 0x00, 0xDE, "Unigraph"},
{0x00, 0x00, 0xE2, "Acer Counterpoint"},
{0x00, 0x00, 0xEF, "Alantec"},
{0x00, 0x00, 0xFD, "High Level Hardware"},
{0x00, 0x01, 0x02, "BBN internal usage"},
{0x00, 0x20, 0xAF, "3Com"},
{0x00, 0x17, 0x00, "Kabel"},
{0x00, 0x80, 0x64, "Wyse Technology"},
{0x00, 0x80, 0x2B, "IMAC (?)"},
{0x00, 0x80, 0x2D, "Xylogics, Inc."},
{0x00, 0x80, 0x8C, "Frontier Software Development"},
{0x00, 0x80, 0xC2, "IEEE 802.1 Committee"},
{0x00, 0x80, 0xD3, "Shiva"},
{0x00, 0xAA, 0x00, "Intel"},
{0x00, 0xDD, 0x00, "Ungermann-Bass"},
{0x00, 0xDD, 0x01, "Ungermann-Bass"},
{0x02, 0x07, 0x01, "Racal InterLan"},
{0x02, 0x04, 0x06, "BBN internal usage"},
{0x02, 0x60, 0x86, "Satelcom MegaPac"},
{0x02, 0x60, 0x8C, "3Com"},
{0x02, 0xCF, 0x1F, "CMC"},
{0x08, 0x00, 0x02, "3Com"},
{0x08, 0x00, 0x03, "ACC"},
{0x08, 0x00, 0x05, "Symbolics"},
{0x08, 0x00, 0x08, "BBN"},
{0x08, 0x00, 0x09, "Hewlett-Packard"},
{0x08, 0x00, 0x0A, "Nestar Systems"},
{0x08, 0x00, 0x0B, "Unisys"},
{0x08, 0x00, 0x11, "Tektronix"},
{0x08, 0x00, 0x14, "Excelan"},
{0x08, 0x00, 0x17, "NSC"},
{0x08, 0x00, 0x1A, "Data General"},
{0x08, 0x00, 0x1B, "Data General"},
{0x08, 0x00, 0x1E, "Apollo"},
{0x08, 0x00, 0x20, "Sun"},
{0x08, 0x00, 0x22, "NBI"},
{0x08, 0x00, 0x25, "CDC"},
{0x08, 0x00, 0x26, "Norsk Data"},
{0x08, 0x00, 0x27, "PCS Computer Systems GmbH"},
{0x08, 0x00, 0x28, "Texas Instruments"},
{0x08, 0x00, 0x2B, "DEC"},
{0x08, 0x00, 0x2E, "Metaphor"},
{0x08, 0x00, 0x2F, "Prime Computer"},
{0x08, 0x00, 0x36, "Intergraph"},
{0x08, 0x00, 0x37, "Fujitsu-Xerox"},
{0x08, 0x00, 0x38, "Bull"},
{0x08, 0x00, 0x39, "Spider Systems"},
{0x08, 0x00, 0x41, "DCA Digital Comm. Assoc."},
{0x08, 0x00, 0x45, "Xylogics (?)"},
{0x08, 0x00, 0x46, "Sony"},
{0x08, 0x00, 0x47, "Sequent"},
{0x08, 0x00, 0x49, "Univation"},
{0x08, 0x00, 0x4C, "Encore"},
{0x08, 0x00, 0x4E, "BICC"},
{0x08, 0x00, 0x56, "Stanford University"},
{0x08, 0x00, 0x58, "DECsystem 20 (?)"},
{0x08, 0x00, 0x5A, "IBM"},
{0x08, 0x00, 0x67, "Comdesign"},
{0x08, 0x00, 0x68, "Ridge"},
{0x08, 0x00, 0x69, "Silicon Graphics"},
{0x08, 0x00, 0x6E, "Concurrent"},
{0x08, 0x00, 0x75, "DDE"},
{0x08, 0x00, 0x7C, "Vitalink"},
{0x08, 0x00, 0x80, "XIOS"},
{0x08, 0x00, 0x86, "Imagen/QMS"},
{0x08, 0x00, 0x87, "Xyplex"},
{0x08, 0x00, 0x89, "Kinetics"},
{0x08, 0x00, 0x8B, "Pyramid"},
{0x08, 0x00, 0x8D, "XyVision"},
{0x08, 0x00, 0x90, "Retix Inc"},
{0x48, 0x44, 0x53, "HDS (?)"},
{0x80, 0x00, 0x10, "AT&T"},
{0xAA, 0x00, 0x00, "DEC"},
{0xAA, 0x00, 0x01, "DEC"},
{0xAA, 0x00, 0x02, "DEC"},
{0xAA, 0x00, 0x03, "DEC"},
{0xAA, 0x00, 0x04, "DEC"},
{0x00, 0x00, 0x00, NULL}
};
/*
* Utility macros used for sorting and comparing:
*/
#define hibits(addr) \
((unsigned long)((addr->a<<16)|(addr->b<<8)|(addr->c)))
#define lobits(addr) \
((unsigned long)((addr->c<<16)|(addr->e<<8)|(addr->f)))
/*
* MAC address reader. Accepts several common notations.
*/
macaddr *
macaddr_in(char *str)
{
int a,
b,
c,
d,
e,
f;
macaddr *result;
int count;
if (strlen(str) > 0)
{
count = sscanf(str, "%x:%x:%x:%x:%x:%x", &a, &b, &c, &d, &e, &f);
if (count != 6)
count = sscanf(str, "%x-%x-%x-%x-%x-%x", &a, &b, &c, &d, &e, &f);
if (count != 6)
count = sscanf(str, "%2x%2x%2x:%2x%2x%2x", &a, &b, &c, &d, &e, &f);
if (count != 6)
count = sscanf(str, "%2x%2x%2x-%2x%2x%2x", &a, &b, &c, &d, &e, &f);
if (count != 6)
count = sscanf(str, "%2x%2x.%2x%2x.%2x%2x", &a, &b, &c, &d, &e, &f);
if (count != 6)
{
elog(ERROR, "macaddr_in: error in parsing \"%s\"", str);
return (NULL);
}
if ((a < 0) || (a > 255) || (b < 0) || (b > 255) ||
(c < 0) || (c > 255) || (d < 0) || (d > 255) ||
(e < 0) || (e > 255) || (f < 0) || (f > 255))
{
elog(ERROR, "macaddr_in: illegal address \"%s\"", str);
return (NULL);
}
}
else
{
a = b = c = d = e = f = 0; /* special case for missing
* address */
}
result = (macaddr *) palloc(sizeof(macaddr));
result->a = a;
result->b = b;
result->c = c;
result->d = d;
result->e = e;
result->f = f;
return (result);
}
/*
* MAC address output function. Fixed format.
*/
char *
macaddr_out(macaddr *addr)
{
char *result;
if (addr == NULL)
return (NULL);
result = (char *) palloc(32);
if ((hibits(addr) > 0) || (lobits(addr) > 0))
{
sprintf(result, "%02x:%02x:%02x:%02x:%02x:%02x",
addr->a, addr->b, addr->c, addr->d, addr->e, addr->f);
}
else
{
result[0] = 0; /* special case for missing address */
}
return (result);
}
/*
* Boolean tests.
*/
bool
macaddr_lt(macaddr *a1, macaddr *a2)
{
return ((hibits(a1) < hibits(a2)) ||
((hibits(a1) == hibits(a2)) && lobits(a1) < lobits(a2)));
};
bool
macaddr_le(macaddr *a1, macaddr *a2)
{
return ((hibits(a1) < hibits(a2)) ||
((hibits(a1) == hibits(a2)) && lobits(a1) <= lobits(a2)));
};
bool
macaddr_eq(macaddr *a1, macaddr *a2)
{
return ((hibits(a1) == hibits(a2)) && (lobits(a1) == lobits(a2)));
};
bool
macaddr_ge(macaddr *a1, macaddr *a2)
{
return ((hibits(a1) > hibits(a2)) ||
((hibits(a1) == hibits(a2)) && lobits(a1) >= lobits(a2)));
};
bool
macaddr_gt(macaddr *a1, macaddr *a2)
{
return ((hibits(a1) > hibits(a2)) ||
((hibits(a1) == hibits(a2)) && lobits(a1) > lobits(a2)));
};
bool
macaddr_ne(macaddr *a1, macaddr *a2)
{
return ((hibits(a1) != hibits(a2)) || (lobits(a1) != lobits(a2)));
};
/*
* Comparison function for sorting:
*/
int4
macaddr_cmp(macaddr *a1, macaddr *a2)
{
if (hibits(a1) < hibits(a2))
return -1;
else if (hibits(a1) > hibits(a2))
return 1;
else if (lobits(a1) < lobits(a2))
return -1;
else if (lobits(a1) > lobits(a2))
return 1;
else
return 0;
}
/*
* The special manufacturer fetching function. See "mac.h".
*/
text *
macaddr_manuf(macaddr *addr)
{
manufacturer *manuf;
int length;
text *result;
for (manuf = manufacturers; manuf->name != NULL; manuf++)
{
if ((manuf->a == addr->a) &&
(manuf->b == addr->b) &&
(manuf->c == addr->c))
break;
}
if (manuf->name == NULL)
{
result = palloc(VARHDRSZ + 1);
memset(result, 0, VARHDRSZ + 1);
VARSIZE(result) = VARHDRSZ + 1;
}
else
{
length = strlen(manuf->name) + 1;
result = palloc(length + VARHDRSZ);
memset(result, 0, length + VARHDRSZ);
VARSIZE(result) = length + VARHDRSZ;
memcpy(VARDATA(result), manuf->name, length);
}
return result;
}

View File

@ -7,7 +7,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: pg_amop.h,v 1.15 1998/09/01 04:34:48 momjian Exp $
* $Id: pg_amop.h,v 1.16 1998/10/03 05:40:51 momjian Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
@ -298,6 +298,26 @@ DATA(insert OID = 0 ( 403 1313 1330 3 btreesel btreenpage ));
DATA(insert OID = 0 ( 403 1313 1335 4 btreesel btreenpage ));
DATA(insert OID = 0 ( 403 1313 1334 5 btreesel btreenpage ));
/*
* nbtree macaddr
*/
DATA(insert OID = 0 ( 403 810 1222 1 btreesel btreenpage ));
DATA(insert OID = 0 ( 403 810 1223 2 btreesel btreenpage ));
DATA(insert OID = 0 ( 403 810 1220 3 btreesel btreenpage ));
DATA(insert OID = 0 ( 403 810 1225 4 btreesel btreenpage ));
DATA(insert OID = 0 ( 403 810 1224 5 btreesel btreenpage ));
/*
* nbtree ip
*/
DATA(insert OID = 0 ( 403 935 1203 1 btreesel btreenpage ));
DATA(insert OID = 0 ( 403 935 1204 2 btreesel btreenpage ));
DATA(insert OID = 0 ( 403 935 1201 3 btreesel btreenpage ));
DATA(insert OID = 0 ( 403 935 1206 4 btreesel btreenpage ));
DATA(insert OID = 0 ( 403 935 1205 5 btreesel btreenpage ));
/*
* hash table _ops
*/

View File

@ -9,7 +9,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: pg_amproc.h,v 1.10 1998/09/01 04:34:49 momjian Exp $
* $Id: pg_amproc.h,v 1.11 1998/10/03 05:40:52 momjian Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
@ -99,6 +99,8 @@ DATA(insert OID = 0 (403 1115 1107 1));
DATA(insert OID = 0 (403 1181 359 1));
DATA(insert OID = 0 (403 1312 1314 1));
DATA(insert OID = 0 (403 1313 1315 1));
DATA(insert OID = 0 (403 810 836 1));
DATA(insert OID = 0 (403 935 926 1));
/* hash */

View File

@ -7,7 +7,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: pg_opclass.h,v 1.11 1998/09/01 04:35:06 momjian Exp $
* $Id: pg_opclass.h,v 1.12 1998/10/03 05:40:54 momjian Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
@ -107,5 +107,9 @@ DATA(insert OID = 1312 ( datetime_ops 1184 ));
DESCR("");
DATA(insert OID = 1313 ( timespan_ops 1186 ));
DESCR("");
DATA(insert OID = 810 ( macaddr_ops 829 ));
DESCR("");
DATA(insert OID = 935 ( ipaddr_ops 869 ));
DESCR("");
#endif /* PG_OPCLASS_H */

View File

@ -7,7 +7,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: pg_operator.h,v 1.38 1998/09/14 01:14:48 momjian Exp $
* $Id: pg_operator.h,v 1.39 1998/10/03 05:40:55 momjian Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
@ -466,7 +466,7 @@ DATA(insert OID = 1094 ( "<>" PGUID 0 b t f 1082 1082 16 1094 1093 0 0 da
DATA(insert OID = 1095 ( "<" PGUID 0 b t f 1082 1082 16 1097 1098 0 0 date_lt intltsel intltjoinsel ));
DATA(insert OID = 1096 ( "<=" PGUID 0 b t f 1082 1082 16 1098 1097 0 0 date_le intltsel intltjoinsel ));
DATA(insert OID = 1097 ( ">" PGUID 0 b t f 1082 1082 16 1095 1096 0 0 date_gt intltsel intltjoinsel ));
DATA(insert OID = 1098 ( ">=" PGUID 0 b t f 1082 1082 16 1096 1065 0 0 date_ge intltsel intltjoinsel ));
DATA(insert OID = 1098 ( ">=" PGUID 0 b t f 1082 1082 16 1096 1095 0 0 date_ge intltsel intltjoinsel ));
DATA(insert OID = 1099 ( "-" PGUID 0 b t f 1082 1082 23 0 0 0 0 date_mi - - ));
DATA(insert OID = 1100 ( "+" PGUID 0 b t f 1082 23 1082 0 0 0 0 date_pli - - ));
DATA(insert OID = 1101 ( "-" PGUID 0 b t f 1082 23 1082 0 0 0 0 date_mii - - ));
@ -477,7 +477,7 @@ DATA(insert OID = 1109 ( "<>" PGUID 0 b t f 1083 1083 16 1109 1108 0 0 time
DATA(insert OID = 1110 ( "<" PGUID 0 b t f 1083 1083 16 1112 1113 0 0 time_lt intltsel intltjoinsel ));
DATA(insert OID = 1111 ( "<=" PGUID 0 b t f 1083 1083 16 1113 1112 0 0 time_le intltsel intltjoinsel ));
DATA(insert OID = 1112 ( ">" PGUID 0 b t f 1083 1083 16 1110 1111 0 0 time_gt intltsel intltjoinsel ));
DATA(insert OID = 1113 ( ">=" PGUID 0 b t f 1083 1083 16 1111 1065 0 0 time_ge intltsel intltjoinsel ));
DATA(insert OID = 1113 ( ">=" PGUID 0 b t f 1083 1083 16 1111 1110 0 0 time_ge intltsel intltjoinsel ));
/* float48 operators */
DATA(insert OID = 1116 ( "+" PGUID 0 b t f 700 701 701 1116 0 0 0 float48pl - - ));
@ -538,10 +538,10 @@ DATA(insert OID = 1305 ( ">=" PGUID 0 b t f 1296 1296 16 1304 1302 0 0 timest
/* name, owner, prec, kind, isleft, canhash, left, right, result, com, negate, lsortop, rsortop, oprcode, operrest, oprjoin */
DATA(insert OID = 1320 ( "=" PGUID 0 b t t 1184 1184 16 1320 1321 1322 1322 datetime_eq eqsel eqjoinsel ));
DATA(insert OID = 1321 ( "<>" PGUID 0 b t f 1184 1184 16 1321 1320 0 0 datetime_ne neqsel neqjoinsel ));
DATA(insert OID = 1322 ( "<" PGUID 0 b t f 1184 1184 16 1325 1325 0 0 datetime_lt intltsel intltjoinsel ));
DATA(insert OID = 1323 ( "<=" PGUID 0 b t f 1184 1184 16 1324 1324 0 0 datetime_le intltsel intltjoinsel ));
DATA(insert OID = 1324 ( ">" PGUID 0 b t f 1184 1184 16 1323 1323 0 0 datetime_gt intltsel intltjoinsel ));
DATA(insert OID = 1325 ( ">=" PGUID 0 b t f 1184 1184 16 1322 1322 0 0 datetime_ge intltsel intltjoinsel ));
DATA(insert OID = 1322 ( "<" PGUID 0 b t f 1184 1184 16 1324 1325 0 0 datetime_lt intltsel intltjoinsel ));
DATA(insert OID = 1323 ( "<=" PGUID 0 b t f 1184 1184 16 1325 1324 0 0 datetime_le intltsel intltjoinsel ));
DATA(insert OID = 1324 ( ">" PGUID 0 b t f 1184 1184 16 1322 1323 0 0 datetime_gt intltsel intltjoinsel ));
DATA(insert OID = 1325 ( ">=" PGUID 0 b t f 1184 1184 16 1323 1322 0 0 datetime_ge intltsel intltjoinsel ));
DATA(insert OID = 1327 ( "+" PGUID 0 b t f 1184 1186 1184 1327 0 0 0 datetime_pl_span - - ));
DATA(insert OID = 1328 ( "-" PGUID 0 b t f 1184 1184 1186 0 0 0 0 datetime_mi - - ));
@ -550,10 +550,10 @@ DATA(insert OID = 1329 ( "-" PGUID 0 b t f 1184 1186 1184 0 0 0 0 datetim
/* timespan operators */
DATA(insert OID = 1330 ( "=" PGUID 0 b t t 1186 1186 16 1330 1331 1332 1332 timespan_eq eqsel eqjoinsel ));
DATA(insert OID = 1331 ( "<>" PGUID 0 b t f 1186 1186 16 1331 1330 0 0 timespan_ne neqsel neqjoinsel ));
DATA(insert OID = 1332 ( "<" PGUID 0 b t f 1186 1186 16 1335 1335 0 0 timespan_lt intltsel intltjoinsel ));
DATA(insert OID = 1333 ( "<=" PGUID 0 b t f 1186 1186 16 1334 1334 0 0 timespan_le intltsel intltjoinsel ));
DATA(insert OID = 1334 ( ">" PGUID 0 b t f 1186 1186 16 1333 1333 0 0 timespan_gt intltsel intltjoinsel ));
DATA(insert OID = 1335 ( ">=" PGUID 0 b t f 1186 1186 16 1332 1332 0 0 timespan_ge intltsel intltjoinsel ));
DATA(insert OID = 1332 ( "<" PGUID 0 b t f 1186 1186 16 1334 1335 0 0 timespan_lt intltsel intltjoinsel ));
DATA(insert OID = 1333 ( "<=" PGUID 0 b t f 1186 1186 16 1335 1334 0 0 timespan_le intltsel intltjoinsel ));
DATA(insert OID = 1334 ( ">" PGUID 0 b t f 1186 1186 16 1332 1333 0 0 timespan_gt intltsel intltjoinsel ));
DATA(insert OID = 1335 ( ">=" PGUID 0 b t f 1186 1186 16 1333 1332 0 0 timespan_ge intltsel intltjoinsel ));
DATA(insert OID = 1336 ( "-" PGUID 0 l t f 0 1186 1186 0 0 0 0 timespan_um 0 0 ));
DATA(insert OID = 1337 ( "+" PGUID 0 b t f 1186 1186 1186 1337 0 0 0 timespan_pl - - ));
@ -563,10 +563,10 @@ DATA(insert OID = 1338 ( "-" PGUID 0 b t f 1186 1186 1186 0 0 0 0 timespa
DATA(insert OID = 1420 ( "@@" PGUID 0 l t f 0 718 600 0 0 0 0 circle_center - - ));
DATA(insert OID = 1500 ( "=" PGUID 0 b t t 718 718 16 1500 1501 1502 1502 circle_eq eqsel eqjoinsel ));
DATA(insert OID = 1501 ( "<>" PGUID 0 b t f 718 718 16 1501 1500 0 0 circle_ne neqsel neqjoinsel ));
DATA(insert OID = 1502 ( "<" PGUID 0 b t f 718 718 16 0 0 0 0 circle_lt areasel areajoinsel ));
DATA(insert OID = 1503 ( ">" PGUID 0 b t f 718 718 16 0 0 0 0 circle_gt areasel areajoinsel ));
DATA(insert OID = 1504 ( "<=" PGUID 0 b t f 718 718 16 0 0 0 0 circle_le areasel areajoinsel ));
DATA(insert OID = 1505 ( ">=" PGUID 0 b t f 718 718 16 0 0 0 0 circle_ge areasel areajoinsel ));
DATA(insert OID = 1502 ( "<" PGUID 0 b t f 718 718 16 1503 1505 0 0 circle_lt areasel areajoinsel ));
DATA(insert OID = 1503 ( ">" PGUID 0 b t f 718 718 16 1502 1504 0 0 circle_gt areasel areajoinsel ));
DATA(insert OID = 1504 ( "<=" PGUID 0 b t f 718 718 16 1505 1503 0 0 circle_le areasel areajoinsel ));
DATA(insert OID = 1505 ( ">=" PGUID 0 b t f 718 718 16 1504 1502 0 0 circle_ge areasel areajoinsel ));
DATA(insert OID = 1506 ( "<<" PGUID 0 b t f 718 718 16 0 0 0 0 circle_left intltsel intltjoinsel ));
DATA(insert OID = 1507 ( "&<" PGUID 0 b t f 718 718 16 0 0 0 0 circle_overleft intltsel intltjoinsel ));
@ -635,6 +635,27 @@ DATA(insert OID = 1615 ( "?|" PGUID 0 l t f 0 628 16 1615 0 0 0 line_ver
DATA(insert OID = 1616 ( "=" PGUID 0 b t f 628 628 16 1616 0 0 0 line_eq intltsel - ));
DATA(insert OID = 1617 ( "#" PGUID 0 b t f 628 628 600 1617 0 0 0 line_interpt - - ));
/* MAC type */
DATA(insert OID = 1220 ( "=" PGUID 0 b t t 829 829 16 1220 1221 0 0 macaddr_eq eqsel eqjoinsel ));
DATA(insert OID = 1221 ( "<>" PGUID 0 b t f 829 829 16 1221 1220 0 0 macaddr_ne neqsel neqjoinsel ));
DATA(insert OID = 1222 ( "<" PGUID 0 b t f 829 829 16 1224 1225 0 0 macaddr_lt intltsel intltjoinsel ));
DATA(insert OID = 1223 ( "<=" PGUID 0 b t f 829 829 16 1225 1224 0 0 macaddr_le intltsel intltjoinsel ));
DATA(insert OID = 1224 ( ">" PGUID 0 b t f 829 829 16 1222 1223 0 0 macaddr_gt intltsel intltjoinsel ));
DATA(insert OID = 1225 ( ">=" PGUID 0 b t f 829 829 16 1223 1222 0 0 macaddr_ge intltsel intltjoinsel ));
/* IP type */
DATA(insert OID = 1201 ( "=" PGUID 0 b t t 869 869 16 1201 1202 0 0 ipaddr_eq eqsel eqjoinsel ));
DATA(insert OID = 1202 ( "<>" PGUID 0 b t f 869 869 16 1202 1201 0 0 ipaddr_ne neqsel neqjoinsel ));
DATA(insert OID = 1203 ( "<" PGUID 0 b t f 869 869 16 1205 1206 0 0 ipaddr_lt intltsel intltjoinsel ));
DATA(insert OID = 1204 ( "<=" PGUID 0 b t f 869 869 16 1206 1205 0 0 ipaddr_le intltsel intltjoinsel ));
DATA(insert OID = 1205 ( ">" PGUID 0 b t f 869 869 16 1203 1204 0 0 ipaddr_gt intltsel intltjoinsel ));
DATA(insert OID = 1206 ( ">=" PGUID 0 b t f 869 869 16 1204 1203 0 0 ipaddr_ge intltsel intltjoinsel ));
DATA(insert OID = 931 ( "<<" PGUID 0 b t f 869 869 16 933 934 0 0 ipaddr_sub intltsel intltjoinsel ));
DATA(insert OID = 932 ( "<<=" PGUID 0 b t f 869 869 16 934 933 0 0 ipaddr_subeq intltsel intltjoinsel ));
DATA(insert OID = 933 ( ">>" PGUID 0 b t f 869 869 16 931 932 0 0 ipaddr_sup intltsel intltjoinsel ));
DATA(insert OID = 934 ( ">>=" PGUID 0 b t f 869 869 16 932 931 0 0 ipaddr_supeq intltsel intltjoinsel ));
/*
* function prototypes
*/

View File

@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: pg_proc.h,v 1.70 1998/10/02 16:27:55 momjian Exp $
* $Id: pg_proc.h,v 1.71 1998/10/03 05:40:56 momjian Exp $
*
* NOTES
* The script catalog/genbki.sh reads this file and generates .bki
@ -2045,6 +2045,59 @@ DESCR("user name by UID (with fallback)");
DATA(insert OID = 1643 ( pg_get_indexdef PGUID 11 f t f 1 f 25 "26" 100 0 0 100 foo bar ));
DESCR("index description");
/* for mac type support */
DATA(insert OID = 436 ( macaddr_in PGUID 11 f t f 1 f 829 "0" 100 0 0 100 foo bar ));
DESCR("(internal)");
DATA(insert OID = 437 ( macaddr_out PGUID 11 f t f 1 f 23 "0" 100 0 0 100 foo bar ));
DESCR("(internal)");
DATA(insert OID = 830 ( macaddr_eq PGUID 11 f t f 2 f 16 "829 829" 100 0 0 100 foo bar ));
DESCR("equal");
DATA(insert OID = 831 ( macaddr_lt PGUID 11 f t f 2 f 16 "829 829" 100 0 0 100 foo bar ));
DESCR("less-than");
DATA(insert OID = 832 ( macaddr_le PGUID 11 f t f 2 f 16 "829 829" 100 0 0 100 foo bar ));
DESCR("less-than-or-equal");
DATA(insert OID = 833 ( macaddr_gt PGUID 11 f t f 2 f 16 "829 829" 100 0 0 100 foo bar ));
DESCR("greater-than");
DATA(insert OID = 834 ( macaddr_ge PGUID 11 f t f 2 f 16 "829 829" 100 0 0 100 foo bar ));
DESCR("greater-than-or-equal");
DATA(insert OID = 835 ( macaddr_ne PGUID 11 f t f 2 f 16 "829 829" 100 0 0 100 foo bar ));
DESCR("not equal");
DATA(insert OID = 836 ( macaddr_cmp PGUID 11 f t f 2 f 23 "829 829" 100 0 0 100 foo bar ));
DESCR("less-equal-greater");
DATA(insert OID = 837 ( macaddr_manuf PGUID 11 f t f 1 f 25 "829" 100 0 0 100 foo bar ));
DESCR("MAC manufacturer");
/* for ip type support */
DATA(insert OID = 910 ( ipaddr_in PGUID 11 f t f 1 f 869 "0" 100 0 0 100 foo bar ));
DESCR("(internal)");
DATA(insert OID = 911 ( ipaddr_out PGUID 11 f t f 1 f 23 "0" 100 0 0 100 foo bar ));
DESCR("(internal)");
DATA(insert OID = 920 ( ipaddr_eq PGUID 11 f t f 2 f 16 "869 869" 100 0 0 100 foo bar ));
DESCR("equal");
DATA(insert OID = 921 ( ipaddr_lt PGUID 11 f t f 2 f 16 "869 869" 100 0 0 100 foo bar ));
DESCR("less-than");
DATA(insert OID = 922 ( ipaddr_le PGUID 11 f t f 2 f 16 "869 869" 100 0 0 100 foo bar ));
DESCR("less-than-or-equal");
DATA(insert OID = 923 ( ipaddr_gt PGUID 11 f t f 2 f 16 "869 869" 100 0 0 100 foo bar ));
DESCR("greater-than");
DATA(insert OID = 924 ( ipaddr_ge PGUID 11 f t f 2 f 16 "869 869" 100 0 0 100 foo bar ));
DESCR("greater-than-or-equal");
DATA(insert OID = 925 ( ipaddr_ne PGUID 11 f t f 2 f 16 "869 869" 100 0 0 100 foo bar ));
DESCR("not equal");
DATA(insert OID = 926 ( ipaddr_cmp PGUID 11 f t f 2 f 23 "869 869" 100 0 0 100 foo bar ));
DESCR("less-equal-greater");
DATA(insert OID = 927 ( ipaddr_sub PGUID 11 f t f 2 f 16 "869 869" 100 0 0 100 foo bar ));
DESCR("is-subnet");
DATA(insert OID = 928 ( ipaddr_subeq PGUID 11 f t f 2 f 16 "869 869" 100 0 0 100 foo bar ));
DESCR("is-subnet-or-equal");
DATA(insert OID = 929 ( ipaddr_sup PGUID 11 f t f 2 f 16 "869 869" 100 0 0 100 foo bar ));
DESCR("is-supernet");
DATA(insert OID = 930 ( ipaddr_supeq PGUID 11 f t f 2 f 16 "869 869" 100 0 0 100 foo bar ));
DESCR("is-supernet-or-equal");
/*
* prototypes for functions pg_proc.c
*/

View File

@ -7,7 +7,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: pg_type.h,v 1.47 1998/09/01 04:35:18 momjian Exp $
* $Id: pg_type.h,v 1.48 1998/10/03 05:40:58 momjian Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
@ -298,6 +298,10 @@ DESCR("money '$d,ddd.cc'");
DATA(insert OID = 791 ( _money PGUID -1 -1 f b t \054 0 790 array_in array_out array_in array_out i _null_ ));
/* OIDS 800 - 899 */
DATA(insert OID = 829 ( macaddr PGUID 6 -1 f b t \054 0 0 macaddr_in macaddr_out macaddr_in macaddr_out i _null_ ));
DESCR("MAC address");
DATA(insert OID = 869 ( ipaddr PGUID -1 -1 f b t \054 0 0 ipaddr_in ipaddr_out ipaddr_in ipaddr_out i _null_ ));
DESCR("IP address");
/* OIDS 900 - 999 */
@ -333,8 +337,9 @@ DATA(insert OID = 1027 ( _polygon PGUID -1 -1 f b t \054 0 604 array_in array
/* Note: the size of an aclitem needs to match sizeof(AclItem) in acl.h */
DATA(insert OID = 1033 ( aclitem PGUID 8 -1 f b t \054 0 0 aclitemin aclitemout aclitemin aclitemout i _null_ ));
DESCR("access control list");
DATA(insert OID = 1034 ( _aclitem PGUID -1 -1 f b t \054 0 1033 array_in array_out array_in array_out i _null_ ));
DATA(insert OID = 1034 ( _aclitem PGUID -1 -1 f b t \054 0 1033 array_in array_out array_in array_out i _null_ ));
DATA(insert OID = 1040 ( _macaddr PGUID -1 -1 f b t \054 0 829 array_in array_out array_in array_out i _null_ ));
DATA(insert OID = 1041 ( _ipaddr PGUID -1 -1 f b t \054 0 869 array_in array_out array_in array_out i _null_ ));
DATA(insert OID = 1042 ( bpchar PGUID -1 -1 f b t \054 0 18 bpcharin bpcharout bpcharin bpcharout i _null_ ));
DESCR("blank-padded characters, length specifed when created");
#define BPCHAROID 1042

View File

@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: builtins.h,v 1.55 1998/09/22 20:28:13 momjian Exp $
* $Id: builtins.h,v 1.56 1998/10/03 05:40:59 momjian Exp $
*
* NOTES
* This should normally only be included by fmgr.h.
@ -28,6 +28,7 @@
#include <utils/nabstime.h>
#include <utils/int8.h>
#include <utils/cash.h>
#include <utils/mac.h>
#include <utils/rel.h>
/*
@ -511,4 +512,40 @@ extern text *translate(text *string, char from, char to);
/* acl.c */
/* inet_net_ntop.c */
char *inet_net_ntop(int af, const void *src, int bits, char *dst, size_t size);
/* inet_net_pton.c */
int inet_net_pton(int af, const char *src, void *dst, size_t size);
/* ip.c */
ipaddr *ipaddr_in(char *str);
char *ipaddr_out(ipaddr * addr);
bool ipaddr_lt(ipaddr * a1, ipaddr * a2);
bool ipaddr_le(ipaddr * a1, ipaddr * a2);
bool ipaddr_eq(ipaddr * a1, ipaddr * a2);
bool ipaddr_ge(ipaddr * a1, ipaddr * a2);
bool ipaddr_gt(ipaddr * a1, ipaddr * a2);
bool ipaddr_ne(ipaddr * a1, ipaddr * a2);
bool ipaddr_sub(ipaddr * a1, ipaddr * a2);
bool ipaddr_subeq(ipaddr * a1, ipaddr * a2);
bool ipaddr_sup(ipaddr * a1, ipaddr * a2);
bool ipaddr_supeq(ipaddr * a1, ipaddr * a2);
int4 ipaddr_cmp(ipaddr * a1, ipaddr * a2);
int v4bitncmp(u_int32_t a1, u_int32_t a2, int bits);
/* mac.c */
macaddr *macaddr_in(char *str);
char *macaddr_out(macaddr * addr);
bool macaddr_lt(macaddr * a1, macaddr * a2);
bool macaddr_le(macaddr * a1, macaddr * a2);
bool macaddr_eq(macaddr * a1, macaddr * a2);
bool macaddr_ge(macaddr * a1, macaddr * a2);
bool macaddr_gt(macaddr * a1, macaddr * a2);
bool macaddr_ne(macaddr * a1, macaddr * a2);
int4 macaddr_cmp(macaddr * a1, macaddr * a2);
text *macaddr_manuf(macaddr * addr);
#endif /* BUILTINS_H */

58
src/include/utils/mac.h Normal file
View File

@ -0,0 +1,58 @@
/*-------------------------------------------------------------------------
*
* builtins.h--
* Declarations for operations on built-in types.
*
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: mac.h,v 1.1 1998/10/03 05:41:01 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#ifndef MAC_H
#define MAC_H
/*
* This is the internal storage format for IP addresses:
*/
typedef struct
{
unsigned char family;
unsigned char bits;
union
{
u_int32_t ipv4_addr; /* network byte order */
/* add IPV6 address type here */
} addr;
} ipaddr_struct;
typedef struct varlena ipaddr;
/*
* This is the internal storage format for MAC addresses:
*/
typedef struct macaddr
{
unsigned char a;
unsigned char b;
unsigned char c;
unsigned char d;
unsigned char e;
unsigned char f;
} macaddr;
typedef struct manufacturer
{
unsigned char a;
unsigned char b;
unsigned char c;
char *name;
} manufacturer;
extern manufacturer manufacturers[];
#endif /* MAC_H */

View File

@ -786,6 +786,8 @@ do
-Tword8 \
-Tyy_size_t \
-Tyy_state_type \
-Tipaddr \
-Tmacaddr \
/tmp/$$a >/tmp/$$ 2>&1
if [ "$?" -ne 0 -o -s /tmp/$$ ]
then echo "$FILE"