]> mj.ucw.cz Git - libucw.git/blob - lib/log.c
267270aa5c783f64c6209c87fc540d9c3348f4e1
[libucw.git] / lib / log.c
1 /*
2  *      Sherlock Library -- Logging
3  *
4  *      (c) 1997 Martin Mares, <mj@atrey.karlin.mff.cuni.cz>
5  */
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <stdarg.h>
10 #include <unistd.h>
11 #include <sys/time.h>
12
13 #include "lib.h"
14
15 static byte *progname = "???";
16 static pid_t pid;
17
18 static void
19 logit(int level, byte *msg, va_list args)
20 {
21   time_t tim;
22   struct tm *tm;
23   char buf[32];
24
25   tim = time(NULL);
26   tm = localtime(&tim);
27   strftime(buf, sizeof(buf), "%d-%m-%y %H-%M-%S", tm);
28   fprintf(stderr, "%s %s [%d] <%d> ", buf, progname, pid, level);
29   vfprintf(stderr, msg, args);
30   fputc('\n', stderr);
31   fflush(stderr);
32 }
33
34 void
35 log(byte *msg, ...)
36 {
37   int level = 2;
38   va_list args;
39
40   va_start(args, msg);
41   if (msg[0] == '<' && msg[1] >= '0' && msg[1] <= '9' && msg[2] == '>')
42         {
43           level = msg[1] - '0';
44           msg += 3;
45         }
46   logit(level, msg, args);
47   va_end(args);
48 }
49
50 void
51 die(byte *msg, ...)
52 {
53   va_list args;
54
55   va_start(args, msg);
56   logit(9, msg, args);
57   va_end(args);
58   exit(99);
59 }
60
61 static byte *
62 basename(byte *n)
63 {
64   byte *p = n;
65
66   while (*n)
67         if (*n++ == '/')
68           p = n;
69   return p;
70 }
71
72 void
73 initlog(byte *argv0)
74 {
75   progname = basename(argv0);
76   pid = getpid();
77 }