#include #include #include #include #include "buffer.h" #include "error.h" #include "exit.h" #include "fmt.h" #include "scan.h" #include "str.h" char buf[800]; /* syslog truncates long lines (or crashes); GPACIC */ int bufpos = 0; /* 0 <= bufpos < sizeof(buf) */ int flagcont = 0; int priority; /* defined if flagcont */ char stamp[FMT_ULONG + FMT_ULONG + 3]; /* defined if flagcont */ void stamp_make() { struct timeval tv; char *s; gettimeofday(&tv, (struct timezone *)0); s = stamp; s += fmt_ulong(s, (unsigned long)tv.tv_sec); *s++ = '.'; s += fmt_uint0(s, (unsigned int)tv.tv_usec, 6); *s = 0; } void flush() { if (bufpos) { buf[bufpos] = 0; if (flagcont) syslog(priority, "%s+%s", stamp, buf); /* logger folds invisibly; GPACIC */ else { stamp_make(); priority = LOG_INFO; if (str_start(buf, "warning:")) priority = LOG_WARNING; if (str_start(buf, "alert:")) priority = LOG_ALERT; syslog(priority, "%s %s", stamp, buf); flagcont = 1; } } bufpos = 0; } int main(int argc, char **argv) { char ch; if (argv[1]) { if (argv[2]) { unsigned long facility; scan_ulong(argv[2], &facility); openlog(argv[1], 0, facility << 3); } else { openlog(argv[1], 0, LOG_MAIL); } } else { openlog("splogger", 0, LOG_MAIL); } for (;;) { if (buffer_get(buffer_0, &ch, 1) < 1) _exit(0); if (ch == '\n') { flush(); flagcont = 0; continue; } if (bufpos == sizeof(buf) - 1) flush(); if ((ch < 32) || (ch > 126)) ch = '?'; /* logger truncates at 0; GPACIC */ buf[bufpos++] = ch; } }