mac.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:8k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*
  2.  * PostgreSQL type definitions for MAC addresses.
  3.  *
  4.  * $Id: mac.c,v 1.8.2.1 1999/08/02 05:24:54 scrappy Exp $
  5.  */
  6. #include "postgres.h"
  7. #include "utils/builtins.h"
  8. manufacturer manufacturers[] = {
  9. {0x00, 0x00, 0x0C, "Cisco"},
  10. {0x00, 0x00, 0x0E, "Fujitsu"},
  11. {0x00, 0x00, 0x0F, "NeXT"},
  12. {0x00, 0x00, 0x10, "Sytek"},
  13. {0x00, 0x00, 0x1D, "Cabletron"},
  14. {0x00, 0x00, 0x20, "DIAB"},
  15. {0x00, 0x00, 0x22, "Visual Technology"},
  16. {0x00, 0x00, 0x2A, "TRW"},
  17. {0x00, 0x00, 0x32, "GPT Limited"},
  18. {0x00, 0x00, 0x5A, "S & Koch"},
  19. {0x00, 0x00, 0x5E, "IANA"},
  20. {0x00, 0x00, 0x65, "Network General"},
  21. {0x00, 0x00, 0x6B, "MIPS"},
  22. {0x00, 0x00, 0x77, "MIPS"},
  23. {0x00, 0x00, 0x7A, "Ardent"},
  24. {0x00, 0x00, 0x89, "Cayman Systems"},
  25. {0x00, 0x00, 0x93, "Proteon"},
  26. {0x00, 0x00, 0x9F, "Ameristar Technology"},
  27. {0x00, 0x00, 0xA2, "Wellfleet"},
  28. {0x00, 0x00, 0xA3, "Network Application Technology"},
  29. {0x00, 0x00, 0xA6, "Network General"},
  30. {0x00, 0x00, 0xA7, "NCD"},
  31. {0x00, 0x00, 0xA9, "Network Systems"},
  32. {0x00, 0x00, 0xAA, "Xerox"},
  33. {0x00, 0x00, 0xB3, "CIMLinc"},
  34. {0x00, 0x00, 0xB7, "Dove Fastnet"},
  35. {0x00, 0x00, 0xBC, "Allen-Bradley"},
  36. {0x00, 0x00, 0xC0, "Western Digital"},
  37. {0x00, 0x00, 0xC5, "Farallon"},
  38. {0x00, 0x00, 0xC6, "Hewlett-Packard"},
  39. {0x00, 0x00, 0xC8, "Altos"},
  40. {0x00, 0x00, 0xC9, "Emulex"},
  41. {0x00, 0x00, 0xD7, "Dartmouth College"},
  42. {0x00, 0x00, 0xD8, "3Com (?)"},
  43. {0x00, 0x00, 0xDD, "Gould"},
  44. {0x00, 0x00, 0xDE, "Unigraph"},
  45. {0x00, 0x00, 0xE2, "Acer Counterpoint"},
  46. {0x00, 0x00, 0xEF, "Alantec"},
  47. {0x00, 0x00, 0xFD, "High Level Hardware"},
  48. {0x00, 0x01, 0x02, "BBN internal usage"},
  49. {0x00, 0x20, 0xAF, "3Com"},
  50. {0x00, 0x17, 0x00, "Kabel"},
  51. {0x00, 0x80, 0x64, "Wyse Technology"},
  52. {0x00, 0x80, 0x2B, "IMAC (?)"},
  53. {0x00, 0x80, 0x2D, "Xylogics, Inc."},
  54. {0x00, 0x80, 0x8C, "Frontier Software Development"},
  55. {0x00, 0x80, 0xC2, "IEEE 802.1 Committee"},
  56. {0x00, 0x80, 0xD3, "Shiva"},
  57. {0x00, 0xAA, 0x00, "Intel"},
  58. {0x00, 0xDD, 0x00, "Ungermann-Bass"},
  59. {0x00, 0xDD, 0x01, "Ungermann-Bass"},
  60. {0x02, 0x07, 0x01, "Racal InterLan"},
  61. {0x02, 0x04, 0x06, "BBN internal usage"},
  62. {0x02, 0x60, 0x86, "Satelcom MegaPac"},
  63. {0x02, 0x60, 0x8C, "3Com"},
  64. {0x02, 0xCF, 0x1F, "CMC"},
  65. {0x08, 0x00, 0x02, "3Com"},
  66. {0x08, 0x00, 0x03, "ACC"},
  67. {0x08, 0x00, 0x05, "Symbolics"},
  68. {0x08, 0x00, 0x08, "BBN"},
  69. {0x08, 0x00, 0x09, "Hewlett-Packard"},
  70. {0x08, 0x00, 0x0A, "Nestar Systems"},
  71. {0x08, 0x00, 0x0B, "Unisys"},
  72. {0x08, 0x00, 0x11, "Tektronix"},
  73. {0x08, 0x00, 0x14, "Excelan"},
  74. {0x08, 0x00, 0x17, "NSC"},
  75. {0x08, 0x00, 0x1A, "Data General"},
  76. {0x08, 0x00, 0x1B, "Data General"},
  77. {0x08, 0x00, 0x1E, "Apollo"},
  78. {0x08, 0x00, 0x20, "Sun"},
  79. {0x08, 0x00, 0x22, "NBI"},
  80. {0x08, 0x00, 0x25, "CDC"},
  81. {0x08, 0x00, 0x26, "Norsk Data"},
  82. {0x08, 0x00, 0x27, "PCS Computer Systems GmbH"},
  83. {0x08, 0x00, 0x28, "Texas Instruments"},
  84. {0x08, 0x00, 0x2B, "DEC"},
  85. {0x08, 0x00, 0x2E, "Metaphor"},
  86. {0x08, 0x00, 0x2F, "Prime Computer"},
  87. {0x08, 0x00, 0x36, "Intergraph"},
  88. {0x08, 0x00, 0x37, "Fujitsu-Xerox"},
  89. {0x08, 0x00, 0x38, "Bull"},
  90. {0x08, 0x00, 0x39, "Spider Systems"},
  91. {0x08, 0x00, 0x41, "DCA Digital Comm. Assoc."},
  92. {0x08, 0x00, 0x45, "Xylogics (?)"},
  93. {0x08, 0x00, 0x46, "Sony"},
  94. {0x08, 0x00, 0x47, "Sequent"},
  95. {0x08, 0x00, 0x49, "Univation"},
  96. {0x08, 0x00, 0x4C, "Encore"},
  97. {0x08, 0x00, 0x4E, "BICC"},
  98. {0x08, 0x00, 0x56, "Stanford University"},
  99. {0x08, 0x00, 0x58, "DECsystem 20 (?)"},
  100. {0x08, 0x00, 0x5A, "IBM"},
  101. {0x08, 0x00, 0x67, "Comdesign"},
  102. {0x08, 0x00, 0x68, "Ridge"},
  103. {0x08, 0x00, 0x69, "Silicon Graphics"},
  104. {0x08, 0x00, 0x6E, "Concurrent"},
  105. {0x08, 0x00, 0x75, "DDE"},
  106. {0x08, 0x00, 0x7C, "Vitalink"},
  107. {0x08, 0x00, 0x80, "XIOS"},
  108. {0x08, 0x00, 0x86, "Imagen/QMS"},
  109. {0x08, 0x00, 0x87, "Xyplex"},
  110. {0x08, 0x00, 0x89, "Kinetics"},
  111. {0x08, 0x00, 0x8B, "Pyramid"},
  112. {0x08, 0x00, 0x8D, "XyVision"},
  113. {0x08, 0x00, 0x90, "Retix Inc"},
  114. {0x48, 0x44, 0x53, "HDS (?)"},
  115. {0x80, 0x00, 0x10, "AT&T"},
  116. {0xAA, 0x00, 0x00, "DEC"},
  117. {0xAA, 0x00, 0x01, "DEC"},
  118. {0xAA, 0x00, 0x02, "DEC"},
  119. {0xAA, 0x00, 0x03, "DEC"},
  120. {0xAA, 0x00, 0x04, "DEC"},
  121. {0x00, 0x00, 0x00, NULL}
  122. };
  123. /*
  124.  * Utility macros used for sorting and comparing:
  125.  */
  126. #define hibits(addr) 
  127.   ((unsigned long)((addr->a<<16)|(addr->b<<8)|(addr->c)))
  128. #define lobits(addr) 
  129.   ((unsigned long)((addr->c<<16)|(addr->e<<8)|(addr->f)))
  130. /*
  131.  * MAC address reader.  Accepts several common notations.
  132.  */
  133. macaddr    *
  134. macaddr_in(char *str)
  135. {
  136. int a,
  137. b,
  138. c,
  139. d,
  140. e,
  141. f;
  142. macaddr    *result;
  143. int count;
  144. if (strlen(str) > 0)
  145. {
  146. count = sscanf(str, "%x:%x:%x:%x:%x:%x", &a, &b, &c, &d, &e, &f);
  147. if (count != 6)
  148. count = sscanf(str, "%x-%x-%x-%x-%x-%x", &a, &b, &c, &d, &e, &f);
  149. if (count != 6)
  150. count = sscanf(str, "%2x%2x%2x:%2x%2x%2x", &a, &b, &c, &d, &e, &f);
  151. if (count != 6)
  152. count = sscanf(str, "%2x%2x%2x-%2x%2x%2x", &a, &b, &c, &d, &e, &f);
  153. if (count != 6)
  154. count = sscanf(str, "%2x%2x.%2x%2x.%2x%2x", &a, &b, &c, &d, &e, &f);
  155. if (count != 6)
  156. elog(ERROR, "macaddr_in: error in parsing "%s"", str);
  157. if ((a < 0) || (a > 255) || (b < 0) || (b > 255) ||
  158. (c < 0) || (c > 255) || (d < 0) || (d > 255) ||
  159. (e < 0) || (e > 255) || (f < 0) || (f > 255))
  160. elog(ERROR, "macaddr_in: illegal address "%s"", str);
  161. }
  162. else
  163. {
  164. a = b = c = d = e = f = 0; /* special case for missing
  165.  * address */
  166. }
  167. result = (macaddr *) palloc(sizeof(macaddr));
  168. result->a = a;
  169. result->b = b;
  170. result->c = c;
  171. result->d = d;
  172. result->e = e;
  173. result->f = f;
  174. return (result);
  175. }
  176. /*
  177.  * MAC address output function.  Fixed format.
  178.  */
  179. char *
  180. macaddr_out(macaddr *addr)
  181. {
  182. char    *result;
  183. if (addr == NULL)
  184. return (NULL);
  185. result = (char *) palloc(32);
  186. if ((hibits(addr) > 0) || (lobits(addr) > 0))
  187. {
  188. sprintf(result, "%02x:%02x:%02x:%02x:%02x:%02x",
  189. addr->a, addr->b, addr->c, addr->d, addr->e, addr->f);
  190. }
  191. else
  192. {
  193. result[0] = 0; /* special case for missing address */
  194. }
  195. return (result);
  196. }
  197. /*
  198.  * Boolean tests.
  199.  */
  200. bool
  201. macaddr_lt(macaddr *a1, macaddr *a2)
  202. {
  203. if (!PointerIsValid(a1) || !PointerIsValid(a2))
  204. return FALSE;
  205. return ((hibits(a1) < hibits(a2)) ||
  206. ((hibits(a1) == hibits(a2)) && lobits(a1) < lobits(a2)));
  207. }
  208. bool
  209. macaddr_le(macaddr *a1, macaddr *a2)
  210. {
  211. if (!PointerIsValid(a1) || !PointerIsValid(a2))
  212. return FALSE;
  213. return ((hibits(a1) < hibits(a2)) ||
  214. ((hibits(a1) == hibits(a2)) && lobits(a1) <= lobits(a2)));
  215. }
  216. bool
  217. macaddr_eq(macaddr *a1, macaddr *a2)
  218. {
  219. if (!PointerIsValid(a1) || !PointerIsValid(a2))
  220. return FALSE;
  221. return ((hibits(a1) == hibits(a2)) && (lobits(a1) == lobits(a2)));
  222. }
  223. bool
  224. macaddr_ge(macaddr *a1, macaddr *a2)
  225. {
  226. if (!PointerIsValid(a1) || !PointerIsValid(a2))
  227. return FALSE;
  228. return ((hibits(a1) > hibits(a2)) ||
  229. ((hibits(a1) == hibits(a2)) && lobits(a1) >= lobits(a2)));
  230. }
  231. bool
  232. macaddr_gt(macaddr *a1, macaddr *a2)
  233. {
  234. if (!PointerIsValid(a1) || !PointerIsValid(a2))
  235. return FALSE;
  236. return ((hibits(a1) > hibits(a2)) ||
  237. ((hibits(a1) == hibits(a2)) && lobits(a1) > lobits(a2)));
  238. }
  239. bool
  240. macaddr_ne(macaddr *a1, macaddr *a2)
  241. {
  242. if (!PointerIsValid(a1) || !PointerIsValid(a2))
  243. return FALSE;
  244. return ((hibits(a1) != hibits(a2)) || (lobits(a1) != lobits(a2)));
  245. }
  246. /*
  247.  * Comparison function for sorting:
  248.  */
  249. int4
  250. macaddr_cmp(macaddr *a1, macaddr *a2)
  251. {
  252. if (hibits(a1) < hibits(a2))
  253. return -1;
  254. else if (hibits(a1) > hibits(a2))
  255. return 1;
  256. else if (lobits(a1) < lobits(a2))
  257. return -1;
  258. else if (lobits(a1) > lobits(a2))
  259. return 1;
  260. else
  261. return 0;
  262. }
  263. /*
  264.  * The special manufacturer fetching function.  See "mac.h".
  265.  */
  266. text *
  267. macaddr_manuf(macaddr *addr)
  268. {
  269. manufacturer *manuf;
  270. int length;
  271. text    *result;
  272. if (!PointerIsValid(addr))
  273. return NULL;
  274. for (manuf = manufacturers; manuf->name != NULL; manuf++)
  275. {
  276. if ((manuf->a == addr->a) &&
  277. (manuf->b == addr->b) &&
  278. (manuf->c == addr->c))
  279. break;
  280. }
  281. if (manuf->name == NULL)
  282. {
  283. result = palloc(VARHDRSZ + 1);
  284. memset(result, 0, VARHDRSZ + 1);
  285. VARSIZE(result) = VARHDRSZ + 1;
  286. }
  287. else
  288. {
  289. length = strlen(manuf->name) + 1;
  290. result = palloc(length + VARHDRSZ);
  291. memset(result, 0, length + VARHDRSZ);
  292. VARSIZE(result) = length + VARHDRSZ;
  293. memcpy(VARDATA(result), manuf->name, length);
  294. }
  295. return result;
  296. }