Blame arpsnmp.c

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
}