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