xref: /csrg-svn/usr.bin/uucp/libuu/logent.c (revision 62386)
148652Sbostic /*-
2*62386Sbostic  * Copyright (c) 1985, 1993
3*62386Sbostic  *	The Regents of the University of California.  All rights reserved.
448652Sbostic  *
548652Sbostic  * %sccs.include.proprietary.c%
648652Sbostic  */
748652Sbostic 
813661Ssam #ifndef lint
9*62386Sbostic static char sccsid[] = "@(#)logent.c	8.1 (Berkeley) 06/06/93";
1048652Sbostic #endif /* not lint */
1113661Ssam 
1213661Ssam #include "uucp.h"
1317835Sralph #ifdef BSD4_2
1413706Ssam #include <sys/time.h>
1517835Sralph #else
1617835Sralph #include <time.h>
1717835Sralph #endif
1817835Sralph #if defined(USG) || defined(BSD4_2)
1917835Sralph #include <fcntl.h>
2017835Sralph #endif
2113661Ssam 
2234168Srick extern int errno;
2334168Srick extern int sys_nerr;
2460115Storek extern const char *const sys_errlist[];
2534168Srick 
2617835Sralph static FILE *Lp = NULL;
2717835Sralph static FILE *Sp = NULL;
2834168Srick #ifndef USE_SYSLOG
2934168Srick static FILE *Ep = NULL;
3034168Srick #endif /* !USE_SYSLOG */
3134168Srick static int pid = 0;
3213661Ssam 
3323611Sbloom /*LINTLIBRARY*/
3423611Sbloom 
3518620Sralph /*
3618620Sralph  *	make log entry
3713661Ssam  */
3834168Srick FILE *
get_logfd(pname,logfilename)3934168Srick get_logfd(pname, logfilename)
4034168Srick char *pname;
4134168Srick char *logfilename;
4213661Ssam {
4334168Srick 	FILE *fp;
4434168Srick 	int savemask;
4518620Sralph #ifdef LOGBYSITE
4618620Sralph 	char lfile[MAXFULLNAME];
4718620Sralph #endif LOGBYSITE
4834168Srick 
4934168Srick 	savemask = umask(LOGMASK);
5018620Sralph #ifdef LOGBYSITE
5134168Srick 	if (pname != NULL) {
5234168Srick 		(void) sprintf(lfile, "%s/%s/%s", LOGBYSITE, pname, Rmtname);
5334168Srick 		logfilename = lfile;
5418620Sralph 	}
5518620Sralph #endif LOGBYSITE
5634168Srick 	fp = fopen(logfilename, "a");
5734168Srick 	umask(savemask);
5834168Srick 	if (fp) {
5934168Srick #ifdef		F_SETFL
6034168Srick 		int flags;
6134168Srick 		flags = fcntl(fileno(fp), F_GETFL, 0);
6234168Srick 		fcntl(fileno(Lp), F_SETFL, flags|O_APPEND);
6334168Srick #endif		/* F_SETFL */
6434168Srick 		fioclex(fileno(fp));
6534168Srick 	} else /* we really want to log this, but it's the logging that failed*/
6634168Srick 		perror(logfilename);
6734168Srick 	return fp;
6813661Ssam }
6913661Ssam 
7018620Sralph /*
7118620Sralph  *	make a log entry
7213661Ssam  */
mlogent(fp,status,text)7313661Ssam mlogent(fp, status, text)
7413661Ssam char *text, *status;
7513661Ssam register FILE *fp;
7613661Ssam {
7713661Ssam 	register struct tm *tp;
7813661Ssam 	extern struct tm *localtime();
7913661Ssam 
8017835Sralph 	if (text == NULL)
8117835Sralph 		text = "";
8217835Sralph 	if (status == NULL)
8317835Sralph 		status = "";
8433566Srick 	if (pid == 0)
8513661Ssam 		pid = getpid();
8617835Sralph #ifdef USG
8725134Sbloom 	time(&Now.time);
8825134Sbloom 	Now.millitm = 0;
8918620Sralph #else !USG
9025134Sbloom 	ftime(&Now);
9118620Sralph #endif !USG
9225134Sbloom 	tp = localtime(&Now.time);
9325134Sbloom #ifdef USG
9425134Sbloom 	fprintf(fp, "%s %s (%d/%d-%2.2d:%2.2d-%d) ",
9525134Sbloom #else !USG
9625134Sbloom 	fprintf(fp, "%s %s (%d/%d-%02d:%02d-%d) ",
9725134Sbloom #endif !USG
9825134Sbloom 		User, Rmtname, tp->tm_mon + 1, tp->tm_mday,
9925134Sbloom 		tp->tm_hour, tp->tm_min, pid);
10034168Srick 	fprintf(fp, "%s %s\n", status, text);
10113661Ssam 
10213661Ssam 	/* Since it's buffered */
10318620Sralph #ifndef F_SETFL
10413661Ssam 	lseek (fileno(fp), (long)0, 2);
10518620Sralph #endif !F_SETFL
10613661Ssam 	fflush (fp);
10717835Sralph 	if (Debug) {
10813661Ssam 		fprintf(stderr, "%s %s ", User, Rmtname);
10917835Sralph #ifdef USG
11017835Sralph 		fprintf(stderr, "(%d/%d-%2.2d:%2.2d-%d) ", tp->tm_mon + 1,
11113661Ssam 			tp->tm_mday, tp->tm_hour, tp->tm_min, pid);
11218620Sralph #else !USG
11317835Sralph 		fprintf(stderr, "(%d/%d-%02d:%02d-%d) ", tp->tm_mon + 1,
11417835Sralph 			tp->tm_mday, tp->tm_hour, tp->tm_min, pid);
11518620Sralph #endif !USG
11634168Srick 		fprintf(stderr, "%s %s\n", status, text);
11713661Ssam 	}
11813661Ssam }
11913661Ssam 
12018620Sralph /*
12118620Sralph  *	close log file
12213661Ssam  */
logcls()12313661Ssam logcls()
12413661Ssam {
12513661Ssam 	if (Lp != NULL)
12613661Ssam 		fclose(Lp);
12713661Ssam 	Lp = NULL;
12813661Ssam 
12913661Ssam 	if (Sp != NULL)
13013661Ssam 		fclose (Sp);
13113661Ssam 	Sp = NULL;
13234168Srick #ifndef USE_SYSLOG
13334168Srick 	if (Ep != NULL)
13434168Srick 		fclose (Ep);
13534168Srick 	Ep = NULL;
13634168Srick #endif /* !USE_SYSLOG */
13713661Ssam }
13813661Ssam 
13918620Sralph /*
14013661Ssam  * Arrange to close fd on exec(II).
14113661Ssam  * Otherwise unwanted file descriptors are inherited
14213661Ssam  * by other programs.  And that may be a security hole.
14313661Ssam  */
14417835Sralph #ifndef	USG
14513661Ssam #include <sgtty.h>
14613661Ssam #endif
14713661Ssam 
fioclex(fd)14813661Ssam fioclex(fd)
14913661Ssam int fd;
15013661Ssam {
15113661Ssam 	register int ret;
15213661Ssam 
15317835Sralph #if defined(USG) || defined(BSD4_2)
15413661Ssam 	ret = fcntl(fd, F_SETFD, 1);	/* Steve Bellovin says this does it */
15517835Sralph #else
15613661Ssam 	ret = ioctl(fd, FIOCLEX, STBNULL);
15713661Ssam #endif
15813661Ssam 	if (ret)
15913661Ssam 		DEBUG(2, "CAN'T FIOCLEX %d\n", fd);
16013661Ssam }
16134168Srick 
logent(text,status)16234168Srick logent(text, status)
16334168Srick char *text, *status;
16434168Srick {
16534168Srick 	if (Lp == NULL)
16634168Srick 		Lp = get_logfd(Progname, LOGFILE);
16734168Srick 
16834168Srick 	mlogent(Lp, status, text);
16934168Srick }
17034168Srick 
17134168Srick /*
17234168Srick  *	make system log entry
17334168Srick  */
log_xferstats(text)17434168Srick log_xferstats(text)
17534168Srick char *text;
17634168Srick {
17734168Srick 	char tbuf[BUFSIZ];
17834168Srick 	if (Sp == NULL)
17934168Srick 		Sp = get_logfd("xferstats", SYSLOG);
18034168Srick 	sprintf(tbuf, "(%ld.%02u)", Now.time, Now.millitm/10);
18134168Srick 	mlogent(Sp, tbuf, text);
18234168Srick }
18334168Srick 
18434168Srick #ifndef USE_SYSLOG
18534168Srick /*
18634168Srick  * This is for sites that don't have a decent syslog() in their library
18734168Srick  * This routine would be a lot simpler if syslog() didn't permit %m
18834168Srick  * (or if printf did!)
18934168Srick  */
syslog(priority,format,p0,p1,p2,p3,p4)19034168Srick syslog(priority, format, p0, p1, p2, p3, p4)
19134168Srick int priority;
19234168Srick char *format;
19334168Srick {
19434168Srick 	char nformat[BUFSIZ], sbuf[BUFSIZ];
19534168Srick 	register char *s, *d;
19634168Srick 	register int c;
19734168Srick 	long now;
19834168Srick 
19934168Srick 	s = format;
20034168Srick 	d = nformat;
20134168Srick 	while ((c = *s++) != '\0' && c != '\n' && d < &nformat[BUFSIZ]) {
20234168Srick 		if (c != '%') {
20334168Srick 			*d++ = c;
20434168Srick 			continue;
20534168Srick 		}
20634168Srick 		if ((c = *s++) != 'm') {
20734168Srick 			*d++ = '%';
20834168Srick 			*d++ = c;
20934168Srick 			continue;
21034168Srick 		}
21134168Srick 		if ((unsigned)errno > sys_nerr)
21234168Srick 			sprintf(d, "error %d", errno);
21334168Srick 		else
21434168Srick 			strcpy(d, sys_errlist[errno]);
21534168Srick 		d += strlen(d);
21634168Srick 	}
21734168Srick 	*d = '\0';
21834168Srick 
21934168Srick 	if (Ep == NULL)
22034168Srick 		Ep = get_logfd(NULL, ERRLOG);
22134168Srick 	sprintf(sbuf, nformat, p0, p1, p2, p3, p4);
22234168Srick 	mlogent(Ep, sbuf, "");
22334168Srick }
22434168Srick #endif /* !USE_SYSLOG */
225