113661Ssam #ifndef lint 2*33566Srick static char sccsid[] = "@(#)logent.c 5.7 (Berkeley) 02/24/88"; 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 } 72*33566Srick static int pid = 0; 7313661Ssam 7418620Sralph /* 7518620Sralph * make a log entry 7613661Ssam */ 7713661Ssam 7813661Ssam mlogent(fp, status, text) 7913661Ssam char *text, *status; 8013661Ssam register FILE *fp; 8113661Ssam { 8213661Ssam register struct tm *tp; 8313661Ssam extern struct tm *localtime(); 8413661Ssam 8517835Sralph if (text == NULL) 8617835Sralph text = ""; 8717835Sralph if (status == NULL) 8817835Sralph status = ""; 89*33566Srick if (pid == 0) 9013661Ssam pid = getpid(); 9117835Sralph #ifdef USG 9225134Sbloom time(&Now.time); 9325134Sbloom Now.millitm = 0; 9418620Sralph #else !USG 9525134Sbloom ftime(&Now); 9618620Sralph #endif !USG 9725134Sbloom tp = localtime(&Now.time); 9825134Sbloom #ifdef USG 9925134Sbloom fprintf(fp, "%s %s (%d/%d-%2.2d:%2.2d-%d) ", 10025134Sbloom #else !USG 10125134Sbloom fprintf(fp, "%s %s (%d/%d-%02d:%02d-%d) ", 10225134Sbloom #endif !USG 10325134Sbloom User, Rmtname, tp->tm_mon + 1, tp->tm_mday, 10425134Sbloom 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 161*33566Srick if (!pid) 162*33566Srick pid = getpid(); 16313661Ssam if (Sp == NULL) { 16413661Ssam if (!Stried) { 16513661Ssam int savemask; 16618620Sralph #ifdef F_SETFL 16717835Sralph int flags; 16818620Sralph #endif F_SETFL 16913661Ssam savemask = umask(LOGMASK); 17018620Sralph #ifdef LOGBYSITE 17118620Sralph (void) sprintf(lfile, "%s/xferstats/%s", LOGBYSITE, Rmtname); 17218620Sralph strcpy(SLogRmtname, Rmtname); 17318620Sralph Sp = fopen (lfile, "a"); 17418620Sralph #else !LOGBYSITE 17518620Sralph Sp = fopen (SYSLOG, "a"); 17618620Sralph #endif LOGBYSITE 17713661Ssam umask(savemask); 17818620Sralph #ifdef F_SETFL 17917835Sralph flags = fcntl(fileno(Sp), F_GETFL, 0); 18017835Sralph fcntl(fileno(Sp), F_SETFL, flags|O_APPEND); 18118620Sralph #endif F_SETFL 18218620Sralph 18313661Ssam } 18413661Ssam Stried = 1; 18513661Ssam if (Sp == NULL) 18613661Ssam return; 18713661Ssam fioclex(fileno(Sp)); 18813661Ssam } 18917835Sralph 19018620Sralph #ifdef USG 19125134Sbloom time(&Now.time); 19225134Sbloom Now.millitm = 0; 19318620Sralph #else !USG 19425134Sbloom ftime(&Now); 19518620Sralph #endif !USG 19625134Sbloom tp = localtime(&Now.time); 19713661Ssam 19813661Ssam fprintf(Sp, "%s %s ", User, Rmtname); 19917835Sralph #ifdef USG 200*33566Srick fprintf(Sp, "(%d/%d-%2.2d:%2.2d-%d) ", tp->tm_mon + 1, 201*33566Srick tp->tm_mday, tp->tm_hour, tp->tm_min, pid); 20225134Sbloom fprintf(Sp, "(%ld) %s\n", Now.time, text); 20318620Sralph #else !USG 204*33566Srick fprintf(Sp, "(%d/%d-%02d:%02d-%d) ", tp->tm_mon + 1, 205*33566Srick tp->tm_mday, tp->tm_hour, tp->tm_min, pid); 20625134Sbloom fprintf(Sp, "(%ld.%02u) %s\n", Now.time, Now.millitm/10, text); 20718620Sralph #endif !USG 20813661Ssam 20913661Ssam /* Position at end and flush */ 21018620Sralph #ifndef F_SETFL 21113661Ssam lseek (fileno(Sp), (long)0, 2); 21218620Sralph #endif F_SETFL 21313661Ssam fflush (Sp); 21413661Ssam } 21513661Ssam 21613661Ssam /* 21713661Ssam * Arrange to close fd on exec(II). 21813661Ssam * Otherwise unwanted file descriptors are inherited 21913661Ssam * by other programs. And that may be a security hole. 22013661Ssam */ 22117835Sralph #ifndef USG 22213661Ssam #include <sgtty.h> 22313661Ssam #endif 22413661Ssam 22513661Ssam fioclex(fd) 22613661Ssam int fd; 22713661Ssam { 22813661Ssam register int ret; 22913661Ssam 23017835Sralph #if defined(USG) || defined(BSD4_2) 23113661Ssam ret = fcntl(fd, F_SETFD, 1); /* Steve Bellovin says this does it */ 23217835Sralph #else 23313661Ssam ret = ioctl(fd, FIOCLEX, STBNULL); 23413661Ssam #endif 23513661Ssam if (ret) 23613661Ssam DEBUG(2, "CAN'T FIOCLEX %d\n", fd); 23713661Ssam } 238