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*27728Skarels static char sccsid[] = "@(#)implogd.c 5.2 (Berkeley) 05/05/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> 229251Ssam #include <sys/file.h> 236480Ssam 249196Ssam #include <netinet/in.h> 259251Ssam #include <netimp/if_imp.h> 269196Ssam 276480Ssam #define LOGFILE "/usr/adm/implog" 286480Ssam 296480Ssam u_char request[1024]; 306480Ssam int marktime(); 316480Ssam int options; 326480Ssam extern int errno; 336480Ssam int log; 346480Ssam 356480Ssam /* 366480Ssam * Socket address, internet style, with 376480Ssam * unused space taken by timestamp and packet 386480Ssam * size. 396480Ssam */ 406480Ssam struct sockstamp { 416480Ssam short sin_family; 426480Ssam u_short sin_port; 436480Ssam struct in_addr sin_addr; 446480Ssam time_t sin_time; 459196Ssam int sin_len; 466480Ssam }; 476480Ssam 486480Ssam main(argc, argv) 496480Ssam char *argv[]; 506480Ssam { 519196Ssam int s; 526480Ssam time_t t; 539196Ssam struct sockstamp from; 546480Ssam 556480Ssam argc--, argv++; 566480Ssam if (argc > 0 && !strcmp(argv[0], "-d")) 576480Ssam options |= SO_DEBUG; 58*27728Skarels log = open(LOGFILE, O_CREAT|O_WRONLY|O_APPEND, 0644); 59*27728Skarels if (log < 0) { 60*27728Skarels perror("implogd: open"); 61*27728Skarels exit(1); 62*27728Skarels } 63*27728Skarels from.sin_time = time(0); 64*27728Skarels from.sin_len = sizeof (time_t); 65*27728Skarels write(log, (char *)&from, sizeof (from)); 66*27728Skarels if ((s = socket(AF_IMPLINK, SOCK_RAW, 0)) < 0) { 67*27728Skarels perror("implogd: socket"); 68*27728Skarels exit(5); 69*27728Skarels } 708457Ssam #ifndef DEBUG 718457Ssam if (fork()) 728457Ssam exit(0); 738457Ssam for (s = 0; s < 10; s++) 748457Ssam (void) close(t); 758457Ssam (void) open("/", 0); 768457Ssam (void) dup2(0, 1); 778457Ssam (void) dup2(0, 2); 788457Ssam { int tt = open("/dev/tty", 2); 798457Ssam if (tt > 0) { 808457Ssam ioctl(tt, TIOCNOTTY, 0); 818457Ssam close(tt); 828457Ssam } 836480Ssam } 848457Ssam #endif 856480Ssam for (;;) { 8612237Ssam int fromlen = sizeof (from), len; 879196Ssam 8812237Ssam len = recvfrom(s, request, sizeof (request), 0, 8912237Ssam &from, &fromlen); 9012237Ssam if (len < 0) { 919251Ssam perror("implogd: recvfrom"); 926480Ssam continue; 939251Ssam } 9412237Ssam if (len == 0 || len > IMPMTU) /* sanity */ 956480Ssam continue; 969196Ssam from.sin_len = len; 976480Ssam from.sin_time = time(0); 989196Ssam write(log, (char *)&from, sizeof (from)); 999196Ssam write(log, request, len); 1006480Ssam } 1016480Ssam /*NOTREACHED*/ 1026480Ssam } 103