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