make suffix dumpable and some minors cleanup
[tedtools.git] / tlog.c
1 /*
2  * Copyright (c) 2004 Teodor Sigaev <teodor@sigaev.ru>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *        notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *        notice, this list of conditions and the following disclaimer in the
12  *        documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the author nor the names of any co-contributors
14  *        may be used to endorse or promote products derived from this software
15  *        without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY CONTRIBUTORS ``AS IS'' AND ANY EXPRESS
18  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #include <errno.h>
31 #include <stdlib.h>
32 #include <string.h>
33 #include <time.h>
34 #include <sys/types.h>
35 #include <unistd.h>
36 #include <syslog.h>
37 #include <stdarg.h>
38
39 #include "tlog.h"
40
41 static FILE             *TL_ErrOut    = NULL;
42 static u_int32_t        TL_DebugLevel = TL_INFO;
43 static u_int32_t        tlflag = TL_OPEN_STDERR | TL_OPEN_SYSLOG; 
44
45
46 static int
47 TLtoSYS(int level) {
48         switch(level) {
49                 case    TL_CRIT : return LOG_CRIT;
50                 case    TL_ALARM: return LOG_ERR;
51                 case    TL_WARN : return LOG_WARNING;
52                 case    TL_INFO : return LOG_INFO;
53                 case    TL_DEBUG: return LOG_DEBUG;
54                 default: return LOG_WARNING;
55         }
56         return LOG_ERR;
57 }
58
59 void 
60 opentlog(u_int32_t flag, u_int32_t level, char *file) {
61         if (flag==0)
62                 flag=tlflag;
63
64         TL_DebugLevel=level;
65
66         tlflag &= ~TL_OPEN_FILE;
67         if ( TL_ErrOut )
68                 fclose(TL_ErrOut);
69         if ( (flag & TL_OPEN_FILE) && file ) {
70                 if ( (TL_ErrOut=fopen(file,"a")) == NULL )
71                         tlog(TL_ALARM,"Can't open log file '%s': %s", file, strerror(errno));
72                 else {
73                         u_int32_t oldflag = tlflag;
74                         tlflag = TL_OPEN_FILE;
75                         tlog(TL_INFO, "Log opened");
76                         tlflag = oldflag | TL_OPEN_FILE;        
77                 }
78         }
79
80         tlflag &= ~TL_OPEN_SYSLOG;
81         tlflag |= (flag & TL_OPEN_SYSLOG);
82
83         tlflag &= ~TL_OPEN_STDERR;
84         tlflag |= (flag & TL_OPEN_STDERR);
85 }
86
87 void
88 closetlog() {
89         if ( TL_ErrOut ) {
90                 if ( tlflag & TL_OPEN_FILE ) {
91                         tlflag = TL_OPEN_FILE;
92                         tlog(TL_INFO,"Log closed");
93                 }
94                 fclose(TL_ErrOut);
95         }
96         TL_ErrOut=NULL;
97         tlflag = TL_OPEN_STDERR | TL_OPEN_SYSLOG;
98 }
99
100 void 
101 tlog(u_int32_t level,const char *format, ...) {
102         va_list args;
103
104         if ( (level & TL_EXIT)==0 )
105                 if ( (level & ~TL_EXIT) > TL_DebugLevel )
106                         return;
107         
108         if ( tlflag & (TL_OPEN_STDERR | TL_OPEN_FILE) ) { 
109                 time_t t;
110                 char buf[64];
111                 t = time(NULL);
112
113                 strftime(buf,64,"%H:%M:%S %d/%m/%Y",localtime(&t));
114                 if ( tlflag & TL_OPEN_STDERR ) {
115                         fprintf( stderr,"%d %s ", getpid(), buf );
116                         va_start(args, format);
117                         vfprintf( stderr, format, args);
118                         va_end(args);
119                         fputc('\n', stderr);
120                 }
121                 if ( (tlflag & TL_OPEN_FILE) && TL_ErrOut ) {
122                         fprintf( TL_ErrOut,"%d %s ", getpid(), buf );
123                         va_start(args, format);
124                         vfprintf( TL_ErrOut, format, args);
125                         va_end(args);
126                         fputc('\n', TL_ErrOut);
127                 }
128         }
129
130         if ( tlflag & TL_OPEN_SYSLOG ) {
131                 va_start(args, format);
132                 vsyslog( TLtoSYS( (int)(level & ~TL_EXIT) ),  format, args );   
133                 va_end(args);
134         }
135
136         if ( level & TL_EXIT ) {
137                 tlog(level & ~TL_EXIT, "Exitting...");
138                 closetlog();
139                 exit(1);
140         }
141 }
142