diff --git a/src/backend/utils/adt/Makefile b/src/backend/utils/adt/Makefile index 0f51275..70f7368 100644 --- a/src/backend/utils/adt/Makefile +++ b/src/backend/utils/adt/Makefile @@ -16,7 +16,7 @@ OBJS = acl.o amutils.o arrayfuncs.o array_expanded.o array_selfuncs.o \ float.o format_type.o formatting.o genfile.o \ geo_ops.o geo_selfuncs.o geo_spgist.o inet_cidr_ntop.o inet_net_pton.o \ int.o int8.o json.o jsonb.o jsonb_gin.o jsonb_op.o jsonb_util.o \ - jsonfuncs.o like.o lockfuncs.o mac.o misc.o nabstime.o name.o \ + jsonfuncs.o like.o lockfuncs.o mac.o mac64.o misc.o nabstime.o name.o \ network.o network_gist.o network_selfuncs.o network_spgist.o \ numeric.o numutils.o oid.o oracle_compat.o \ orderedsetaggs.o pg_locale.o pg_lsn.o pg_upgrade_support.o \ diff --git a/src/backend/utils/adt/mac64.c b/src/backend/utils/adt/mac64.c new file mode 100644 index 0000000..b11b6eb --- /dev/null +++ b/src/backend/utils/adt/mac64.c @@ -0,0 +1,353 @@ +/* + * PostgreSQL type definitions for 64 bit MAC addresses (EUI-64). + * + * src/backend/utils/adt/mac64.c + */ + +#include "postgres.h" + +#include "access/hash.h" +#include "libpq/pqformat.h" +#include "utils/builtins.h" +#include "utils/inet.h" + + +/* + * Utility macros used for sorting and comparing: + */ + +#define hibits(addr) \ + ((unsigned long)(((addr)->a<<24)|((addr)->b<<16)|((addr)->c<<8)|((addr)->d))) + +#define lobits(addr) \ + ((unsigned long)(((addr)->e<<24)|((addr)->f<<16)|((addr)->g<<8)|((addr)->h))) + +/* + * MAC address (EUI-64) reader. Accepts several common notations. + */ + +Datum +macaddr64_in(PG_FUNCTION_ARGS) +{ + char *str = PG_GETARG_CSTRING(0); + macaddr64 *result; + int a, + b, + c, + d, + e, + f, + g, + h; + char junk[2]; + int count; + + + /* %1s matches iff there is trailing non-whitespace garbage */ + + count = sscanf(str, "%x:%x:%x:%x:%x:%x:%x:%x%1s", + &a, &b, &c, &d, &e, &f, &g, &h, junk); + if (count != 8) + count = sscanf(str, "%x-%x-%x-%x-%x-%x-%x-%x%1s", + &a, &b, &c, &d, &e, &f, &g, &h, junk); + if (count != 8) + count = sscanf(str, "%2x%2x%2x%2x:%2x%2x%2x%2x%1s", + &a, &b, &c, &d, &e, &f, &g, &h, junk); + if (count != 8) + count = sscanf(str, "%2x%2x%2x%2x-%2x%2x%2x%2x%1s", + &a, &b, &c, &d, &e, &f, &g, &h, junk); + if (count != 8) + count = sscanf(str, "%2x%2x.%2x%2x.%2x%2x.%2x%2x%1s", + &a, &b, &c, &d, &e, &f, &g, &h, junk); + if (count != 8) + count = sscanf(str, "%2x%2x-%2x%2x-%2x%2x-%2x%2x%1s", + &a, &b, &c, &d, &e, &f, &g, &h, junk); + if (count != 8) + count = sscanf(str, "%2x%2x%2x%2x%2x%2x%2x%2x%1s", + &a, &b, &c, &d, &e, &f, &g, &h, junk); + + if (count != 8) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("invalid input syntax for type macaddr64: \"%s\"", str))); + + 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) || + (g < 0) || (g > 255) || (h < 0) || (h > 255)) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("invalid octet value in \"macaddr64\" value: \"%s\"", str))); + + if ((a == 0) && (b == 0) && (c == 0) && (d == 0) + && (e == 0) && (f == 0) && (g == 0) && (h == 0)) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("invalid \"macaddr64\" Address: \"%s\"", str), + errhint ("00-00-00-00-00-00-00-00 address is a reserved address"))); + + if ((a == 255) && (b == 255) && (c == 255) && (d == 255) + && (e == 255) && (f == 255) && (g == 255) && (h == 255)) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("invalid \"macaddr64\" Address: \"%s\"", str), + errhint ("FF-FF-FF-FF-FF-FF-FF-FF address is a reserved address"))); + + result = (macaddr64 *) palloc(sizeof(macaddr64)); + + result->a = a; + result->b = b; + result->c = c; + result->d = d; + result->e = e; + result->f = f; + result->g = g; + result->h = h; + + PG_RETURN_MACADDR64_P(result); +} + +/* + * MAC address output function. Fixed format. + */ + +Datum +macaddr64_out(PG_FUNCTION_ARGS) +{ + macaddr64 *addr = PG_GETARG_MACADDR64_P(0); + char *result; + + result = (char *) palloc(32); + + snprintf(result, 32, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", + addr->a, addr->b, addr->c, addr->d, addr->e, addr->f, addr->g, addr->h); + + PG_RETURN_CSTRING(result); +} + +/* + * macaddr64_recv - converts external binary format to macaddr(EUI-64) + * + * The external representation is just the six bytes, MSB first. + */ +Datum +macaddr64_recv(PG_FUNCTION_ARGS) +{ + StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); + macaddr64 *addr; + + addr = (macaddr64 *) palloc(sizeof(macaddr64)); + + addr->a = pq_getmsgbyte(buf); + addr->b = pq_getmsgbyte(buf); + addr->c = pq_getmsgbyte(buf); + addr->d = pq_getmsgbyte(buf); + addr->e = pq_getmsgbyte(buf); + addr->f = pq_getmsgbyte(buf); + addr->g = pq_getmsgbyte(buf); + addr->h = pq_getmsgbyte(buf); + + PG_RETURN_MACADDR64_P(addr); +} + +/* + * macaddr64_send - converts macaddr(EUI-64) to binary format + */ +Datum +macaddr64_send(PG_FUNCTION_ARGS) +{ + macaddr64 *addr = PG_GETARG_MACADDR64_P(0); + StringInfoData buf; + + pq_begintypsend(&buf); + pq_sendbyte(&buf, addr->a); + pq_sendbyte(&buf, addr->b); + pq_sendbyte(&buf, addr->c); + pq_sendbyte(&buf, addr->d); + pq_sendbyte(&buf, addr->e); + pq_sendbyte(&buf, addr->f); + pq_sendbyte(&buf, addr->g); + pq_sendbyte(&buf, addr->h); + PG_RETURN_BYTEA_P(pq_endtypsend(&buf)); +} + + +/* + * Comparison function for sorting: + */ + +static int32 +macaddr64_cmp_internal(macaddr64 *a1, macaddr64 *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; +} + +Datum +macaddr64_cmp(PG_FUNCTION_ARGS) +{ + macaddr64 *a1 = PG_GETARG_MACADDR64_P(0); + macaddr64 *a2 = PG_GETARG_MACADDR64_P(1); + + PG_RETURN_INT32(macaddr64_cmp_internal(a1, a2)); +} + +/* + * Boolean comparisons. + */ + +Datum +macaddr64_lt(PG_FUNCTION_ARGS) +{ + macaddr64 *a1 = PG_GETARG_MACADDR64_P(0); + macaddr64 *a2 = PG_GETARG_MACADDR64_P(1); + + PG_RETURN_BOOL(macaddr64_cmp_internal(a1, a2) < 0); +} + +Datum +macaddr64_le(PG_FUNCTION_ARGS) +{ + macaddr64 *a1 = PG_GETARG_MACADDR64_P(0); + macaddr64 *a2 = PG_GETARG_MACADDR64_P(1); + + PG_RETURN_BOOL(macaddr64_cmp_internal(a1, a2) <= 0); +} + +Datum +macaddr64_eq(PG_FUNCTION_ARGS) +{ + macaddr64 *a1 = PG_GETARG_MACADDR64_P(0); + macaddr64 *a2 = PG_GETARG_MACADDR64_P(1); + + PG_RETURN_BOOL(macaddr64_cmp_internal(a1, a2) == 0); +} + +Datum +macaddr64_ge(PG_FUNCTION_ARGS) +{ + macaddr64 *a1 = PG_GETARG_MACADDR64_P(0); + macaddr64 *a2 = PG_GETARG_MACADDR64_P(1); + + PG_RETURN_BOOL(macaddr64_cmp_internal(a1, a2) >= 0); +} + +Datum +macaddr64_gt(PG_FUNCTION_ARGS) +{ + macaddr64 *a1 = PG_GETARG_MACADDR64_P(0); + macaddr64 *a2 = PG_GETARG_MACADDR64_P(1); + + PG_RETURN_BOOL(macaddr64_cmp_internal(a1, a2) > 0); +} + +Datum +macaddr64_ne(PG_FUNCTION_ARGS) +{ + macaddr64 *a1 = PG_GETARG_MACADDR64_P(0); + macaddr64 *a2 = PG_GETARG_MACADDR64_P(1); + + PG_RETURN_BOOL(macaddr64_cmp_internal(a1, a2) != 0); +} + +/* + * Support function for hash indexes on macaddr64. + */ +Datum +hashmacaddr64(PG_FUNCTION_ARGS) +{ + macaddr64 *key = PG_GETARG_MACADDR64_P(0); + + return hash_any((unsigned char *) key, sizeof(macaddr64)); +} + +/* + * Arithmetic functions: bitwise NOT, AND, OR. + */ +Datum +macaddr64_not(PG_FUNCTION_ARGS) +{ + macaddr64 *addr = PG_GETARG_MACADDR64_P(0); + macaddr64 *result; + + result = (macaddr64 *) palloc(sizeof(macaddr64)); + result->a = ~addr->a; + result->b = ~addr->b; + result->c = ~addr->c; + result->d = ~addr->d; + result->e = ~addr->e; + result->f = ~addr->f; + result->g = ~addr->g; + result->h = ~addr->h; + PG_RETURN_MACADDR64_P(result); +} + +Datum +macaddr64_and(PG_FUNCTION_ARGS) +{ + macaddr64 *addr1 = PG_GETARG_MACADDR64_P(0); + macaddr64 *addr2 = PG_GETARG_MACADDR64_P(1); + macaddr64 *result; + + result = (macaddr64 *) palloc(sizeof(macaddr64)); + result->a = addr1->a & addr2->a; + result->b = addr1->b & addr2->b; + result->c = addr1->c & addr2->c; + result->d = addr1->d & addr2->d; + result->e = addr1->e & addr2->e; + result->f = addr1->f & addr2->f; + result->g = addr1->g & addr2->g; + result->h = addr1->h & addr2->h; + PG_RETURN_MACADDR64_P(result); +} + +Datum +macaddr64_or(PG_FUNCTION_ARGS) +{ + macaddr64 *addr1 = PG_GETARG_MACADDR64_P(0); + macaddr64 *addr2 = PG_GETARG_MACADDR64_P(1); + macaddr64 *result; + + result = (macaddr64 *) palloc(sizeof(macaddr64)); + result->a = addr1->a | addr2->a; + result->b = addr1->b | addr2->b; + result->c = addr1->c | addr2->c; + result->d = addr1->d | addr2->d; + result->e = addr1->e | addr2->e; + result->f = addr1->f | addr2->f; + result->g = addr1->g | addr2->g; + result->h = addr1->h | addr2->h; + PG_RETURN_MACADDR64_P(result); +} + +/* + * Truncation function to allow comparing mac manufacturers. + * From suggestion by Alex Pilosov + */ +Datum +macaddr64_trunc(PG_FUNCTION_ARGS) +{ + macaddr64 *addr = PG_GETARG_MACADDR64_P(0); + macaddr64 *result; + + result = (macaddr64 *) palloc(sizeof(macaddr64)); + + result->a = addr->a; + result->b = addr->b; + result->c = addr->c; + result->d = addr->d; + result->e = 0; + result->f = 0; + result->g = 0; + result->g = 0; + + PG_RETURN_MACADDR64_P(result); +} diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index 6b52222..21372af 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -695,6 +695,8 @@ DATA(insert OID = 422 ( hashinet PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 DESCR("hash"); DATA(insert OID = 432 ( hash_numeric PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23 "1700" _null_ _null_ _null_ _null_ _null_ hash_numeric _null_ _null_ _null_ )); DESCR("hash"); +DATA(insert OID = 328 ( hashmacaddr64 PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23 "774" _null_ _null_ _null_ _null_ _null_ hashmacaddr64 _null_ _null_ _null_ )); +DESCR("hash"); DATA(insert OID = 438 ( num_nulls PGNSP PGUID 12 1 0 2276 0 f f f f f f i s 1 0 23 "2276" "{2276}" "{v}" _null_ _null_ _null_ pg_num_nulls _null_ _null_ _null_ )); DESCR("count the number of NULL arguments"); @@ -2114,6 +2116,28 @@ DATA(insert OID = 3144 ( macaddr_not PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 DATA(insert OID = 3145 ( macaddr_and PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 829 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_and _null_ _null_ _null_ )); DATA(insert OID = 3146 ( macaddr_or PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 829 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_or _null_ _null_ _null_ )); +/* for macaddr64 type support */ +DATA(insert OID = 3349 ( macaddr64_in PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 774 "2275" _null_ _null_ _null_ _null_ _null_ macaddr64_in _null_ _null_ _null_ )); +DESCR("I/O"); +DATA(insert OID = 3350 ( macaddr64_out PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2275 "774" _null_ _null_ _null_ _null_ _null_ macaddr64_out _null_ _null_ _null_ )); +DESCR("I/O"); + +DATA(insert OID = 3351 ( trunc PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 774 "774" _null_ _null_ _null_ _null_ _null_ macaddr64_trunc _null_ _null_ _null_ )); +DESCR("MACADDR64 manufacturer fields"); + +DATA(insert OID = 3352 ( macaddr64_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr64_eq _null_ _null_ _null_ )); +DATA(insert OID = 3353 ( macaddr64_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr64_lt _null_ _null_ _null_ )); +DATA(insert OID = 3354 ( macaddr64_le PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr64_le _null_ _null_ _null_ )); +DATA(insert OID = 3355 ( macaddr64_gt PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr64_gt _null_ _null_ _null_ )); +DATA(insert OID = 3356 ( macaddr64_ge PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr64_ge _null_ _null_ _null_ )); +DATA(insert OID = 3357 ( macaddr64_ne PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr64_ne _null_ _null_ _null_ )); +DATA(insert OID = 3358 ( macaddr64_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 23 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr64_cmp _null_ _null_ _null_ )); +DESCR("less-equal-greater"); +DATA(insert OID = 3359 ( macaddr64_not PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 774 "774" _null_ _null_ _null_ _null_ _null_ macaddr64_not _null_ _null_ _null_ )); +DATA(insert OID = 3360 ( macaddr64_and PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 774 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr64_and _null_ _null_ _null_ )); +DATA(insert OID = 3361 ( macaddr64_or PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 774 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr64_or _null_ _null_ _null_ )); + + /* for inet type support */ DATA(insert OID = 910 ( inet_in PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 869 "2275" _null_ _null_ _null_ _null_ _null_ inet_in _null_ _null_ _null_ )); DESCR("I/O"); @@ -4046,6 +4070,10 @@ DATA(insert OID = 3120 ( void_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i s DESCR("I/O"); DATA(insert OID = 3121 ( void_send PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 17 "2278" _null_ _null_ _null_ _null_ _null_ void_send _null_ _null_ _null_ )); DESCR("I/O"); +DATA(insert OID = 3344 ( macaddr64_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 774 "2281" _null_ _null_ _null_ _null_ _null_ macaddr64_recv _null_ _null_ _null_ )); +DESCR("I/O"); +DATA(insert OID = 3345 ( macaddr64_send PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 17 "774" _null_ _null_ _null_ _null_ _null_ macaddr64_send _null_ _null_ _null_ )); +DESCR("I/O"); /* System-view support functions with pretty-print option */ DATA(insert OID = 2504 ( pg_get_ruledef PGNSP PGUID 12 1 0 0 0 f f f f t f s s 2 0 25 "26 16" _null_ _null_ _null_ _null_ _null_ pg_get_ruledef_ext _null_ _null_ _null_ )); diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h index 162239c..4c957fe 100644 --- a/src/include/catalog/pg_type.h +++ b/src/include/catalog/pg_type.h @@ -441,9 +441,13 @@ DESCR("IP address/netmask, host address, netmask optional"); DATA(insert OID = 650 ( cidr PGNSP PGUID -1 f b I f t \054 0 0 651 cidr_in cidr_out cidr_recv cidr_send - - - i m f 0 -1 0 0 _null_ _null_ _null_ )); DESCR("network IP address/netmask, network address"); #define CIDROID 650 +DATA(insert OID = 774 ( macaddr64 PGNSP PGUID 8 f b U f t \054 0 0 775 macaddr64_in macaddr64_out macaddr64_recv macaddr64_send - - - i p f 0 -1 0 0 _null_ _null_ _null_ )); +DESCR("XX:XX:XX:XX:XX:XX:XX:XX, MAC address"); +#define MACADDR64OID 972 /* OIDS 900 - 999 */ + /* OIDS 1000 - 1099 */ DATA(insert OID = 1000 ( _bool PGNSP PGUID -1 f b A f t \054 0 16 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ )); DATA(insert OID = 1001 ( _bytea PGNSP PGUID -1 f b A f t \054 0 17 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ )); @@ -482,6 +486,7 @@ DESCR("access control list"); #define ACLITEMOID 1033 DATA(insert OID = 1034 ( _aclitem PGNSP PGUID -1 f b A f t \054 0 1033 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ )); DATA(insert OID = 1040 ( _macaddr PGNSP PGUID -1 f b A f t \054 0 829 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ )); +DATA(insert OID = 775 ( _macaddr64 PGNSP PGUID -1 f b A f t \054 0 774 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ )); DATA(insert OID = 1041 ( _inet PGNSP PGUID -1 f b A f t \054 0 869 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ )); DATA(insert OID = 651 ( _cidr PGNSP PGUID -1 f b A f t \054 0 650 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ )); DATA(insert OID = 1263 ( _cstring PGNSP PGUID -1 f b A f t \054 0 2275 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ )); diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index 2ae212a..4e85fbd 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -1022,6 +1022,24 @@ extern Datum macaddr_or(PG_FUNCTION_ARGS); extern Datum macaddr_trunc(PG_FUNCTION_ARGS); extern Datum hashmacaddr(PG_FUNCTION_ARGS); +/* mac64.c */ +extern Datum macaddr64_in(PG_FUNCTION_ARGS); +extern Datum macaddr64_out(PG_FUNCTION_ARGS); +extern Datum macaddr64_recv(PG_FUNCTION_ARGS); +extern Datum macaddr64_send(PG_FUNCTION_ARGS); +extern Datum macaddr64_cmp(PG_FUNCTION_ARGS); +extern Datum macaddr64_lt(PG_FUNCTION_ARGS); +extern Datum macaddr64_le(PG_FUNCTION_ARGS); +extern Datum macaddr64_eq(PG_FUNCTION_ARGS); +extern Datum macaddr64_ge(PG_FUNCTION_ARGS); +extern Datum macaddr64_gt(PG_FUNCTION_ARGS); +extern Datum macaddr64_ne(PG_FUNCTION_ARGS); +extern Datum macaddr64_not(PG_FUNCTION_ARGS); +extern Datum macaddr64_and(PG_FUNCTION_ARGS); +extern Datum macaddr64_or(PG_FUNCTION_ARGS); +extern Datum macaddr64_trunc(PG_FUNCTION_ARGS); +extern Datum hashmacaddr64(PG_FUNCTION_ARGS); + /* numeric.c */ extern Datum numeric_in(PG_FUNCTION_ARGS); extern Datum numeric_out(PG_FUNCTION_ARGS); diff --git a/src/include/utils/inet.h b/src/include/utils/inet.h index 9fd954d..5342d19 100644 --- a/src/include/utils/inet.h +++ b/src/include/utils/inet.h @@ -102,6 +102,21 @@ typedef struct macaddr } macaddr; /* + * This is the internal storage format for MAC addresses (EUI-64): + */ +typedef struct macaddr64 +{ + unsigned char a; + unsigned char b; + unsigned char c; + unsigned char d; + unsigned char e; + unsigned char f; + unsigned char g; + unsigned char h; +} macaddr64; + +/* * fmgr interface macros */ #define DatumGetInetP(X) ((inet *) PG_DETOAST_DATUM(X)) @@ -115,6 +130,11 @@ typedef struct macaddr #define MacaddrPGetDatum(X) PointerGetDatum(X) #define PG_GETARG_MACADDR_P(n) DatumGetMacaddrP(PG_GETARG_DATUM(n)) #define PG_RETURN_MACADDR_P(x) return MacaddrPGetDatum(x) +/* macaddr64 is a fixed-length pass-by-reference datatype */ +#define DatumGetMacaddr64P(X) ((macaddr64 *) DatumGetPointer(X)) +#define Macaddr64PGetDatum(X) PointerGetDatum(X) +#define PG_GETARG_MACADDR64_P(n) DatumGetMacaddr64P(PG_GETARG_DATUM(n)) +#define PG_RETURN_MACADDR64_P(x) return Macaddr64PGetDatum(x) /* * Support functions in network.c