|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)logent.c 5.9 (Berkeley) 5/4/88";
3: #endif
4:
5: #include "uucp.h"
6: #ifdef BSD4_2
7: #include <sys/time.h>
8: #else
9: #include <time.h>
10: #endif
11: #if defined(USG) || defined(BSD4_2)
12: #include <fcntl.h>
13: #endif
14:
15: extern int errno;
16: extern int sys_nerr;
17: extern char *sys_errlist[];
18:
19: static FILE *Lp = NULL;
20: static FILE *Sp = NULL;
21: #ifndef USE_SYSLOG
22: static FILE *Ep = NULL;
23: #endif /* !USE_SYSLOG */
24: static int pid = 0;
25:
26: /*LINTLIBRARY*/
27:
28: /*
29: * make log entry
30: */
31: FILE *
32: get_logfd(pname, logfilename)
33: char *pname;
34: char *logfilename;
35: {
36: FILE *fp;
37: int savemask;
38: #ifdef LOGBYSITE
39: char lfile[MAXFULLNAME];
40: #endif LOGBYSITE
41:
42: savemask = umask(LOGMASK);
43: #ifdef LOGBYSITE
44: if (pname != NULL) {
45: (void) sprintf(lfile, "%s/%s/%s", LOGBYSITE, pname, Rmtname);
46: logfilename = lfile;
47: }
48: #endif LOGBYSITE
49: fp = fopen(logfilename, "a");
50: umask(savemask);
51: if (fp) {
52: #ifdef F_SETFL
53: int flags;
54: flags = fcntl(fileno(fp), F_GETFL, 0);
55: fcntl(fileno(Lp), F_SETFL, flags|O_APPEND);
56: #endif /* F_SETFL */
57: fioclex(fileno(fp));
58: } else /* we really want to log this, but it's the logging that failed*/
59: perror(logfilename);
60: return fp;
61: }
62:
63: /*
64: * make a log entry
65: */
66: mlogent(fp, status, text)
67: char *text, *status;
68: register FILE *fp;
69: {
70: register struct tm *tp;
71: extern struct tm *localtime();
72:
73: if (text == NULL)
74: text = "";
75: if (status == NULL)
76: status = "";
77: if (pid == 0)
78: pid = getpid();
79: #ifdef USG
80: time(&Now.time);
81: Now.millitm = 0;
82: #else !USG
83: ftime(&Now);
84: #endif !USG
85: tp = localtime(&Now.time);
86: #ifdef USG
87: fprintf(fp, "%s %s (%d/%d-%2.2d:%2.2d-%d) ",
88: #else !USG
89: fprintf(fp, "%s %s (%d/%d-%02d:%02d-%d) ",
90: #endif !USG
91: User, Rmtname, tp->tm_mon + 1, tp->tm_mday,
92: tp->tm_hour, tp->tm_min, pid);
93: fprintf(fp, "%s %s\n", status, text);
94:
95: /* Since it's buffered */
96: #ifndef F_SETFL
97: lseek (fileno(fp), (long)0, 2);
98: #endif !F_SETFL
99: fflush (fp);
100: if (Debug) {
101: fprintf(stderr, "%s %s ", User, Rmtname);
102: #ifdef USG
103: fprintf(stderr, "(%d/%d-%2.2d:%2.2d-%d) ", tp->tm_mon + 1,
104: tp->tm_mday, tp->tm_hour, tp->tm_min, pid);
105: #else !USG
106: fprintf(stderr, "(%d/%d-%02d:%02d-%d) ", tp->tm_mon + 1,
107: tp->tm_mday, tp->tm_hour, tp->tm_min, pid);
108: #endif !USG
109: fprintf(stderr, "%s %s\n", status, text);
110: }
111: }
112:
113: /*
114: * close log file
115: */
116: logcls()
117: {
118: if (Lp != NULL)
119: fclose(Lp);
120: Lp = NULL;
121:
122: if (Sp != NULL)
123: fclose (Sp);
124: Sp = NULL;
125: #ifndef USE_SYSLOG
126: if (Ep != NULL)
127: fclose (Ep);
128: Ep = NULL;
129: #endif /* !USE_SYSLOG */
130: }
131:
132: /*
133: * Arrange to close fd on exec(II).
134: * Otherwise unwanted file descriptors are inherited
135: * by other programs. And that may be a security hole.
136: */
137: #ifndef USG
138: #include <sgtty.h>
139: #endif
140:
141: fioclex(fd)
142: int fd;
143: {
144: register int ret;
145:
146: #if defined(USG) || defined(BSD4_2)
147: ret = fcntl(fd, F_SETFD, 1); /* Steve Bellovin says this does it */
148: #else
149: ret = ioctl(fd, FIOCLEX, STBNULL);
150: #endif
151: if (ret)
152: DEBUG(2, "CAN'T FIOCLEX %d\n", fd);
153: }
154:
155: logent(text, status)
156: char *text, *status;
157: {
158: if (Lp == NULL)
159: Lp = get_logfd(Progname, LOGFILE);
160:
161: mlogent(Lp, status, text);
162: }
163:
164: /*
165: * make system log entry
166: */
167: log_xferstats(text)
168: char *text;
169: {
170: char tbuf[BUFSIZ];
171: if (Sp == NULL)
172: Sp = get_logfd("xferstats", SYSLOG);
173: sprintf(tbuf, "(%ld.%02u)", Now.time, Now.millitm/10);
174: mlogent(Sp, tbuf, text);
175: }
176:
177: #ifndef USE_SYSLOG
178: /*
179: * This is for sites that don't have a decent syslog() in their library
180: * This routine would be a lot simpler if syslog() didn't permit %m
181: * (or if printf did!)
182: */
183: syslog(priority, format, p0, p1, p2, p3, p4)
184: int priority;
185: char *format;
186: {
187: char nformat[BUFSIZ], sbuf[BUFSIZ];
188: register char *s, *d;
189: register int c;
190: long now;
191:
192: s = format;
193: d = nformat;
194: while ((c = *s++) != '\0' && c != '\n' && d < &nformat[BUFSIZ]) {
195: if (c != '%') {
196: *d++ = c;
197: continue;
198: }
199: if ((c = *s++) != 'm') {
200: *d++ = '%';
201: *d++ = c;
202: continue;
203: }
204: if ((unsigned)errno > sys_nerr)
205: sprintf(d, "error %d", errno);
206: else
207: strcpy(d, sys_errlist[errno]);
208: d += strlen(d);
209: }
210: *d = '\0';
211:
212: if (Ep == NULL)
213: Ep = get_logfd(NULL, ERRLOG);
214: sprintf(sbuf, nformat, p0, p1, p2, p3, p4);
215: mlogent(Ep, sbuf, "");
216: }
217: #endif /* !USE_SYSLOG */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.