threaded in order to better deal with the requirements of multi-interface routers. Information regarding MAC addresses and interfaces is maintained by the program, and an alert is issued should a device move between interfaces. In addition, event processing has been refactored, and some bugs have been fixed. PR: 59180 Submitted by: Matthew George <mdg@secureworks.net> Approved by: portmgr
78 lines
1.9 KiB
Text
78 lines
1.9 KiB
Text
--- ../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 */
|