2 * Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 *---------------------------------------------------------------------------
27 * i4b daemon - logging routines
28 * -----------------------------
30 * $Id: log.c,v 1.7 2009/04/16 05:56:32 lukem Exp $
34 * last edit-date: [Mon Jan 8 08:09:36 2001]
36 *---------------------------------------------------------------------------*/
42 extern int do_monitor
;
46 static void check_reg(char *logstring
);
53 /*---------------------------------------------------------------------------*
54 * table for converting internal log levels into syslog levels
55 *---------------------------------------------------------------------------*/
56 static struct logtab logtab
[] = {
57 {"ERR", LOG_ERR
}, /* error conditions */
58 {"WRN", LOG_WARNING
}, /* warning conditions, nonfatal */
59 {"DMN", LOG_NOTICE
}, /* significant conditions of the daemon */
60 {"CHD", LOG_INFO
}, /* informational, call handling */
61 {"DBG", LOG_DEBUG
}, /* debug messages */
62 {"MER", LOG_ERR
}, /* monitor error conditions */
63 {"PKT", LOG_INFO
} /* packet logging */
66 /*---------------------------------------------------------------------------*
68 *---------------------------------------------------------------------------*/
76 if ((logfp
= fopen(logfile
, "a")) == NULL
)
78 fprintf(stderr
, "ERROR, cannot open logfile %s: %s\n",
79 logfile
, strerror(errno
));
83 /* set unbuffered operation */
85 setvbuf(logfp
, (char *)NULL
, _IONBF
, 0);
90 if (do_debug
&& do_fork
== 0 && do_fullscreen
== 0)
91 (void)openlog("isdnd",
92 LOG_PID
|LOG_NDELAY
|LOG_PERROR
,
96 (void)openlog("isdnd", LOG_PID
|LOG_NDELAY
,
100 /* initialize the regexp array */
102 for (i
= 0; i
< MAX_RE
; i
++)
107 snprintf(buf
, sizeof(buf
), "%s%d", REGPROG_DEF
, i
);
111 if ((p
= strdup(buf
)) == NULL
)
113 logit(LL_DBG
, "init_log: malloc failed: %s", strerror(errno
));
121 /*---------------------------------------------------------------------------*
123 *---------------------------------------------------------------------------*/
138 /*---------------------------------------------------------------------------*
139 * place entry into logfile
140 *---------------------------------------------------------------------------*/
142 logit(int what
, const char *fmt
, ...)
144 char buffer
[LOGBUFLEN
];
149 vsnprintf(buffer
, LOGBUFLEN
-1, fmt
, ap
);
152 dp
= getlogdatetime(); /* get time string ptr */
154 /* put some messages on stderr to, important if in early startup
155 phase and not yet daemonized */
157 if (!do_fullscreen
|| !curses_ready
)
158 fprintf(stderr
, "isdnd: %s\n", buffer
);
162 /* put log on screen ? */
164 if ((do_fullscreen
&& curses_ready
) &&
165 ((!debug_noscreen
) || (debug_noscreen
&& (what
!= LL_DBG
))))
167 wprintw(lower_w
, "%s %s %-.*s\n", dp
, logtab
[what
].text
,
170 * FreeBSD-current integrated ncurses. Since then it is no longer possible
171 * to write to the last column in the logfilewindow without causing an
172 * automatic newline to occur resulting in a blank line in that window.
175 #include <osreldate.h>
177 #if defined(__FreeBSD_version) && __FreeBSD_version >= 400009
178 #warning "FreeBSD ncurses is buggy: write to last column = auto newline!"
179 COLS
-((strlen(dp
))+(strlen(logtab
[what
].text
))+3), buffer
);
181 (int)(COLS
-((strlen(dp
))+(strlen(logtab
[what
].text
))+2)), buffer
);
187 #ifdef I4B_EXTERNAL_MONITOR
188 if (what
!= LL_MER
) /* don't send monitor errs, endless loop !!! */
189 monitor_evnt_log(logtab
[what
].pri
, logtab
[what
].text
, buffer
);
194 fprintf(logfp
, "%s %s %s\n", dp
, logtab
[what
].text
, buffer
);
198 register char *s
= buffer
;
200 /* strip leading spaces from syslog output */
202 while(*s
&& (*s
== ' '))
205 syslog(logtab
[what
].pri
, "%s %s", logtab
[what
].text
, s
);
210 if (what
!= LL_DBG
) /* don't check debug logs, endless loop !!! */
215 /*---------------------------------------------------------------------------*
216 * return ptr to static area containing date/time
217 *---------------------------------------------------------------------------*/
221 static char logdatetime
[41];
223 register struct tm
*tp
;
226 tp
= localtime(&tim
);
227 strftime(logdatetime
,40,I4B_TIME_FORMAT
,tp
);
231 /*---------------------------------------------------------------------------*
232 * check for a match in the regexp array
233 *---------------------------------------------------------------------------*/
235 check_reg(char *logstring
)
239 for (i
= 0; i
< MAX_RE
; i
++)
241 if (rarr
[i
].re_flg
&& (!regexec(&(rarr
[i
].re
), logstring
, (size_t) 0, NULL
, 0)))
244 argv
[0] = rarr
[i
].re_prog
;
248 exec_prog(rarr
[i
].re_prog
, argv
);