Skip to content

Commit 8a35cbe

Browse files
author
Thomas G. Lockhart
committed
Add functions to convert to and from text, and to truncate to MAC OUI.
Remove hardcoded macaddr_manuf(), which had really old, obsolete info. Replace this with some contrib/mac/ code to maniag OUI info from IEEE.
1 parent aa2a3bf commit 8a35cbe

File tree

4 files changed

+111
-191
lines changed

4 files changed

+111
-191
lines changed

src/backend/utils/adt/mac.c

Lines changed: 69 additions & 156 deletions
Original file line numberDiff line numberDiff line change
@@ -1,143 +1,14 @@
11
/*
22
* PostgreSQL type definitions for MAC addresses.
33
*
4-
* $Header: /cvsroot/pgsql/src/backend/utils/adt/mac.c,v 1.17 2000/08/03 23:07:46 tgl Exp $
4+
* $Header: /cvsroot/pgsql/src/backend/utils/adt/mac.c,v 1.18 2000/08/23 06:04:33 thomas Exp $
55
*/
66

77
#include "postgres.h"
88

99
#include "utils/builtins.h"
1010
#include "utils/inet.h"
1111

12-
/*
13-
* XXX this table of manufacturers is long out of date, and should never
14-
* have been wired into the code in the first place.
15-
*/
16-
17-
typedef struct manufacturer
18-
{
19-
unsigned char a;
20-
unsigned char b;
21-
unsigned char c;
22-
char *name;
23-
} manufacturer;
24-
25-
static manufacturer manufacturers[] = {
26-
{0x00, 0x00, 0x0C, "Cisco"},
27-
{0x00, 0x00, 0x0E, "Fujitsu"},
28-
{0x00, 0x00, 0x0F, "NeXT"},
29-
{0x00, 0x00, 0x10, "Sytek"},
30-
{0x00, 0x00, 0x1D, "Cabletron"},
31-
{0x00, 0x00, 0x20, "DIAB"},
32-
{0x00, 0x00, 0x22, "Visual Technology"},
33-
{0x00, 0x00, 0x2A, "TRW"},
34-
{0x00, 0x00, 0x32, "GPT Limited"},
35-
{0x00, 0x00, 0x5A, "S & Koch"},
36-
{0x00, 0x00, 0x5E, "IANA"},
37-
{0x00, 0x00, 0x65, "Network General"},
38-
{0x00, 0x00, 0x6B, "MIPS"},
39-
{0x00, 0x00, 0x77, "MIPS"},
40-
{0x00, 0x00, 0x7A, "Ardent"},
41-
{0x00, 0x00, 0x89, "Cayman Systems"},
42-
{0x00, 0x00, 0x93, "Proteon"},
43-
{0x00, 0x00, 0x9F, "Ameristar Technology"},
44-
{0x00, 0x00, 0xA2, "Wellfleet"},
45-
{0x00, 0x00, 0xA3, "Network Application Technology"},
46-
{0x00, 0x00, 0xA6, "Network General"},
47-
{0x00, 0x00, 0xA7, "NCD"},
48-
{0x00, 0x00, 0xA9, "Network Systems"},
49-
{0x00, 0x00, 0xAA, "Xerox"},
50-
{0x00, 0x00, 0xB3, "CIMLinc"},
51-
{0x00, 0x00, 0xB7, "Dove Fastnet"},
52-
{0x00, 0x00, 0xBC, "Allen-Bradley"},
53-
{0x00, 0x00, 0xC0, "Western Digital"},
54-
{0x00, 0x00, 0xC5, "Farallon"},
55-
{0x00, 0x00, 0xC6, "Hewlett-Packard"},
56-
{0x00, 0x00, 0xC8, "Altos"},
57-
{0x00, 0x00, 0xC9, "Emulex"},
58-
{0x00, 0x00, 0xD7, "Dartmouth College"},
59-
{0x00, 0x00, 0xD8, "3Com (?)"},
60-
{0x00, 0x00, 0xDD, "Gould"},
61-
{0x00, 0x00, 0xDE, "Unigraph"},
62-
{0x00, 0x00, 0xE2, "Acer Counterpoint"},
63-
{0x00, 0x00, 0xEF, "Alantec"},
64-
{0x00, 0x00, 0xFD, "High Level Hardware"},
65-
{0x00, 0x01, 0x02, "BBN internal usage"},
66-
{0x00, 0x20, 0xAF, "3Com"},
67-
{0x00, 0x17, 0x00, "Kabel"},
68-
{0x00, 0x80, 0x64, "Wyse Technology"},
69-
{0x00, 0x80, 0x2B, "IMAC (?)"},
70-
{0x00, 0x80, 0x2D, "Xylogics, Inc."},
71-
{0x00, 0x80, 0x8C, "Frontier Software Development"},
72-
{0x00, 0x80, 0xC2, "IEEE 802.1 Committee"},
73-
{0x00, 0x80, 0xD3, "Shiva"},
74-
{0x00, 0xAA, 0x00, "Intel"},
75-
{0x00, 0xDD, 0x00, "Ungermann-Bass"},
76-
{0x00, 0xDD, 0x01, "Ungermann-Bass"},
77-
{0x02, 0x07, 0x01, "Racal InterLan"},
78-
{0x02, 0x04, 0x06, "BBN internal usage"},
79-
{0x02, 0x60, 0x86, "Satelcom MegaPac"},
80-
{0x02, 0x60, 0x8C, "3Com"},
81-
{0x02, 0xCF, 0x1F, "CMC"},
82-
{0x08, 0x00, 0x02, "3Com"},
83-
{0x08, 0x00, 0x03, "ACC"},
84-
{0x08, 0x00, 0x05, "Symbolics"},
85-
{0x08, 0x00, 0x08, "BBN"},
86-
{0x08, 0x00, 0x09, "Hewlett-Packard"},
87-
{0x08, 0x00, 0x0A, "Nestar Systems"},
88-
{0x08, 0x00, 0x0B, "Unisys"},
89-
{0x08, 0x00, 0x11, "Tektronix"},
90-
{0x08, 0x00, 0x14, "Excelan"},
91-
{0x08, 0x00, 0x17, "NSC"},
92-
{0x08, 0x00, 0x1A, "Data General"},
93-
{0x08, 0x00, 0x1B, "Data General"},
94-
{0x08, 0x00, 0x1E, "Apollo"},
95-
{0x08, 0x00, 0x20, "Sun"},
96-
{0x08, 0x00, 0x22, "NBI"},
97-
{0x08, 0x00, 0x25, "CDC"},
98-
{0x08, 0x00, 0x26, "Norsk Data"},
99-
{0x08, 0x00, 0x27, "PCS Computer Systems GmbH"},
100-
{0x08, 0x00, 0x28, "Texas Instruments"},
101-
{0x08, 0x00, 0x2B, "DEC"},
102-
{0x08, 0x00, 0x2E, "Metaphor"},
103-
{0x08, 0x00, 0x2F, "Prime Computer"},
104-
{0x08, 0x00, 0x36, "Intergraph"},
105-
{0x08, 0x00, 0x37, "Fujitsu-Xerox"},
106-
{0x08, 0x00, 0x38, "Bull"},
107-
{0x08, 0x00, 0x39, "Spider Systems"},
108-
{0x08, 0x00, 0x41, "DCA Digital Comm. Assoc."},
109-
{0x08, 0x00, 0x45, "Xylogics (?)"},
110-
{0x08, 0x00, 0x46, "Sony"},
111-
{0x08, 0x00, 0x47, "Sequent"},
112-
{0x08, 0x00, 0x49, "Univation"},
113-
{0x08, 0x00, 0x4C, "Encore"},
114-
{0x08, 0x00, 0x4E, "BICC"},
115-
{0x08, 0x00, 0x56, "Stanford University"},
116-
{0x08, 0x00, 0x58, "DECsystem 20 (?)"},
117-
{0x08, 0x00, 0x5A, "IBM"},
118-
{0x08, 0x00, 0x67, "Comdesign"},
119-
{0x08, 0x00, 0x68, "Ridge"},
120-
{0x08, 0x00, 0x69, "Silicon Graphics"},
121-
{0x08, 0x00, 0x6E, "Concurrent"},
122-
{0x08, 0x00, 0x75, "DDE"},
123-
{0x08, 0x00, 0x7C, "Vitalink"},
124-
{0x08, 0x00, 0x80, "XIOS"},
125-
{0x08, 0x00, 0x86, "Imagen/QMS"},
126-
{0x08, 0x00, 0x87, "Xyplex"},
127-
{0x08, 0x00, 0x89, "Kinetics"},
128-
{0x08, 0x00, 0x8B, "Pyramid"},
129-
{0x08, 0x00, 0x8D, "XyVision"},
130-
{0x08, 0x00, 0x90, "Retix Inc"},
131-
{0x48, 0x44, 0x53, "HDS (?)"},
132-
{0x80, 0x00, 0x10, "AT&T"},
133-
{0xAA, 0x00, 0x00, "DEC"},
134-
{0xAA, 0x00, 0x01, "DEC"},
135-
{0xAA, 0x00, 0x02, "DEC"},
136-
{0xAA, 0x00, 0x03, "DEC"},
137-
{0xAA, 0x00, 0x04, "DEC"},
138-
{0x00, 0x00, 0x00, NULL}
139-
};
140-
14112
/*
14213
* Utility macros used for sorting and comparing:
14314
*/
@@ -151,6 +22,7 @@ static manufacturer manufacturers[] = {
15122
/*
15223
* MAC address reader. Accepts several common notations.
15324
*/
25+
15426
Datum
15527
macaddr_in(PG_FUNCTION_ARGS)
15628
{
@@ -205,6 +77,7 @@ macaddr_in(PG_FUNCTION_ARGS)
20577
/*
20678
* MAC address output function. Fixed format.
20779
*/
80+
20881
Datum
20982
macaddr_out(PG_FUNCTION_ARGS)
21083
{
@@ -226,6 +99,57 @@ macaddr_out(PG_FUNCTION_ARGS)
22699
PG_RETURN_CSTRING(result);
227100
}
228101

102+
/* macaddr_text()
103+
* Convert macaddr to text data type.
104+
*/
105+
106+
Datum
107+
macaddr_text(PG_FUNCTION_ARGS)
108+
{
109+
/* Input is a macaddr, but may as well leave it in Datum form */
110+
Datum addr = PG_GETARG_DATUM(0);
111+
text *result;
112+
char *str;
113+
int len;
114+
115+
str = DatumGetCString(DirectFunctionCall1(macaddr_out, addr));
116+
117+
len = (strlen(str) + VARHDRSZ);
118+
119+
result = palloc(len);
120+
121+
VARATT_SIZEP(result) = len;
122+
memmove(VARDATA(result), str, (len - VARHDRSZ));
123+
124+
pfree(str);
125+
126+
PG_RETURN_TEXT_P(result);
127+
}
128+
129+
/* text_macaddr()
130+
* Convert text to macaddr data type.
131+
*/
132+
133+
Datum
134+
text_macaddr(PG_FUNCTION_ARGS)
135+
{
136+
Datum result;
137+
text *addr = PG_GETARG_TEXT_P(0);
138+
char str[18];
139+
int len;
140+
141+
len = (VARSIZE(addr)-VARHDRSZ);
142+
if (len >= 18)
143+
elog(ERROR, "Text is too long to convert to MAC address");
144+
145+
memmove(str, VARDATA(addr), len);
146+
*(str+len) = '\0';
147+
148+
result = DirectFunctionCall1(macaddr_in, CStringGetDatum(str));
149+
150+
return(result);
151+
}
152+
229153
/*
230154
* Comparison function for sorting:
231155
*/
@@ -257,6 +181,7 @@ macaddr_cmp(PG_FUNCTION_ARGS)
257181
/*
258182
* Boolean comparisons.
259183
*/
184+
260185
Datum
261186
macaddr_lt(PG_FUNCTION_ARGS)
262187
{
@@ -312,36 +237,24 @@ macaddr_ne(PG_FUNCTION_ARGS)
312237
}
313238

314239
/*
315-
* The special manufacturer fetching function.
240+
* Truncation function to allow comparing mac manufacturers.
241+
* From suggestion by Alex Pilosov <alex@pilosoft.com>
316242
*/
317243

318244
Datum
319-
macaddr_manuf(PG_FUNCTION_ARGS)
245+
macaddr_trunc(PG_FUNCTION_ARGS)
320246
{
247+
macaddr *result;
321248
macaddr *addr = PG_GETARG_MACADDR_P(0);
322-
manufacturer *manuf;
323-
int length;
324-
text *result;
325249

326-
for (manuf = manufacturers; manuf->name != NULL; manuf++)
327-
{
328-
if ((manuf->a == addr->a) &&
329-
(manuf->b == addr->b) &&
330-
(manuf->c == addr->c))
331-
break;
332-
}
333-
if (manuf->name == NULL)
334-
{
335-
/* Not known, so return empty string */
336-
result = palloc(VARHDRSZ);
337-
VARATT_SIZEP(result) = VARHDRSZ;
338-
}
339-
else
340-
{
341-
length = strlen(manuf->name);
342-
result = palloc(length + VARHDRSZ);
343-
VARATT_SIZEP(result) = length + VARHDRSZ;
344-
memcpy(VARDATA(result), manuf->name, length);
345-
}
346-
PG_RETURN_TEXT_P(result);
250+
result = (macaddr *) palloc(sizeof(macaddr));
251+
252+
result->a = addr->a;
253+
result->b = addr->b;
254+
result->c = addr->c;
255+
result->d = 0;
256+
result->e = 0;
257+
result->f = 0;
258+
259+
PG_RETURN_MACADDR_P(result);
347260
}

src/include/catalog/catversion.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
3838
* Portions Copyright (c) 1994, Regents of the University of California
3939
*
40-
* $Id: catversion.h,v 1.42 2000/08/21 04:48:51 tgl Exp $
40+
* $Id: catversion.h,v 1.43 2000/08/23 06:04:43 thomas Exp $
4141
*
4242
*-------------------------------------------------------------------------
4343
*/
@@ -53,6 +53,6 @@
5353
*/
5454

5555
/* yyyymmddN */
56-
#define CATALOG_VERSION_NO 200008201
56+
#define CATALOG_VERSION_NO 200008221
5757

5858
#endif

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy