xref: /csrg-svn/old/implogd/implogd.c (revision 29429)
121139Sdist /*
221139Sdist  * Copyright (c) 1983 Regents of the University of California.
321139Sdist  * All rights reserved.  The Berkeley software License Agreement
421139Sdist  * specifies the terms and conditions for redistribution.
521139Sdist  */
621139Sdist 
79198Ssam #ifndef lint
821139Sdist char copyright[] =
921139Sdist "@(#) Copyright (c) 1983 Regents of the University of California.\n\
1021139Sdist  All rights reserved.\n";
1121139Sdist #endif not lint
126480Ssam 
1321139Sdist #ifndef lint
14*29429Skarels static char sccsid[] = "@(#)implogd.c	5.3 (Berkeley) 06/25/86";
1521139Sdist #endif not lint
1621139Sdist 
176480Ssam #include <sgtty.h>
189196Ssam 
1913601Ssam #include <sys/time.h>
209251Ssam #include <sys/param.h>
216480Ssam #include <sys/socket.h>
22*29429Skarels #include <sys/syslog.h>
239251Ssam #include <sys/file.h>
246480Ssam 
259196Ssam #include <netinet/in.h>
269251Ssam #include <netimp/if_imp.h>
279196Ssam 
286480Ssam #define	LOGFILE	"/usr/adm/implog"
296480Ssam 
306480Ssam u_char	request[1024];
316480Ssam int	marktime();
326480Ssam int	options;
336480Ssam extern	int errno;
346480Ssam int	log;
356480Ssam 
366480Ssam /*
376480Ssam  * Socket address, internet style, with
386480Ssam  * unused space taken by timestamp and packet
396480Ssam  * size.
406480Ssam  */
416480Ssam struct sockstamp {
426480Ssam 	short	sin_family;
436480Ssam 	u_short	sin_port;
446480Ssam 	struct	in_addr sin_addr;
456480Ssam 	time_t	sin_time;
469196Ssam 	int	sin_len;
476480Ssam };
486480Ssam 
496480Ssam main(argc, argv)
506480Ssam 	char *argv[];
516480Ssam {
52*29429Skarels 	int i, s;
536480Ssam 	time_t t;
549196Ssam 	struct sockstamp from;
556480Ssam 
566480Ssam 	argc--, argv++;
57*29429Skarels 	openlog("implogd", LOG_PID | LOG_ODELAY, LOG_DAEMON);
586480Ssam 	if (argc > 0 && !strcmp(argv[0], "-d"))
596480Ssam 		options |= SO_DEBUG;
6027728Skarels 	log = open(LOGFILE, O_CREAT|O_WRONLY|O_APPEND, 0644);
6127728Skarels 	if (log < 0) {
62*29429Skarels 		syslog(LOG_ERR, "%s: %m\n", LOGFILE);
6327728Skarels 		perror("implogd: open");
6427728Skarels 		exit(1);
6527728Skarels 	}
6627728Skarels 	from.sin_time = time(0);
6727728Skarels 	from.sin_len = sizeof (time_t);
6827728Skarels 	write(log, (char *)&from, sizeof (from));
6927728Skarels 	if ((s = socket(AF_IMPLINK, SOCK_RAW, 0)) < 0) {
70*29429Skarels 		syslog(LOG_ERR, "socket: %m\n");
7127728Skarels 		perror("implogd: socket");
7227728Skarels 		exit(5);
7327728Skarels 	}
748457Ssam #ifndef DEBUG
758457Ssam 	if (fork())
768457Ssam 		exit(0);
77*29429Skarels 	for (i = 0; i < 10; i++)
78*29429Skarels 		if (i != log && i != s)
79*29429Skarels 			(void) close(i);
808457Ssam 	(void) open("/", 0);
818457Ssam 	(void) dup2(0, 1);
828457Ssam 	(void) dup2(0, 2);
838457Ssam 	{ int tt = open("/dev/tty", 2);
848457Ssam 	  if (tt > 0) {
858457Ssam 		ioctl(tt, TIOCNOTTY, 0);
868457Ssam 		close(tt);
878457Ssam 	  }
886480Ssam 	}
898457Ssam #endif
906480Ssam 	for (;;) {
9112237Ssam 		int fromlen = sizeof (from), len;
929196Ssam 
9312237Ssam 		len = recvfrom(s, request, sizeof (request), 0,
9412237Ssam 			&from, &fromlen);
9512237Ssam 		if (len < 0) {
96*29429Skarels 			syslog(LOG_ERR, "recvfrom: %m\n");
979251Ssam 			perror("implogd: recvfrom");
986480Ssam 			continue;
999251Ssam 		}
10012237Ssam 		if (len == 0 || len > IMPMTU)	/* sanity */
1016480Ssam 			continue;
1029196Ssam 		from.sin_len = len;
1036480Ssam 		from.sin_time = time(0);
1049196Ssam 		write(log, (char *)&from, sizeof (from));
1059196Ssam 		write(log, request, len);
1066480Ssam 	}
1076480Ssam 	/*NOTREACHED*/
1086480Ssam }
109