xref: /csrg-svn/old/implogd/implogd.c (revision 9196)
18457Ssam /*	implogd.c	4.2	82/10/10	*/
26480Ssam 
36480Ssam #include <time.h>
46480Ssam #include <sgtty.h>
5*9196Ssam 
66480Ssam #include <sys/types.h>
76480Ssam #include <sys/socket.h>
86480Ssam 
9*9196Ssam #include <netinet/in.h>
10*9196Ssam 
116480Ssam #define	LOGFILE	"/usr/adm/implog"
126480Ssam #define	IMPMTU	((8159 / 8) & ~01)
136480Ssam 
146480Ssam u_char	request[1024];
156480Ssam int	marktime();
166480Ssam int	options;
176480Ssam extern	int errno;
186480Ssam int	log;
196480Ssam 
206480Ssam /*
216480Ssam  * Socket address, internet style, with
226480Ssam  * unused space taken by timestamp and packet
236480Ssam  * size.
246480Ssam  */
256480Ssam struct sockstamp {
266480Ssam 	short	sin_family;
276480Ssam 	u_short	sin_port;
286480Ssam 	struct	in_addr sin_addr;
296480Ssam 	time_t	sin_time;
30*9196Ssam 	int	sin_len;
316480Ssam };
326480Ssam 
336480Ssam main(argc, argv)
346480Ssam 	char *argv[];
356480Ssam {
36*9196Ssam 	int s;
376480Ssam 	time_t t;
38*9196Ssam 	struct sockstamp from;
396480Ssam 
406480Ssam 	argc--, argv++;
416480Ssam 	if (argc > 0 && !strcmp(argv[0], "-d"))
426480Ssam 		options |= SO_DEBUG;
438457Ssam #ifndef DEBUG
448457Ssam 	if (fork())
458457Ssam 		exit(0);
468457Ssam 	for (s = 0; s < 10; s++)
478457Ssam 		(void) close(t);
488457Ssam 	(void) open("/", 0);
498457Ssam 	(void) dup2(0, 1);
508457Ssam 	(void) dup2(0, 2);
518457Ssam 	{ int tt = open("/dev/tty", 2);
528457Ssam 	  if (tt > 0) {
538457Ssam 		ioctl(tt, TIOCNOTTY, 0);
548457Ssam 		close(tt);
558457Ssam 	  }
566480Ssam 	}
578457Ssam #endif
586480Ssam 	log = open(LOGFILE, 1);
596480Ssam 	if (log < 0)
606480Ssam 		exit(1);
616480Ssam 	lseek(log, 0L, 2);
626480Ssam 	from.sin_time = time(0);
63*9196Ssam 	from.sin_len = sizeof (time_t);
64*9196Ssam 	write(log, (char *)&from, sizeof (from));
656480Ssam again:
66*9196Ssam 	s = socket(AF_IMPLINK, SOCK_RAW, 0, 0);
67*9196Ssam 	if (s < 0) {
686480Ssam 		perror("socket");
696480Ssam 		sleep(5);
706480Ssam 		goto again;
716480Ssam 	}
726480Ssam 	for (;;) {
73*9196Ssam 		int len = sizeof (request);
74*9196Ssam 
75*9196Ssam 		if (recvfrom(s, request, &len, &from, sizeof (from), 0) < 0)
766480Ssam 			continue;
77*9196Ssam 		if (len <= 0 || len > IMPMTU)	/* sanity */
786480Ssam 			continue;
79*9196Ssam 		from.sin_len = len;
806480Ssam 		from.sin_time = time(0);
81*9196Ssam 		write(log, (char *)&from, sizeof (from));
82*9196Ssam 		write(log, request, len);
836480Ssam 	}
846480Ssam 	/*NOTREACHED*/
856480Ssam }
86