1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
$NetBSD: patch-ab,v 1.1.1.1 2002/01/10 14:06:31 bouyer Exp $
--- sdig.c.orig Fri May 18 15:02:55 2001
+++ sdig.c Sun Jan 6 18:45:02 2002
@@ -25,15 +25,19 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
+#include <sys/types.h>
#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
#include "common.h"
#include "version.h"
#define PPS 32 /* 32 ports per switch */
-#define CONFIGFILE "/etc/sdig.conf"
+#define CONFIGFILE PREFIX "/etc/sdig.conf"
char *wins = NULL, *nbname = NULL, *nmblookup = NULL,
*snmpget = NULL, *mactable = NULL;
@@ -115,6 +119,7 @@
char *findport (char *mac, char *swip, char *swpw)
{
char needle[64], oid[64], exec[256], *ptr, *ptr2, buf[256], *sp;
+ char sep = ':';
char *tmp;
FILE *out;
int i;
@@ -125,13 +130,22 @@
exit (1);
}
- snprintf (needle, sizeof(needle), "17.4.3.1.2");
+ snprintf (needle, sizeof(needle), ".1.3.6.1.2.1.17.4.3.1.2");
- ptr = strdup(mac);
+ if (strncmp(mac, " Hex: ", 6) == 0) {
+ sep = ' ';
+ ptr = strdup(mac + 6);
+ debug("MAC ptr with sep = ' ' is [%s]\n", ptr);
+ } else {
+ ptr = strdup(mac);
+ debug("MAC ptr with sep = ':' is [%s]\n", ptr);
+ }
for (i = 0; i < 6; i++) {
- sp = strchr (ptr, ':');
+ sp = strchr (ptr, sep);
if (sp)
*sp = '\0';
+ else
+ break;
val = strtoul (ptr, NULL, 16);
if (i == 5)
@@ -145,7 +159,7 @@
debug("needle is [%s]\n", needle);
- snprintf (exec, sizeof(exec), "%s %s %s %s 2>/dev/null", snmpget, swip, swpw, needle);
+ snprintf (exec, sizeof(exec), "%s -On %s %s %s 2>/dev/null", snmpget, swip, swpw, needle);
debug("popen: %s\n", exec);
out = popen (exec, "r");
@@ -472,6 +486,7 @@
{
FILE *macdb;
char buf[256], *mac, *tmp, *ptr, *cp, macfind[16];
+ char sep = ':';
int i, num[3];
macdb = fopen (mactable, "r");
@@ -482,9 +497,16 @@
num[0] = num[1] = num[2] = 0;
- ptr = mac = strdup(inmac);
+ if (strncmp(inmac, " Hex: ", 6) == 0) {
+ sep = ' ';
+ ptr = mac = strdup(inmac + 6);
+ debug("inMAC ptr with sep = ' ' is [%s]\n", ptr);
+ } else {
+ ptr = mac = strdup(inmac);
+ debug("inMAC ptr with sep = ':' is [%s]\n", ptr);
+ }
for (i = 0; i < 3; i++) {
- cp = strchr (ptr, ':');
+ cp = strchr (ptr, sep);
if (!cp)
continue;
@@ -498,6 +520,7 @@
snprintf(macfind, sizeof(macfind), "%02x %02x %02x",
num[0], num[1], num[2]);
+ debug("looking for MAC prefix [%s] in %s\n", macfind, mactable);
while (fgets(buf, sizeof(buf), macdb)) {
buf[strlen(buf) - 1] = '\0';
|