This is log.c in view mode; [Download] [Up]
/* ** Logging routines. ** Copyright (c) 1991 Bolt Beranek and Newman, Inc. ** All rights reserved. ** ** Redistribution and use in source and binary forms are permitted ** provided that: (1) source distributions retain this entire copyright ** notice and comment, and (2) distributions including binaries display ** the following acknowledgement: ``This product includes software ** developed by Bolt Beranek and Newman, Inc. and CREN/CSNET'' in the ** documentation or other materials provided with the distribution and in ** all advertising materials mentioning features or use of this software. ** Neither the name of Bolt Beranek and Newman nor CREN/CSNET may be used ** to endorse or promote products derived from this software without ** specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include <stdio.h> #include <varargs.h> #include <time.h> #include <sys/types.h> #include "dialupip.h" /* ** Current logging level. */ int log_level = DLOG_GENERAL; /* ** Internal logging routine. */ static void d_vlog(where, format, ap) char *where; char *format; va_list ap; { extern time_t time(); extern struct tm *localtime(); extern char *strerror(); extern int errno; static char CONSOLE[] = "/dev/console"; static char LOG[] = LOG_FILE; FILE *F; struct tm *tp; time_t t; char form[30]; char *fp; char c; int oerrno; int mvalue; int islong; int done; /* Save errno for %m. */ mvalue = errno; /* Open the log file */ if ((F = fopen(LOG, "a")) == NULL) { oerrno = errno; if ((F = fopen("/dev/console", "a")) == NULL) { (void)fprintf(stderr, "%s: Can't open logfile \"%s\",\n\t%s\n", progname, LOG, strerror(oerrno)); return; } (void)fprintf(stderr, "%s: Can't open logfile \"%s\",\n\t%s, using \"%s\"\n", progname, LOG, strerror(oerrno), CONSOLE); } /* Get the timestamp, write the message header. */ (void)time(&t); tp = localtime(&t); (void)fprintf(F, "%02d/%02d %02d:%02d:%02d\t%d\t%s: ", tp->tm_mon + 1, tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec, getpid(), where); while (c = *format++) { if (c != '%') { (void)fputc(c, F); continue; } if (*format == '%') { (void)fputc('%', F); format++; continue; } /* A standard printf format. copy it into form. */ for (islong = 0, fp = form, *fp++ = c, done = 0; done == 0; ) switch (c = *format++) { default: *fp++ = c; break; case 'o': case 'c': case 'd': case 's': case 'u': case 'e': case 'E': case 'f': case 'g': case 'G': case 'm': done++; /* FALLTHROUGH */ case ' ': case '+': case '-': case '.': case '#': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': *fp++ = c; break; case 'l': islong++; *fp++ = c; break; } *fp = '\0'; /* We have the format string, get the argument and print it. */ switch (fp[-1]) { case 'x': case 'o': case 'c': case 'd': case 'u': if (islong) (void)fprintf(F, form, va_arg(ap, long)); else (void)fprintf(F, form, va_arg(ap, int)); break; case 'e': case 'E': case 'f': case 'g': case 'G': (void)fprintf(F, form, va_arg(ap, double)); break; case 's': (void)fprintf(F, form, va_arg(ap, char*)); break; case 'm': fp[-1] = 's'; (void)fprintf(F, form, strerror(mvalue)); break; } } (void)fputc('\n', F); (void)fclose(F); } /* ** Write debug log entries. Calling sequence: ** d_log(level, where, format, args...) */ /* VARARGS0 */ void d_log(va_alist) va_dcl { int level; char *where; char *format; va_list ap; va_start(ap); level = va_arg(ap, int); where = va_arg(ap, char*); format = va_arg(ap, char*); if (level <= log_level) d_vlog(where, format, ap); va_end(ap); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.