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
|
--- ../arpwatch.orig/util.c Fri Oct 13 18:49:03 2000
+++ ./util.c Wed Sep 10 13:03:27 2003
@@ -53,6 +53,7 @@
char *arpdir = ARPDIR;
char *arpfile = ARPFILE;
+char *etherfile = ETHERFILE;
char *ethercodes = ETHERCODES;
/* Broadcast ethernet addresses */
@@ -105,7 +106,7 @@
dump(void)
{
register int fd;
- char oldarpfile[256], newarpfile[256];
+ char oldarpfile[256], newarpfile[256], *oldetherfile, *newetherfile;
(void)sprintf(oldarpfile, "%s-", arpfile);
(void)sprintf(newarpfile, "%s.new", arpfile);
@@ -130,6 +131,32 @@
syslog(LOG_ERR, "rename %s -> %s: %m", newarpfile, arpfile);
return(0);
}
+
+ /* ether info */
+ (void)asprintf(&oldetherfile, "%s-", etherfile);
+ (void)asprintf(&newetherfile, "%s.new", etherfile);
+
+ if ((fd = creat(newetherfile, 0644)) < 0) {
+ syslog(LOG_ERR, "creat(%s): %m", newetherfile);
+ return(0);
+ }
+ if ((dumpf = fdopen(fd, "w")) == NULL) {
+ syslog(LOG_ERR, "fdopen(%s): %m", newetherfile);
+ return(0);
+ }
+
+ fwrite(einfo_table, sizeof(struct einfo), et_cnt, dumpf);
+
+ (void)fclose(dumpf);
+ if (rename(etherfile, oldetherfile) < 0) {
+ syslog(LOG_ERR, "rename %s -> %s: %m", etherfile, oldetherfile);
+ return(0);
+ }
+ if (rename(newetherfile, etherfile) < 0) {
+ syslog(LOG_ERR, "rename %s -> %s: %m", newetherfile, etherfile);
+ return(0);
+ }
+
return(1);
}
@@ -138,7 +165,9 @@
readdata(void)
{
register FILE *f;
+ char line[1024];
+ /* arp.dat */
if ((f = fopen(arpfile, "r")) == NULL) {
syslog(LOG_ERR, "fopen(%s): %m", arpfile);
return(0);
@@ -147,6 +176,15 @@
(void)fclose(f);
return(0);
}
+ (void)fclose(f);
+
+ /* ether.dat */
+ if ((f = fopen(etherfile, "r")) == NULL) {
+ syslog(LOG_ERR, "fopen(%s): %m", etherfile);
+ return(0);
+ }
+
+ et_cnt = fread(einfo_table, sizeof(struct einfo), HASHSIZE, f);
(void)fclose(f);
/* It's not fatal if we can't open the ethercodes file */
|