113661Ssam #ifndef lint 2*25134Sbloom static char sccsid[] = "@(#)logent.c 5.6 (Berkeley) 10/09/85"; 313661Ssam #endif 413661Ssam 513661Ssam #include "uucp.h" 617835Sralph #ifdef BSD4_2 713706Ssam #include <sys/time.h> 817835Sralph #else 917835Sralph #include <time.h> 1017835Sralph #endif 1117835Sralph #if defined(USG) || defined(BSD4_2) 1217835Sralph #include <fcntl.h> 1317835Sralph #endif 1413661Ssam 1517835Sralph static FILE *Lp = NULL; 1617835Sralph static FILE *Sp = NULL; 1713661Ssam static Ltried = 0; 1813661Ssam static Stried = 0; 1913661Ssam 2023611Sbloom /*LINTLIBRARY*/ 2123611Sbloom 2218620Sralph /* 2318620Sralph * make log entry 2413661Ssam */ 2513661Ssam logent(text, status) 2613661Ssam char *text, *status; 2713661Ssam { 2818620Sralph #ifdef LOGBYSITE 2918620Sralph char lfile[MAXFULLNAME]; 3018620Sralph static char LogRmtname[64]; 3118620Sralph #endif LOGBYSITE 3218620Sralph if (Rmtname[0] == '\0') 3318620Sralph strcpy(Rmtname, Myname); 3413661Ssam /* Open the log file if necessary */ 3518620Sralph #ifdef LOGBYSITE 3618620Sralph if (strcmp(Rmtname, LogRmtname)) { 3718620Sralph if (Lp != NULL) 3818620Sralph fclose(Lp); 3918620Sralph Lp = NULL; 4018620Sralph Ltried = 0; 4118620Sralph } 4218620Sralph #endif LOGBYSITE 4313661Ssam if (Lp == NULL) { 4413661Ssam if (!Ltried) { 4513661Ssam int savemask; 4618620Sralph #ifdef F_SETFL 4717835Sralph int flags; 4817835Sralph #endif 4913661Ssam savemask = umask(LOGMASK); 5018620Sralph #ifdef LOGBYSITE 5118620Sralph (void) sprintf(lfile, "%s/%s/%s", LOGBYSITE, Progname, Rmtname); 5218620Sralph strcpy(LogRmtname, Rmtname); 5318620Sralph Lp = fopen (lfile, "a"); 5418620Sralph #else !LOGBYSITE 5513661Ssam Lp = fopen (LOGFILE, "a"); 5618620Sralph #endif LOGBYSITE 5713661Ssam umask(savemask); 5818620Sralph #ifdef F_SETFL 5917835Sralph flags = fcntl(fileno(Lp), F_GETFL, 0); 6017835Sralph fcntl(fileno(Lp), F_SETFL, flags|O_APPEND); 6117835Sralph #endif 6213661Ssam } 6313661Ssam Ltried = 1; 6413661Ssam if (Lp == NULL) 6513661Ssam return; 6613661Ssam fioclex(fileno(Lp)); 6713661Ssam } 6813661Ssam 6913661Ssam /* make entry in existing temp log file */ 7013661Ssam mlogent(Lp, status, text); 7113661Ssam } 7213661Ssam 7318620Sralph /* 7418620Sralph * make a log entry 7513661Ssam */ 7613661Ssam 7713661Ssam mlogent(fp, status, text) 7813661Ssam char *text, *status; 7913661Ssam register FILE *fp; 8013661Ssam { 8113661Ssam static pid = 0; 8213661Ssam register struct tm *tp; 8313661Ssam extern struct tm *localtime(); 8413661Ssam 8517835Sralph if (text == NULL) 8617835Sralph text = ""; 8717835Sralph if (status == NULL) 8817835Sralph status = ""; 8913661Ssam if (!pid) 9013661Ssam pid = getpid(); 9117835Sralph #ifdef USG 92*25134Sbloom time(&Now.time); 93*25134Sbloom Now.millitm = 0; 9418620Sralph #else !USG 95*25134Sbloom ftime(&Now); 9618620Sralph #endif !USG 97*25134Sbloom tp = localtime(&Now.time); 98*25134Sbloom #ifdef USG 99*25134Sbloom fprintf(fp, "%s %s (%d/%d-%2.2d:%2.2d-%d) ", 100*25134Sbloom #else !USG 101*25134Sbloom fprintf(fp, "%s %s (%d/%d-%02d:%02d-%d) ", 102*25134Sbloom #endif !USG 103*25134Sbloom User, Rmtname, tp->tm_mon + 1, tp->tm_mday, 104*25134Sbloom tp->tm_hour, tp->tm_min, pid); 10513661Ssam fprintf(fp, "%s (%s)\n", status, text); 10613661Ssam 10713661Ssam /* Since it's buffered */ 10818620Sralph #ifndef F_SETFL 10913661Ssam lseek (fileno(fp), (long)0, 2); 11018620Sralph #endif !F_SETFL 11113661Ssam fflush (fp); 11217835Sralph if (Debug) { 11313661Ssam fprintf(stderr, "%s %s ", User, Rmtname); 11417835Sralph #ifdef USG 11517835Sralph fprintf(stderr, "(%d/%d-%2.2d:%2.2d-%d) ", tp->tm_mon + 1, 11613661Ssam tp->tm_mday, tp->tm_hour, tp->tm_min, pid); 11718620Sralph #else !USG 11817835Sralph fprintf(stderr, "(%d/%d-%02d:%02d-%d) ", tp->tm_mon + 1, 11917835Sralph tp->tm_mday, tp->tm_hour, tp->tm_min, pid); 12018620Sralph #endif !USG 12113661Ssam fprintf(stderr, "%s (%s)\n", status, text); 12213661Ssam } 12313661Ssam } 12413661Ssam 12518620Sralph /* 12618620Sralph * close log file 12713661Ssam */ 12813661Ssam logcls() 12913661Ssam { 13013661Ssam if (Lp != NULL) 13113661Ssam fclose(Lp); 13213661Ssam Lp = NULL; 13313661Ssam Ltried = 0; 13413661Ssam 13513661Ssam if (Sp != NULL) 13613661Ssam fclose (Sp); 13713661Ssam Sp = NULL; 13813661Ssam Stried = 0; 13913661Ssam } 14013661Ssam 14113661Ssam 14218620Sralph /* 14318620Sralph * make system log entry 14413661Ssam */ 14513661Ssam syslog(text) 14613661Ssam char *text; 14713661Ssam { 14813661Ssam register struct tm *tp; 14913661Ssam extern struct tm *localtime(); 15018620Sralph #ifdef LOGBYSITE 15118620Sralph char lfile[MAXFULLNAME]; 15218620Sralph static char SLogRmtname[64]; 15313661Ssam 15418620Sralph if (strcmp(Rmtname, SLogRmtname)) { 15518620Sralph if (Sp != NULL) 15618620Sralph fclose(Sp); 15718620Sralph Sp = NULL; 15818620Sralph Stried = 0; 15918620Sralph } 16018620Sralph #endif LOGBYSITE 16113661Ssam if (Sp == NULL) { 16213661Ssam if (!Stried) { 16313661Ssam int savemask; 16418620Sralph #ifdef F_SETFL 16517835Sralph int flags; 16618620Sralph #endif F_SETFL 16713661Ssam savemask = umask(LOGMASK); 16818620Sralph #ifdef LOGBYSITE 16918620Sralph (void) sprintf(lfile, "%s/xferstats/%s", LOGBYSITE, Rmtname); 17018620Sralph strcpy(SLogRmtname, Rmtname); 17118620Sralph Sp = fopen (lfile, "a"); 17218620Sralph #else !LOGBYSITE 17318620Sralph Sp = fopen (SYSLOG, "a"); 17418620Sralph #endif LOGBYSITE 17513661Ssam umask(savemask); 17618620Sralph #ifdef F_SETFL 17717835Sralph flags = fcntl(fileno(Sp), F_GETFL, 0); 17817835Sralph fcntl(fileno(Sp), F_SETFL, flags|O_APPEND); 17918620Sralph #endif F_SETFL 18018620Sralph 18113661Ssam } 18213661Ssam Stried = 1; 18313661Ssam if (Sp == NULL) 18413661Ssam return; 18513661Ssam fioclex(fileno(Sp)); 18613661Ssam } 18717835Sralph 18818620Sralph #ifdef USG 189*25134Sbloom time(&Now.time); 190*25134Sbloom Now.millitm = 0; 19118620Sralph #else !USG 192*25134Sbloom ftime(&Now); 19318620Sralph #endif !USG 194*25134Sbloom tp = localtime(&Now.time); 19513661Ssam 19613661Ssam fprintf(Sp, "%s %s ", User, Rmtname); 19717835Sralph #ifdef USG 19817835Sralph fprintf(Sp, "(%d/%d-%2.2d:%2.2d) ", tp->tm_mon + 1, 19913661Ssam tp->tm_mday, tp->tm_hour, tp->tm_min); 200*25134Sbloom fprintf(Sp, "(%ld) %s\n", Now.time, text); 20118620Sralph #else !USG 20217835Sralph fprintf(Sp, "(%d/%d-%02d:%02d) ", tp->tm_mon + 1, 20317835Sralph tp->tm_mday, tp->tm_hour, tp->tm_min); 204*25134Sbloom fprintf(Sp, "(%ld.%02u) %s\n", Now.time, Now.millitm/10, text); 20518620Sralph #endif !USG 20613661Ssam 20713661Ssam /* Position at end and flush */ 20818620Sralph #ifndef F_SETFL 20913661Ssam lseek (fileno(Sp), (long)0, 2); 21018620Sralph #endif F_SETFL 21113661Ssam fflush (Sp); 21213661Ssam } 21313661Ssam 21413661Ssam /* 21513661Ssam * Arrange to close fd on exec(II). 21613661Ssam * Otherwise unwanted file descriptors are inherited 21713661Ssam * by other programs. And that may be a security hole. 21813661Ssam */ 21917835Sralph #ifndef USG 22013661Ssam #include <sgtty.h> 22113661Ssam #endif 22213661Ssam 22313661Ssam fioclex(fd) 22413661Ssam int fd; 22513661Ssam { 22613661Ssam register int ret; 22713661Ssam 22817835Sralph #if defined(USG) || defined(BSD4_2) 22913661Ssam ret = fcntl(fd, F_SETFD, 1); /* Steve Bellovin says this does it */ 23017835Sralph #else 23113661Ssam ret = ioctl(fd, FIOCLEX, STBNULL); 23213661Ssam #endif 23313661Ssam if (ret) 23413661Ssam DEBUG(2, "CAN'T FIOCLEX %d\n", fd); 23513661Ssam } 236