chiark / gitweb /
*** empty log message ***
[sympathy.git] / src / log.c
1 /*
2  * log.c:
3  *
4  * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
5  * All rights reserved.
6  *
7  */
8
9 static char rcsid[] = "$Id$";
10
11 /*
12  * $Log$
13  * Revision 1.3  2008/02/23 11:48:37  james
14  * *** empty log message ***
15  *
16  * Revision 1.2  2008/02/22 14:51:54  james
17  * *** empty log message ***
18  *
19  * Revision 1.1  2008/02/14 12:14:50  james
20  * *** empty log message ***
21  *
22  */
23
24 #include "project.h"
25
26 typedef struct
27 {
28   LOG_SIGNATURE;
29   int do_close;
30   FILE *fp;
31 } File_Log;
32
33 static void
34 flog_log (Log * _l, char *buf)
35 {
36   File_Log *l = (File_Log *) _l;
37   struct timeval tv = { 0 };
38   struct tm *tm;
39   time_t t;
40   static const char *days[] = { "Sun", "Mon", "Tue",
41     "Wed", "Thu", "Fri", "Sat"
42   };
43   static const char *months[] = {
44     "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct",
45     "Nov", "Dec"
46   };
47
48   if (!l->fp)
49     return;
50
51   gettimeofday (&tv, NULL);
52   t = tv.tv_sec;
53   tm = localtime (&t);
54
55   fprintf (l->fp, "%s %2d %02d:%02d:%02d.%06d ", months[tm->tm_mon],
56            tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, tv.tv_usec);
57
58   fputs (buf, l->fp);
59   fputc ('\n', l->fp);
60   fflush (l->fp);
61 }
62
63
64
65
66 static void
67 flog_close (Log * _l)
68 {
69   File_Log *l = (File_Log *) _l;
70   if (l->fp && l->do_close)
71     fclose (l->fp);
72   free (l);
73 }
74
75 Log *
76 file_log_new (char *fn)
77 {
78   File_Log *l;
79   FILE *f;
80   int dc = 1;
81
82   if (fn && strcmp (fn, "-"))
83     {
84       f = fopen (fn, "a+");
85       if (!f)
86         return NULL;
87     }
88   else
89     {
90       f = stderr;
91       dc = 0;
92     }
93
94   l = malloc (sizeof (File_Log));
95
96   l->log = flog_log;
97   l->close = flog_close;
98   l->fp = f;
99   l->do_close = dc;
100
101   return (Log *) l;
102 }
103
104 void
105 log_f (Log * log, char *fmt, ...)
106 {
107
108   int n;
109   static char *buf;
110   va_list ap;
111   static int size;
112
113   if (!log)
114     return;
115
116   if (!size)
117     {
118       size = 128;
119       buf = malloc (size);
120     }
121
122   if (!buf)
123     return;
124
125   while (1)
126     {
127       va_start (ap, fmt);
128       n = vsnprintf (buf, size, fmt, ap);
129       va_end (ap);
130
131       if (n > -1 && n < size)
132         {
133           log->log (log, buf);
134           return;
135         }
136
137       if (n > -1)               /* glibc 2.1 */
138         size = n + 1;
139       else                      /* glibc 2.0 */
140         size *= 2;              /* twice the old size */
141
142       buf = realloc (buf, size);
143
144       if (!buf)
145         return;
146     }
147 }