xref: /csrg-svn/old/implogd/implogd.c (revision 33456)
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*33456Skarels static char sccsid[] = "@(#)implogd.c	5.4 (Berkeley) 02/08/88";
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>
2229429Skarels #include <sys/syslog.h>
239251Ssam #include <sys/file.h>
246480Ssam 
25*33456Skarels #include <net/if.h>
26*33456Skarels 
279196Ssam #include <netinet/in.h>
289251Ssam #include <netimp/if_imp.h>
299196Ssam 
306480Ssam #define	LOGFILE	"/usr/adm/implog"
316480Ssam 
326480Ssam u_char	request[1024];
336480Ssam int	marktime();
346480Ssam int	options;
356480Ssam extern	int errno;
366480Ssam int	log;
376480Ssam 
386480Ssam /*
396480Ssam  * Socket address, internet style, with
406480Ssam  * unused space taken by timestamp and packet
416480Ssam  * size.
426480Ssam  */
436480Ssam struct sockstamp {
446480Ssam 	short	sin_family;
456480Ssam 	u_short	sin_port;
466480Ssam 	struct	in_addr sin_addr;
476480Ssam 	time_t	sin_time;
489196Ssam 	int	sin_len;
496480Ssam };
506480Ssam 
516480Ssam main(argc, argv)
526480Ssam 	char *argv[];
536480Ssam {
5429429Skarels 	int i, s;
556480Ssam 	time_t t;
569196Ssam 	struct sockstamp from;
576480Ssam 
586480Ssam 	argc--, argv++;
5929429Skarels 	openlog("implogd", LOG_PID | LOG_ODELAY, LOG_DAEMON);
606480Ssam 	if (argc > 0 && !strcmp(argv[0], "-d"))
616480Ssam 		options |= SO_DEBUG;
6227728Skarels 	log = open(LOGFILE, O_CREAT|O_WRONLY|O_APPEND, 0644);
6327728Skarels 	if (log < 0) {
6429429Skarels 		syslog(LOG_ERR, "%s: %m\n", LOGFILE);
6527728Skarels 		perror("implogd: open");
6627728Skarels 		exit(1);
6727728Skarels 	}
6827728Skarels 	from.sin_time = time(0);
6927728Skarels 	from.sin_len = sizeof (time_t);
7027728Skarels 	write(log, (char *)&from, sizeof (from));
7127728Skarels 	if ((s = socket(AF_IMPLINK, SOCK_RAW, 0)) < 0) {
7229429Skarels 		syslog(LOG_ERR, "socket: %m\n");
7327728Skarels 		perror("implogd: socket");
7427728Skarels 		exit(5);
7527728Skarels 	}
768457Ssam #ifndef DEBUG
778457Ssam 	if (fork())
788457Ssam 		exit(0);
7929429Skarels 	for (i = 0; i < 10; i++)
8029429Skarels 		if (i != log && i != s)
8129429Skarels 			(void) close(i);
828457Ssam 	(void) open("/", 0);
838457Ssam 	(void) dup2(0, 1);
848457Ssam 	(void) dup2(0, 2);
858457Ssam 	{ int tt = open("/dev/tty", 2);
868457Ssam 	  if (tt > 0) {
878457Ssam 		ioctl(tt, TIOCNOTTY, 0);
888457Ssam 		close(tt);
898457Ssam 	  }
906480Ssam 	}
918457Ssam #endif
926480Ssam 	for (;;) {
9312237Ssam 		int fromlen = sizeof (from), len;
949196Ssam 
9512237Ssam 		len = recvfrom(s, request, sizeof (request), 0,
9612237Ssam 			&from, &fromlen);
9712237Ssam 		if (len < 0) {
9829429Skarels 			syslog(LOG_ERR, "recvfrom: %m\n");
999251Ssam 			perror("implogd: recvfrom");
1006480Ssam 			continue;
1019251Ssam 		}
10212237Ssam 		if (len == 0 || len > IMPMTU)	/* sanity */
1036480Ssam 			continue;
1049196Ssam 		from.sin_len = len;
1056480Ssam 		from.sin_time = time(0);
1069196Ssam 		write(log, (char *)&from, sizeof (from));
1079196Ssam 		write(log, request, len);
1086480Ssam 	}
1096480Ssam 	/*NOTREACHED*/
1106480Ssam }
111