|
Packit Service |
02fb89 |
/*
|
|
Packit Service |
02fb89 |
* Copyright (c) 1996, 1997, 1999, 2004
|
|
Packit Service |
02fb89 |
* The Regents of the University of California. All rights reserved.
|
|
Packit Service |
02fb89 |
*
|
|
Packit Service |
02fb89 |
* Redistribution and use in source and binary forms, with or without
|
|
Packit Service |
02fb89 |
* modification, are permitted provided that: (1) source code distributions
|
|
Packit Service |
02fb89 |
* retain the above copyright notice and this paragraph in its entirety, (2)
|
|
Packit Service |
02fb89 |
* distributions including binary code include the above copyright notice and
|
|
Packit Service |
02fb89 |
* this paragraph in its entirety in the documentation or other materials
|
|
Packit Service |
02fb89 |
* provided with the distribution, and (3) all advertising materials mentioning
|
|
Packit Service |
02fb89 |
* features or use of this software display the following acknowledgement:
|
|
Packit Service |
02fb89 |
* ``This product includes software developed by the University of California,
|
|
Packit Service |
02fb89 |
* Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
|
|
Packit Service |
02fb89 |
* the University nor the names of its contributors may be used to endorse
|
|
Packit Service |
02fb89 |
* or promote products derived from this software without specific prior
|
|
Packit Service |
02fb89 |
* written permission.
|
|
Packit Service |
02fb89 |
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
|
|
Packit Service |
02fb89 |
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
|
Packit Service |
02fb89 |
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
Packit Service |
02fb89 |
*/
|
|
Packit Service |
02fb89 |
#ifndef lint
|
|
Packit Service |
02fb89 |
static const char copyright[] =
|
|
Packit Service |
02fb89 |
"Copyright (c) 1996, 1997, 1999, 2004\n\
|
|
Packit Service |
02fb89 |
The Regents of the University of California. All rights reserved.\n";
|
|
Packit Service |
02fb89 |
static const char rcsid[] =
|
|
Packit Service |
02fb89 |
"@(#) $Header: /usr/src/local/sbin/arpwatch/RCS/arpsnmp.c,v 1.9 2004/01/22 22:25:11 leres Exp $ (LBL)";
|
|
Packit Service |
02fb89 |
#endif
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
/*
|
|
Packit Service |
02fb89 |
* arpsnmp - keep track of ethernet/ip address pairings, report changes
|
|
Packit Service |
02fb89 |
*/
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
#include <sys/param.h>
|
|
Packit Service |
02fb89 |
#include <sys/types.h> /* concession to AIX */
|
|
Packit Service |
02fb89 |
#include <sys/file.h>
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
#include <ctype.h>
|
|
Packit Service |
02fb89 |
#ifdef HAVE_MEMORY_H
|
|
Packit Service |
02fb89 |
#include <memory.h>
|
|
Packit Service |
02fb89 |
#endif
|
|
Packit Service |
02fb89 |
#ifdef HAVE_FCNTL_H
|
|
Packit Service |
02fb89 |
#include <fcntl.h>
|
|
Packit Service |
02fb89 |
#endif
|
|
Packit Service |
02fb89 |
#include <stdio.h>
|
|
Packit Service |
02fb89 |
#include <stdlib.h>
|
|
Packit Service |
02fb89 |
#include <string.h>
|
|
Packit Service |
02fb89 |
#include <syslog.h>
|
|
Packit Service |
02fb89 |
#include <time.h>
|
|
Packit Service |
02fb89 |
#include <unistd.h>
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
#include "gnuc.h"
|
|
Packit Service |
02fb89 |
#ifdef HAVE_OS_PROTO_H
|
|
Packit Service |
02fb89 |
#include "os-proto.h"
|
|
Packit Service |
02fb89 |
#endif
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
#include "arpwatch.h"
|
|
Packit Service |
02fb89 |
#include "db.h"
|
|
Packit Service |
02fb89 |
#include "ec.h"
|
|
Packit Service |
02fb89 |
#include "file.h"
|
|
Packit Service |
02fb89 |
#include "machdep.h"
|
|
Packit Service |
02fb89 |
#include "util.h"
|
|
Packit Service |
a3c422 |
#include "addresses.h"
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
/* Forwards */
|
|
Packit Service |
02fb89 |
int main(int, char **);
|
|
Packit Service |
02fb89 |
int readsnmp(char *);
|
|
Packit Service |
02fb89 |
int snmp_add(u_int32_t, u_char *, time_t, char *);
|
|
Packit Service |
02fb89 |
__dead void usage(void) __attribute__((volatile));
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
char *prog;
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
extern int optind;
|
|
Packit Service |
02fb89 |
extern int opterr;
|
|
Packit Service |
02fb89 |
extern char *optarg;
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
int
|
|
Packit Service |
02fb89 |
main(int argc, char **argv)
|
|
Packit Service |
02fb89 |
{
|
|
Packit Service |
02fb89 |
register char *cp;
|
|
Packit Service |
02fb89 |
register int op, i;
|
|
Packit Service |
02fb89 |
char errbuf[256];
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
if ((cp = strrchr(argv[0], '/')) != NULL)
|
|
Packit Service |
02fb89 |
prog = cp + 1;
|
|
Packit Service |
02fb89 |
else
|
|
Packit Service |
02fb89 |
prog = argv[0];
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
if (abort_on_misalignment(errbuf) < 0) {
|
|
Packit Service |
02fb89 |
(void)fprintf(stderr, "%s: %s\n", prog, errbuf);
|
|
Packit Service |
02fb89 |
exit(1);
|
|
Packit Service |
02fb89 |
}
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
opterr = 0;
|
|
Packit Service |
a3c422 |
while ((op = getopt(argc, argv, "df:e:s:")) != EOF)
|
|
Packit Service |
02fb89 |
switch (op) {
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
case 'd':
|
|
Packit Service |
02fb89 |
++debug;
|
|
Packit Service |
02fb89 |
#ifndef DEBUG
|
|
Packit Service |
02fb89 |
(void)fprintf(stderr,
|
|
Packit Service |
02fb89 |
"%s: Warning: Not compiled with -DDEBUG\n", prog);
|
|
Packit Service |
02fb89 |
#endif
|
|
Packit Service |
02fb89 |
break;
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
case 'f':
|
|
Packit Service |
02fb89 |
arpfile = optarg;
|
|
Packit Service |
02fb89 |
break;
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
a3c422 |
case 'e':
|
|
Packit Service |
a3c422 |
if ( optarg ) {
|
|
Packit Service |
a3c422 |
watcher = strdup(optarg);
|
|
Packit Service |
a3c422 |
} else {
|
|
Packit Service |
a3c422 |
(void)fprintf(stderr, "%s: Need recipient username/e-mail address after -e\n", prog);
|
|
Packit Service |
a3c422 |
usage();
|
|
Packit Service |
a3c422 |
}
|
|
Packit Service |
a3c422 |
break;
|
|
Packit Service |
a3c422 |
|
|
Packit Service |
a3c422 |
case 's':
|
|
Packit Service |
a3c422 |
if ( optarg ) {
|
|
Packit Service |
a3c422 |
watchee = strdup(optarg);
|
|
Packit Service |
a3c422 |
} else {
|
|
Packit Service |
a3c422 |
(void)fprintf(stderr, "%s: Need sender username/e-mail address after -s\n", prog);
|
|
Packit Service |
a3c422 |
usage();
|
|
Packit Service |
a3c422 |
}
|
|
Packit Service |
a3c422 |
break;
|
|
Packit Service |
a3c422 |
|
|
Packit Service |
02fb89 |
default:
|
|
Packit Service |
02fb89 |
usage();
|
|
Packit Service |
02fb89 |
}
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
if (optind == argc)
|
|
Packit Service |
02fb89 |
usage();
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
openlog(prog, 0, LOG_DAEMON);
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
/* Read in database */
|
|
Packit Service |
02fb89 |
initializing = 1;
|
|
Packit Service |
02fb89 |
/* XXX todo: file locking */
|
|
Packit Service |
02fb89 |
if (!readdata())
|
|
Packit Service |
02fb89 |
exit(1);
|
|
Packit Service |
02fb89 |
sorteinfo();
|
|
Packit Service |
02fb89 |
#ifdef DEBUG
|
|
Packit Service |
02fb89 |
if (debug > 2) {
|
|
Packit Service |
02fb89 |
debugdump();
|
|
Packit Service |
02fb89 |
exit(0);
|
|
Packit Service |
02fb89 |
}
|
|
Packit Service |
02fb89 |
#endif
|
|
Packit Service |
02fb89 |
initializing = 0;
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
/* Suck files in then exit */
|
|
Packit Service |
02fb89 |
for (i = optind; i < argc; ++i)
|
|
Packit Service |
02fb89 |
(void)readsnmp(argv[i]);
|
|
Packit Service |
02fb89 |
if (!dump())
|
|
Packit Service |
02fb89 |
exit(1);
|
|
Packit Service |
02fb89 |
exit(0);
|
|
Packit Service |
02fb89 |
}
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
static time_t now;
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
int
|
|
Packit Service |
02fb89 |
snmp_add(register u_int32_t a, register u_char *e, time_t t, register char *h)
|
|
Packit Service |
02fb89 |
{
|
|
Packit Service |
02fb89 |
/* Watch for ethernet broadcast */
|
|
Packit Service |
02fb89 |
if (MEMCMP(e, zero, 6) == 0 || MEMCMP(e, allones, 6) == 0) {
|
|
Packit Service |
02fb89 |
dosyslog(LOG_INFO, "ethernet broadcast", a, e, NULL);
|
|
Packit Service |
02fb89 |
return (1);
|
|
Packit Service |
02fb89 |
}
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
/* Watch for some ip broadcast addresses */
|
|
Packit Service |
02fb89 |
if (a == 0 || a == 1) {
|
|
Packit Service |
02fb89 |
dosyslog(LOG_INFO, "ip broadcast", a, e, NULL);
|
|
Packit Service |
02fb89 |
return (1);
|
|
Packit Service |
02fb89 |
}
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
/* Use current time (although it would be nice to subtract idle time) */
|
|
Packit Service |
02fb89 |
return (ent_add(a, e, now, h));
|
|
Packit Service |
02fb89 |
}
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
/* Process an snmp file */
|
|
Packit Service |
02fb89 |
int
|
|
Packit Service |
02fb89 |
readsnmp(register char *file)
|
|
Packit Service |
02fb89 |
{
|
|
Packit Service |
02fb89 |
register FILE *f;
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
if (debug > 2)
|
|
Packit Service |
02fb89 |
(void)fprintf(stderr, "%s: reading %s\n", prog, file);
|
|
Packit Service |
02fb89 |
if ((f = fopen(file, "r")) == NULL) {
|
|
Packit Service |
02fb89 |
syslog(LOG_ERR, "fopen(%s): %m", file);
|
|
Packit Service |
02fb89 |
return(0);
|
|
Packit Service |
02fb89 |
}
|
|
Packit Service |
02fb89 |
now = time(NULL);
|
|
Packit Service |
02fb89 |
if (!file_loop(f, snmp_add, file)) {
|
|
Packit Service |
02fb89 |
(void)fclose(f);
|
|
Packit Service |
02fb89 |
return(0);
|
|
Packit Service |
02fb89 |
}
|
|
Packit Service |
02fb89 |
(void)fclose(f);
|
|
Packit Service |
02fb89 |
return(1);
|
|
Packit Service |
02fb89 |
}
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
__dead void
|
|
Packit Service |
02fb89 |
usage(void)
|
|
Packit Service |
02fb89 |
{
|
|
Packit Service |
02fb89 |
extern char version[];
|
|
Packit Service |
02fb89 |
|
|
Packit Service |
02fb89 |
(void)fprintf(stderr, "Version %s\n", version);
|
|
Packit Service |
02fb89 |
(void)fprintf(stderr,
|
|
Packit Service |
a3c422 |
"usage: %s [-d] [-f datafile] [-e username] [-s username] file [...]\n", prog);
|
|
Packit Service |
02fb89 |
exit(1);
|
|
Packit Service |
02fb89 |
}
|