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