openbsd-ports/net/arpwatch/patches/patch-ec_c
2022-03-11 19:45:43 +00:00

132 lines
2.9 KiB
Plaintext

zero-pad MAC address to match ifconfig(8) output
https://sources.debian.org/patches/arpwatch/2.1a15-6/33_bug315215_zero-pad-MAC/
remove DECnet remnants
use a red-black tree instead of linked list for searching vendor IDs
Index: ec.c
--- ec.c.orig
+++ ec.c
@@ -58,20 +58,28 @@ struct rtentry;
#include "arpwatch.h"
#include "ec.h"
#include "util.h"
+#include "tree.h"
/* Basic data structure */
-struct ecent {
+struct ecnode {
+ RB_ENTRY(ecnode) entry;
u_int32_t o; /* first 3 octets */
char *text; /* associated text */
};
-static struct ecent *list;
-static u_int ec_last = 0;
-static u_int ec_len = 0;
-
/* Forwards */
-static int ec_a2o(char *, u_int32_t *);
+int ocmp(struct ecnode *, struct ecnode *);
+/* Compare two ecnode addresses */
+int
+ocmp(struct ecnode *e1, struct ecnode *e2)
+{
+ return (e1->o < e2->o ? -1 : e1->o > e2->o);
+}
+
+RB_HEAD(ectree, ecnode) head = RB_INITIALIZER(&head);
+RB_GENERATE(ectree, ecnode, entry, ocmp);
+
/* Convert an 3 octets from an ethernet address to a u_int32_t */
static int
ec_a2o(register char *cp, register u_int32_t *op)
@@ -91,23 +99,18 @@ ec_a2o(register char *cp, register u_int32_t *op)
int
ec_add(register u_int32_t o, register char *text)
{
+ struct ecnode *n;
- if (ec_last >= ec_len) {
- if (list == NULL) {
- ec_len = 512;
- list = malloc(ec_len * sizeof(*list));
- } else {
- ec_len *= 2;
- list = realloc(list, ec_len * sizeof(*list));
- }
- if (list == NULL) {
- syslog(LOG_ERR, "ec_add(): malloc: %m");
- exit(1);
- }
+ if ((n = malloc(sizeof(struct ecnode))) == NULL) {
+ syslog(LOG_ERR, "%s: malloc\n", __func__);
+ return (0);
}
- list[ec_last].o = o;
- list[ec_last].text = savestr(text);
- ++ec_last;
+
+ n->o = o;
+ n->text = savestr(text);
+
+ RB_INSERT(ectree, &head, n);
+
return (1);
}
@@ -115,16 +118,16 @@ ec_add(register u_int32_t o, register char *text)
char *
ec_find(register u_char *e)
{
- u_int32_t o;
- register int i;
+ struct ecnode find, *res;
+ u_int32_t o = 0;
- o = 0;
BCOPY(e, &o, 3);
- for (i = 0; i < ec_last; ++i)
- if (list[i].o == o)
- return (list[i].text);
-
- return (NULL);
+ find.o = o;
+ res = RB_FIND(ectree, &head, &find);
+ if (res == NULL)
+ return (NULL);
+ else
+ return res->text;
}
/* Loop through the ethernet code database */
@@ -182,17 +185,6 @@ ec_loop(register FILE *f, ec_process fn, register cons
return (1);
}
-/* DECnet local logical address prefix */
-static u_char decnet[3] = { 0xaa, 0x0, 0x4 };
-
-/* Returns true if an ethernet address is decnet, else false */
-int
-isdecnet(register u_char *e)
-{
-
- return (MEMCMP(e, decnet, sizeof(decnet)) == 0);
-}
-
/* Convert an ascii ethernet string to ethernet address */
int
str2e(register char *str, register u_char *e)
@@ -218,7 +210,7 @@ e2str(register u_char *e)
{
static char str[32];
- (void)sprintf(str, "%x:%x:%x:%x:%x:%x",
+ (void)sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x",
e[0], e[1], e[2], e[3], e[4], e[5]);
return (str);
}