|
|
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.