[alt.sources] [nfs] Re: PC-NFS user monitor

geoff@hinode.East.Sun.COM (Geoff Arnold @ Sun BOS - R.H. coast near the top) (08/15/90)

Archive-name: pcnfs-snoopd/10-Aug-90
Original-posting-by: geoff@hinode.East.Sun.COM (Geoff Arnold @ Sun BOS - R.H. coast near the top)
Original-subject: Re: PC-NFS user monitor
Reposted-by: emv@math.lsa.umich.edu (Edward Vielmetti)

[Reposted from comp.protocols.nfs.
Comments on this service to emv@math.lsa.umich.edu (Edward Vielmetti).]

Quoth perl@PacBell.COM (Richard Perlman) (in <1990Aug9.225014.27071@PacBell.COM>):
#We are looking for a "monitor" program that can look at a network
#and report back the I.P. address and PC-NFS serial number of all
#systems running PC-NFS on a given net/sub-net.  UNIX would be 
#preferred, but, MS-DOS is OK.
#
#We could write this ourselves, but if something already exists...

Here you are....
-------------------->8----------------------------8<------------------

/*
 * in.snoopd.c
 *
 * Hacked by Geoff Arnold from the source to in.tnamed.c
 *
 * This program snoops on UDP port 9 (the DISCARD port) looking for
 * PC-NFS License Violation Detection broadcasts. If it sees one, it
 * writes the serial number and IP address to stdout.
 *
 * Don't forget: make a backup copy of /etc/inetd.conf,
 * then comment out the "discard" lines therein. Then send a SIGHUP
 * to "inetd", so that it won't handle discards.
 * Run this program with output redirected to a file. Later you can
 * process the file with a simple shell script ("sort|uniq") and use
 * "ping" and "arp" to identify the Ethernet addresses and hostnames.
 *
 * Possible enhancements: catch SIGHUP to exit cleanly; issue 
 * gethostbyaddr() and "SIOCGARP" ioctl() to get the name and Ethernet
 * address info in real time.
 */
#include <stdio.h>
#include <strings.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <fcntl.h>

#define BUFLEN 2000

main(argc, argv)
	int argc;
	char **argv;
{
	int s, i;
	struct sockaddr_in client;
	int length, clientlength;
	char iobuf[BUFLEN];
	register char *buffer = iobuf;

		/* the daemon is run by hand and never exits */
		struct servent temp;
		register struct servent *sp;
		register struct protoent *pp;
		struct sockaddr_in server;

/*
 * Force non-blocking i/o to make sure everything is up to date
 */
		fcntl(stdout, F_SETFL, O_NDELAY);

		if((sp = getservbyname("discard","udp")) == NULL) {
			fprintf(stderr,
			   "in.tnamed: UDP discard server not in /etc/services\n");
			sp = &temp;
			sp->s_port = htons(9);
		}
		if((pp = getprotobyname("udp")) == NULL) {
			fprintf(stderr,
			    "in.tnamed: UDP protocol not in /etc/protocols\n");
			exit(1);
		}
		if((s = socket(AF_INET, SOCK_DGRAM, pp->p_proto)) < 0) {
			perror("in.snoopd: socket error");
			exit(1);
		}
		bzero((char *)&server, sizeof(server));
		server.sin_family = AF_INET;
		server.sin_port = sp->s_port;
		if(bind(s, &server, sizeof(server)) != 0) {
			perror("in.snoopd: bind error");
			exit(1);
		}
		fprintf(stderr, "in.snoopd: UDP discard snooper running\n");

	for (;;) {

		clientlength = sizeof(client);
		length = recvfrom(s, buffer, BUFLEN, 0, &client, &clientlength);
		if(length < 0) {
			perror("in.snoopd: recvfrom error. Try in.snoopd -v ?");
			continue;
		}
#ifdef DEBUG
		printf("in.snoopd: rcvd packet from %s\n",
			    inet_ntoa(client.sin_addr));
		for(i = 0; i < length; i++)
			printf("%02x", buffer[i]);
		printf("\n");
		for(i = 0; i < length; i++)
			printf("%c ", isprint(buffer[i]) ? buffer[i] : '.');
		printf("\n");
#endif
		if(length == 14 && !strncmp(buffer, "PC-NFS", 6)) {
			buffer[14] = '\0';
			printf("%s %s\n", buffer, inet_ntoa(client.sin_addr));
		}
	}
}


-------------------->8----------------------------8<------------------
-- Geoff Arnold, PC-NFS architect, Sun Microsystems. (geoff@East.Sun.COM)   --
** Back in the USA after a month in England. Most memorable scene: visiting **
** the "Duke Humfrey" library (part of the Bodleian in Oxford): wonderful   **
** 15th century ceiling, incanabulae and desks, the latter with PCs on...   **