|
|
1.1 root 1: /* logger.c - system logging routines */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/compat/RCS/logger.c,v 7.2 90/04/23 00:08:12 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/compat/RCS/logger.c,v 7.2 90/04/23 00:08:12 mrose Exp $
9: *
10: *
11: * $Log: logger.c,v $
12: * Revision 7.2 90/04/23 00:08:12 mrose
13: * touch-up
14: *
15: * Revision 7.1 90/02/19 13:07:17 mrose
16: * update
17: *
18: * Revision 7.0 89/11/23 21:23:17 mrose
19: * Release 6.0
20: *
21: */
22:
23: /*
24: * NOTICE
25: *
26: * Acquisition, use, and distribution of this module and related
27: * materials are subject to the restrictions of a license agreement.
28: * Consult the Preface in the User's Manual for the full terms of
29: * this agreement.
30: *
31: */
32:
33:
34: /* LINTLIBRARY */
35:
36: #include <stdio.h>
37: #include <varargs.h>
38: #include "general.h"
39: #include "manifest.h"
40: #include "logger.h"
41: #include "tailor.h"
42:
43: #ifdef NULL
44: #undef NULL
45: #endif
46: #include <sys/param.h>
47: #ifndef NULL
48: #define NULL 0
49: #endif
50: #ifdef BSD42
51: #include <sys/file.h>
52: #endif
53: #ifdef SYS5
54: #include <fcntl.h>
55: #endif
56: #include <sys/stat.h>
57:
58: #ifndef BSD42
59: #include <time.h>
60: #else
61: #ifndef timerisset
62: #include <sys/time.h>
63: #endif
64: #endif
65:
66: #ifndef SYS5
67: #include <syslog.h>
68: #endif
69:
70: /* */
71:
72: long lseek (), time ();
73:
74: /* */
75:
76: int ll_open (lp)
77: register LLog *lp;
78: {
79: int mask,
80: mode;
81: char *bp,
82: buffer[BUFSIZ];
83: struct stat st;
84:
85: if (lp -> ll_file == NULLCP
86: || *lp -> ll_file == NULL) {
87: (void) ll_close (lp);
88: lp -> ll_stat |= LLOGERR;
89: return NOTOK;
90: }
91:
92: lp -> ll_stat &= ~LLOGERR;
93:
94: if (lp -> ll_fd != NOTOK)
95: return OK;
96:
97: if (strcmp (lp -> ll_file, "-") == 0) {
98: lp -> ll_stat |= LLOGTTY;
99: return OK;
100: }
101:
102: (void) sprintf (bp = buffer, _isodefile (isodelogpath, lp -> ll_file),
103: getpid ());
104:
105: mode = O_WRONLY | O_APPEND;
106: if (stat (bp, &st) == NOTOK && (lp -> ll_stat & LLOGCRT))
107: mode |= O_CREAT;
108:
109: mask = umask (~0666);
110: lp -> ll_fd = open (bp, mode, 0666);
111: (void) umask (mask);
112:
113: if (ll_check (lp) == NOTOK)
114: return (NOTOK);
115:
116: return (lp -> ll_fd != NOTOK ? OK : NOTOK);
117: }
118:
119: /* */
120:
121: int ll_close (lp)
122: register LLog *lp;
123: {
124: int status;
125:
126: if (lp -> ll_fd == NOTOK)
127: return OK;
128:
129: status = close (lp -> ll_fd);
130: lp -> ll_fd = NOTOK;
131:
132: return status;
133: }
134:
135: /* */
136:
137: #ifndef lint
138: int ll_log (va_alist)
139: va_dcl
140: {
141: int event,
142: result;
143: LLog *lp;
144: va_list ap;
145:
146: va_start (ap);
147:
148: lp = va_arg (ap, LLog *);
149: event = va_arg (ap, int);
150:
151: result = _ll_log (lp, event, ap);
152:
153: va_end (ap);
154:
155: return result;
156: }
157: #else
158: /* VARARGS4 */
159:
160: int ll_log (lp, event, what, fmt)
161: LLog *lp;
162: int event;
163: char *what,
164: *fmt;
165: {
166: return ll_log (lp, event, what, fmt);
167: }
168: #endif
169:
170: /* */
171:
172: int _ll_log (lp, event, ap) /* what, fmt, args ... */
173: register LLog *lp;
174: int event;
175: va_list ap;
176: {
177: int cc,
178: status;
179: long clock;
180: register char *bp;
181: char *what,
182: buffer[BUFSIZ];
183: register struct tm *tm;
184:
185: if (!(lp -> ll_events & event))
186: return OK;
187:
188: bp = buffer;
189:
190: (void) time (&clock);
191: tm = localtime (&clock);
192: (void) sprintf (bp, "%2d/%2d %2d:%02d:%02d %s %s ",
193: tm -> tm_mon + 1, tm -> tm_mday,
194: tm -> tm_hour, tm -> tm_min, tm -> tm_sec,
195: lp -> ll_hdr ? lp -> ll_hdr : "",
196: lp -> ll_dhdr ? lp -> ll_dhdr : "");
197: bp += strlen (bp);
198:
199: what = va_arg (ap, char *);
200:
201: _asprintf (bp, what, ap);
202:
203: #ifndef SYS5
204: if (lp -> ll_syslog & event) {
205: int priority;
206:
207: switch (event) {
208: case LLOG_FATAL:
209: priority = LOG_ERR;
210: break;
211:
212: case LLOG_EXCEPTIONS:
213: priority = LOG_WARNING;
214: break;
215:
216: case LLOG_NOTICE:
217: priority = LOG_INFO;
218: break;
219:
220: case LLOG_PDUS:
221: case LLOG_TRACE:
222: case LLOG_DEBUG:
223: priority = LOG_DEBUG;
224: break;
225:
226: default:
227: priority = LOG_NOTICE;
228: break;
229: }
230:
231: (void) syslog (priority, "%s", buffer + 13);
232:
233: if (lp -> ll_stat & LLOGCLS)
234: (void) closelog ();
235: }
236: #endif
237:
238: if (!(lp -> ll_stat & LLOGTTY)
239: && lp -> ll_fd == NOTOK
240: && strcmp (lp -> ll_file, "-") == 0)
241: lp -> ll_stat |= LLOGTTY;
242:
243: if (lp -> ll_stat & LLOGTTY) {
244: (void) fflush (stdout);
245:
246: if (lp -> ll_fd != NOTOK)
247: (void) fprintf (stderr, "LOGGING: ");
248: (void) fputs (bp, stderr);
249: (void) fputc ('\n', stderr);
250: (void) fflush (stderr);
251: }
252: bp += strlen (bp);
253:
254: if (lp -> ll_fd == NOTOK) {
255: if ((lp -> ll_stat & (LLOGERR | LLOGTTY)) == (LLOGERR | LLOGTTY))
256: return OK;
257: if (ll_open (lp) == NOTOK)
258: return NOTOK;
259: }
260: else
261: if (ll_check (lp) == NOTOK)
262: return NOTOK;
263:
264: *bp++ = '\n', *bp = NULL;
265: cc = bp - buffer;
266:
267: if ((status = write (lp -> ll_fd, buffer, cc)) != cc) {
268: if (status == NOTOK) {
269: (void) ll_close (lp);
270: error: ;
271: lp -> ll_stat |= LLOGERR;
272: return NOTOK;
273: }
274:
275: status = NOTOK;
276: }
277: else
278: status = OK;
279:
280: if ((lp -> ll_stat & LLOGCLS) && ll_close (lp) == NOTOK)
281: goto error;
282:
283: return status;
284: }
285:
286: /* */
287:
288: void ll_hdinit (lp, prefix)
289: register LLog *lp;
290: char *prefix;
291: {
292: register char *cp,
293: *up;
294: char buffer[BUFSIZ],
295: user[10];
296:
297: if (prefix == NULLCP) {
298: if ((lp -> ll_stat & LLOGHDR) && strlen (lp -> ll_hdr) == 25)
299: (cp = lp -> ll_hdr)[8] = NULL;
300: else
301: cp = "unknown";
302: }
303: else {
304: if ((cp = rindex (prefix, '/')))
305: cp++;
306: if (cp == NULL || *cp == NULL)
307: cp = prefix;
308: }
309:
310: if ((up = getenv ("USER")) == NULLCP
311: && (up = getenv ("LOGNAME")) == NULLCP) {
312: (void) sprintf (user, "#%d", getuid ());
313: up = user;
314: }
315: (void) sprintf (buffer, "%-8.8s %05d (%-8.8s)",
316: cp, getpid () % 100000, up);
317:
318: if (lp -> ll_stat & LLOGHDR)
319: free (lp -> ll_hdr);
320: lp -> ll_stat &= ~LLOGHDR;
321:
322: if ((lp -> ll_hdr = malloc ((unsigned) (strlen (buffer) + 1))) == NULLCP)
323: return;
324:
325: (void) strcpy (lp -> ll_hdr, buffer);
326: lp -> ll_stat |= LLOGHDR;
327: }
328:
329: /* */
330:
331: void ll_dbinit (lp, prefix)
332: register LLog *lp;
333: char *prefix;
334: {
335: register char *cp;
336: char buffer[BUFSIZ];
337:
338: ll_hdinit (lp, prefix);
339:
340: if (prefix) {
341: if ((cp = rindex (prefix, '/')))
342: cp++;
343: if (cp == NULL || *cp == NULL)
344: cp = prefix;
345:
346: (void) sprintf (buffer, "./%s.log", cp);
347:
348: if ((lp -> ll_file = malloc ((unsigned) (strlen (buffer) + 1)))
349: == NULLCP)
350: return;
351:
352: (void) strcpy (lp -> ll_file, buffer);
353: }
354:
355: lp -> ll_events |= LLOG_ALL;
356: lp -> ll_stat |= LLOGTTY;
357: }
358:
359: /* */
360:
361: #ifndef lint
362: int ll_printf (va_alist)
363: va_dcl
364: {
365: int result;
366: LLog *lp;
367: va_list ap;
368:
369: va_start (ap);
370:
371: lp = va_arg (ap, LLog *);
372:
373: result = _ll_printf (lp, ap);
374:
375: va_end (ap);
376:
377: return result;
378: }
379: #else
380: /* VARARGS2 */
381:
382: int ll_printf (lp, fmt)
383: LLog *lp;
384: char *fmt;
385: {
386: return ll_printf (lp, fmt);
387: }
388: #endif
389:
390: /* */
391:
392: #ifndef lint
393: static
394: #endif
395: int _ll_printf (lp, ap) /* fmt, args ... */
396: register LLog *lp;
397: va_list ap;
398: {
399: int cc,
400: status;
401: register char *bp;
402: char buffer[BUFSIZ];
403: char *fmt;
404: va_list fp = ap;
405:
406: fmt = va_arg (fp, char *);
407: if (strcmp (fmt, "%s") != 0) {
408: bp = buffer;
409: _asprintf (bp, NULLCP, ap);
410: }
411: else {
412: bp = NULL;
413: fmt = va_arg (fp, char *);
414: }
415:
416: if (!(lp -> ll_stat & LLOGTTY)
417: && lp -> ll_fd == NOTOK
418: && strcmp (lp -> ll_file, "-") == 0)
419: lp -> ll_stat |= LLOGTTY;
420:
421: if (lp -> ll_stat & LLOGTTY) {
422: (void) fflush (stdout);
423:
424: if (bp)
425: (void) fputs (bp, stderr);
426: else
427: (void) fputs (fmt, stderr);
428: (void) fflush (stderr);
429: }
430: if (bp)
431: bp += strlen (bp);
432:
433: if (lp -> ll_fd == NOTOK) {
434: if ((lp -> ll_stat & (LLOGERR | LLOGTTY)) == (LLOGERR | LLOGTTY))
435: return OK;
436: if (ll_open (lp) == NOTOK)
437: return NOTOK;
438: }
439: else
440: if (ll_check (lp) == NOTOK)
441: return NOTOK;
442:
443: if (bp)
444: cc = bp - buffer;
445: else
446: cc = strlen (fmt);
447:
448: if ((status = write (lp -> ll_fd, bp ? buffer : fmt, cc)) != cc) {
449: if (status == NOTOK) {
450: (void) ll_close (lp);
451: lp -> ll_stat |= LLOGERR;
452: return NOTOK;
453: }
454:
455: status = NOTOK;
456: }
457: else
458: status = OK;
459:
460: return status;
461: }
462:
463: /* */
464:
465: int ll_sync (lp)
466: register LLog *lp;
467: {
468: if (lp -> ll_stat & LLOGCLS)
469: return ll_close (lp);
470:
471: return OK;
472: }
473:
474: /* */
475:
476: #ifndef lint
477: char *ll_preset (va_alist)
478: va_dcl
479: {
480: va_list ap;
481: static char buffer[BUFSIZ];
482:
483: va_start (ap);
484:
485: _asprintf (buffer, NULLCP, ap);
486:
487: va_end (ap);
488:
489: return buffer;
490: }
491: #else
492: /* VARARGS1 */
493:
494: char *ll_preset (fmt)
495: char *fmt;
496: {
497: return ll_preset (fmt);
498: }
499: #endif
500:
501: /* */
502:
503: int ll_check (lp)
504: register LLog *lp;
505: {
506: #ifndef BSD42
507: int fd;
508: #endif
509: long size;
510: struct stat st;
511:
512: if ((size = lp -> ll_msize) <= 0)
513: return OK;
514:
515: if (lp -> ll_fd == NOTOK
516: || (fstat (lp -> ll_fd, &st) != NOTOK
517: && st.st_size < (size <<= 10)))
518: return OK;
519:
520: if (!(lp -> ll_stat & LLOGZER)) {
521: (void) ll_close (lp);
522:
523: #ifndef BSD42
524: error: ;
525: #endif
526: lp -> ll_stat |= LLOGERR;
527: return NOTOK;
528: }
529:
530: #ifdef BSD42
531: #ifdef SUNOS4
532: (void) ftruncate (lp -> ll_fd, (off_t) 0);
533: #else
534: (void) ftruncate (lp -> ll_fd, 0);
535: #endif
536: (void) lseek (lp -> ll_fd, 0L, 0);
537: return OK;
538: #else
539: if ((fd = open (lp -> ll_file, O_WRONLY | O_APPEND | O_TRUNC)) == NOTOK)
540: goto error;
541: (void) close (fd);
542: return OK;
543: #endif
544: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.