ze-filter  (ze-filter-0.8.0-develop-180218)
zeSyslog.c
Go to the documentation of this file.
1 
2 /*
3  *
4  * ze-filter - Mail Server Filter for sendmail
5  *
6  * Copyright (c) 2001-2018 - Jose-Marcio Martins da Cruz
7  *
8  * Auteur : Jose Marcio Martins da Cruz
9  * jose.marcio.mc@gmail.org
10  *
11  * Historique :
12  * Creation : janvier 2002
13  *
14  * This program is free software, but with restricted license :
15  *
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20  *
21  * More details about ze-filter license can be found at ze-filter
22  * web site : http://foss.jose-marcio.org
23  */
24 
25 #include <ze-sys.h>
26 #include <libze.h>
27 #include <zeSyslog.h>
28 
29 
30 /* ****************************************************************************
31  * *
32  * *
33  ******************************************************************************/
34 int ze_logLevel = 10;
35 int ze_logFacility = LOG_LOCAL5;
37 
38 static int syslog_facility_value(char *);
39 static char *syslog_facility_name(int);
40 static int syslog_priority_value(char *);
41 static char *syslog_priority_name(int);
42 
43 
44 static bool zeOut_syslog = TRUE;
45 static bool zeOut_stdout = FALSE;
46 
47 /* ****************************************************************************
48  * *
49  * *
50  ******************************************************************************/
51 #define LOGLINELEN 1024
52 
53 void
54 zeSyslog(int priority, char *format, ...)
55 {
56  va_list arg;
57 
58  char line[LOGLINELEN];
59  char severity[LOGLINELEN];
60  char *env;
61 
62  va_start(arg, format);
63  vsnprintf(line, sizeof (line), format, arg);
64  va_end(arg);
65 
66  {
67  unsigned char *p;
68 
69  for (p = (unsigned char *) line; *p != '\0'; p++) {
70  switch (*p) {
71  case '"':
72  *p = '\'';
73  break;
74  case '%':
75  *p = '#';
76  break;
77 #if 0
78  case '\n':
79  break;
80 #endif
81  default:
82  if (*p >= ' ' && *p < 0x7F)
83  break;
84  *p = ' ';
85  break;
86  }
87  }
88  }
89 
90  env = getenv("LOG_SEVERITY");
91  if (env != NULL && strcasecmp(env, "yes") == 0)
93 
94  if (ze_logSeverity) {
95  memset(severity, 0, sizeof (severity));
96  snprintf(severity, sizeof (severity), "[ID 000000 %s.%s]",
97  syslog_facility_name(ze_logFacility),
98  syslog_priority_name(priority));
99  if (zeOut_syslog)
100  syslog(priority, "%s %s", severity, line);
101  } else {
102  if (zeOut_syslog)
103  syslog(priority, "%s", line);
104  }
105 
106  if (zeOut_stdout) {
107 #if 1
108 #if 1
109  (void) fprintf(stdout, "%s\n", line);
110 #else
111  (void) fprintf(stderr, "%s\n", line);
112 #endif
113 #else
114  FD_PRINTF(STDOUT_FILENO, "%s\n", s);
115 #endif
116  }
117 }
118 
119 
120 /* ****************************************************************************
121  * *
122  * *
123  ******************************************************************************/
124 void
125 zeOpenlog(ident, option, facility)
126  const char *ident;
127  int option;
128  int facility;
129 {
130  openlog(ident, option, facility);
131 }
132 
133 /* ****************************************************************************
134  * *
135  * *
136  ******************************************************************************/
137 void
139 {
140  closelog();
141 }
142 
143 /* ****************************************************************************
144  * *
145  * *
146  ******************************************************************************/
147 void
148 zeLog_MessageInfo(int level, char *format, ...)
149 {
150  if (ze_logLevel >= level) {
151  va_list arg;
152  char s[LOGLINELEN];
153 
154  va_start(arg, format);
155  vsnprintf(s, sizeof (s), format, arg);
156  va_end(arg);
157 
158  zeSyslog(LOG_INFO, s);
159  }
160 }
161 
162 /* ****************************************************************************
163  * *
164  * *
165  ******************************************************************************/
166 void
167 zeLog_MessageWarning(int level, char *format, ...)
168 {
169  if (ze_logLevel >= level) {
170  va_list arg;
171  char s[LOGLINELEN];
172 
173  va_start(arg, format);
174  vsnprintf(s, sizeof (s), format, arg);
175  va_end(arg);
176 
177  zeSyslog(LOG_WARNING, s);
178  }
179 }
180 
181 /* ****************************************************************************
182  * *
183  * *
184  ******************************************************************************/
185 void
186 zeLog_MessageError(int level, char *format, ...)
187 {
188  if (ze_logLevel >= level) {
189  va_list arg;
190  char s[LOGLINELEN];
191 
192  va_start(arg, format);
193  vsnprintf(s, sizeof (s), format, arg);
194  va_end(arg);
195 
196  zeSyslog(LOG_ERR, s);
197  }
198 }
199 
200 /* ****************************************************************************
201  * *
202  * *
203  ******************************************************************************/
204 void
205 zeLog_MsgDebug(char *funct, int level, char *format, ...)
206 {
207  if (ze_logLevel >= level) {
208  va_list arg;
209  char s[LOGLINELEN];
210 
211  va_start(arg, format);
212  vsnprintf(s, sizeof (s), format, arg);
213  va_end(arg);
214 
215  funct = STRNULL(funct, "");
216  zeSyslog(LOG_DEBUG, "%s : %s", funct, s);
217  }
218 }
219 
220 /* ****************************************************************************
221  * *
222  * *
223  ******************************************************************************/
224 void
225 zeLog_MsgInfo(char *funct, int level, char *format, ...)
226 {
227  if (ze_logLevel >= level) {
228  va_list arg;
229  char s[LOGLINELEN];
230 
231  va_start(arg, format);
232  vsnprintf(s, sizeof (s), format, arg);
233  va_end(arg);
234 
235  funct = STRNULL(funct, "");
236  zeSyslog(LOG_INFO, "%s : %s", funct, s);
237  }
238 }
239 
240 /* ****************************************************************************
241  * *
242  * *
243  ******************************************************************************/
244 void
245 zeLog_MsgNotice(char *funct, int level, char *format, ...)
246 {
247  if (ze_logLevel >= level) {
248  va_list arg;
249  char s[LOGLINELEN];
250 
251  va_start(arg, format);
252  vsnprintf(s, sizeof (s), format, arg);
253  va_end(arg);
254 
255  funct = STRNULL(funct, "");
256  zeSyslog(LOG_NOTICE, "%s : %s", funct, s);
257  }
258 }
259 
260 /* ****************************************************************************
261  * *
262  * *
263  ******************************************************************************/
264 void
265 zeLog_MsgWarning(char *funct, int level, char *format, ...)
266 {
267  if (ze_logLevel >= level) {
268  va_list arg;
269  char s[LOGLINELEN];
270 
271  va_start(arg, format);
272  vsnprintf(s, sizeof (s), format, arg);
273  va_end(arg);
274 
275  funct = STRNULL(funct, "");
276  zeSyslog(LOG_WARNING, "%s : %s", funct, s);
277  }
278 }
279 
280 /* ****************************************************************************
281  * *
282  * *
283  ******************************************************************************/
284 void
285 zeLog_MsgError(char *funct, int level, char *format, ...)
286 {
287  if (ze_logLevel >= level) {
288  va_list arg;
289  char s[LOGLINELEN];
290 
291  va_start(arg, format);
292  vsnprintf(s, sizeof (s), format, arg);
293  va_end(arg);
294 
295  funct = STRNULL(funct, "");
296  zeSyslog(LOG_ERR, "%s : %s", funct, s);
297  }
298 }
299 
300 /* ****************************************************************************
301  * *
302  * *
303  ******************************************************************************/
304 void
305 zeLog_SysWarning(char *funct, int level, char *format, ...)
306 {
307  if (ze_logLevel >= level) {
308  va_list arg;
309  char s[LOGLINELEN];
310  char *serr;
311 
312  va_start(arg, format);
313  vsnprintf(s, sizeof (s), format, arg);
314  va_end(arg);
315 
316  funct = STRNULL(funct, "");
317  serr = (errno != 0 ? strerror(errno) : "");
318  zeSyslog(LOG_WARNING, "%s : %s : %s", funct, s, serr);
319  }
320 }
321 
322 /* ****************************************************************************
323  * *
324  * *
325  ******************************************************************************/
326 void
327 zeLog_SysError(char *funct, int level, char *format, ...)
328 {
329  if (ze_logLevel >= level) {
330  va_list arg;
331  char s[LOGLINELEN];
332  char *serr;
333 
334  va_start(arg, format);
335  vsnprintf(s, sizeof (s), format, arg);
336  va_end(arg);
337 
338  funct = STRNULL(funct, "");
339  serr = (errno != 0 ? strerror(errno) : "");
340  zeSyslog(LOG_ERR, "%s : %s : %s", funct, s, serr);
341  }
342 }
343 
344 /* ****************************************************************************
345  * *
346  * *
347  ******************************************************************************/
348 
349 typedef struct {
350  char *name;
351  int code;
352 } log_code_T;
353 
354 static log_code_T prioritynames[] = {
355  {"alert", LOG_ALERT},
356  {"crit", LOG_CRIT},
357  {"debug", LOG_DEBUG},
358  {"emerg", LOG_EMERG},
359  {"err", LOG_ERR},
360  {"info", LOG_INFO},
361  {"notice", LOG_NOTICE},
362  {"warning", LOG_WARNING},
363  {"error", LOG_ERR}, /* DEPRECATED */
364  {"panic", LOG_EMERG}, /* DEPRECATED */
365  {"warn", LOG_WARNING}, /* DEPRECATED */
366  {NULL, -1}
367 };
368 
369 
370 
371 static log_code_T facilitynames[] = {
372  {"auth", LOG_AUTH},
373  {"cron", LOG_CRON},
374  {"daemon", LOG_DAEMON},
375  {"kern", LOG_KERN},
376  {"lpr", LOG_LPR},
377  {"mail", LOG_MAIL},
378  {"news", LOG_NEWS},
379  {"security", LOG_AUTH}, /* DEPRECATED */
380  {"syslog", LOG_SYSLOG},
381  {"user", LOG_USER},
382  {"uucp", LOG_UUCP},
383  {"local0", LOG_LOCAL0},
384  {"local1", LOG_LOCAL1},
385  {"local2", LOG_LOCAL2},
386  {"local3", LOG_LOCAL3},
387  {"local4", LOG_LOCAL4},
388  {"local5", LOG_LOCAL5},
389  {"local6", LOG_LOCAL6},
390  {"local7", LOG_LOCAL7},
391  {NULL, -1}
392 };
393 
394 
395 static int
396 syslog_code_by_name(log_code, name)
397  log_code_T *log_code;
398  char *name;
399 {
400  log_code_T *p = log_code;
401 
402  ASSERT(log_code != NULL);
403 
404  if (log_code == NULL || name == NULL)
405  return -1;
406 
407  while (p->name != NULL && strcasecmp(p->name, name) != 0)
408  p++;
409 
410  return p->code;
411 }
412 
413 static char *
414 syslog_name_by_code(log_code, code)
415  log_code_T *log_code;
416  int code;
417 {
418  log_code_T *p = log_code;
419 
420  if (log_code == NULL)
421  return NULL;
422 
423  while (p->name != NULL && p->code != code)
424  p++;
425 
426  return p->name;
427 }
428 
429 
430 char *
432  int facility;
433 {
434  log_code_T *p = facilitynames;
435  char *name;
436 
437  name = syslog_name_by_code(p, facility);
438  return (name != NULL ? name : "");
439 }
440 
441 int
443  char *ps;
444 {
445  log_code_T *p = facilitynames;
446 
447  return syslog_code_by_name(p, ps);
448 }
449 
450 
451 char *
453  int priority;
454 {
455  log_code_T *p = prioritynames;
456  char *name;
457 
458  name = syslog_name_by_code(p, priority);
459  return (name != NULL ? name : "");
460 }
461 
462 int
464  char *ps;
465 {
466  log_code_T *p = prioritynames;
467 
468  return syslog_code_by_name(p, ps);
469 }
470 /* ****************************************************************************
471  * *
472  * *
473  ******************************************************************************/
474 void
476  char *ps;
477 {
478  int facility;
479 
480  if ((facility = syslog_facility_value(ps)) >= 0) {
481  ze_logFacility = facility;
482  }
483 }
484 
485 /* ****************************************************************************
486  * *
487  * *
488  ******************************************************************************/
489 void
490 zeLog_SetOutput(out_syslog, out_stdout)
491  bool out_syslog;
492  bool out_stdout;
493 {
494  zeOut_syslog = out_syslog;
495  zeOut_stdout = out_stdout;
496 }
497 
498 /* ****************************************************************************
499  * *
500  * *
501  ******************************************************************************/
502 int
504  char *ps;
505 {
506  log_code_T *p = prioritynames;
507 
508  while (p->name != NULL) {
509  if (strcmp(p->name, ps) == 0)
510  return p->code;
511  p++;
512  }
513  return LOG_DEBUG;
514 }
515 
516 static int
517 syslog_priority_value(s)
518  char *s;
519 {
520  return syslog_code_by_name(prioritynames, s);
521 }
522 
523 static char *
524 syslog_priority_name(code)
525  int code;
526 {
527  char *s;
528 
529  s = syslog_name_by_code(prioritynames, code);
530 
531  return STRNULL(s, "(null)");
532 }
533 
534 static int
535 syslog_facility_value(s)
536  char *s;
537 {
538  return syslog_code_by_name(facilitynames, s);
539 }
540 
541 static char *
542 syslog_facility_name(code)
543  int code;
544 {
545  char *s;
546 
547  s = syslog_name_by_code(facilitynames, code);
548 
549  return STRNULL(s, "(null)");
550 }
void zeLog_MsgInfo(char *funct, int level, char *format,...)
Definition: zeSyslog.c:225
void zeLog_MsgDebug(char *funct, int level, char *format,...)
Definition: zeSyslog.c:205
int zeLog_PriorityValue(char *ps)
Definition: zeSyslog.c:463
void zeLog_SetOutput(bool out_syslog, bool out_stdout)
Definition: zeSyslog.c:490
#define ASSERT(a)
Definition: macros.h:27
void zeLog_SetFacility(char *ps)
Definition: zeSyslog.c:475
void zeLog_MessageWarning(int level, char *format,...)
Definition: zeSyslog.c:167
int ze_logLevel
Definition: zeSyslog.c:34
char * zeLog_FacilityName(int facility)
Definition: zeSyslog.c:431
#define STRNULL(x, r)
Definition: macros.h:81
void zeLog_MsgWarning(char *funct, int level, char *format,...)
Definition: zeSyslog.c:265
void zeLog_SysWarning(char *funct, int level, char *format,...)
Definition: zeSyslog.c:305
void zeSyslog(int priority, char *format,...)
Definition: zeSyslog.c:54
#define FALSE
Definition: macros.h:160
int ze_logFacility
Definition: zeSyslog.c:35
char * name
Definition: zeSyslog.c:350
void zeLog_MsgError(char *funct, int level, char *format,...)
Definition: zeSyslog.c:285
#define FD_PRINTF(fdp,...)
Definition: macros.h:45
int priority
int ze_log_priority(char *ps)
Definition: zeSyslog.c:503
void zeLog_MsgNotice(char *funct, int level, char *format,...)
Definition: zeSyslog.c:245
#define TRUE
Definition: macros.h:157
void zeLog_MessageError(int level, char *format,...)
Definition: zeSyslog.c:186
void zeLog_SysError(char *funct, int level, char *format,...)
Definition: zeSyslog.c:327
int code
Definition: zeSyslog.c:351
bool ze_logSeverity
Definition: zeSyslog.c:36
void zeCloselog()
Definition: zeSyslog.c:138
void zeOpenlog(char *ident, int option, int facility) const
Definition: zeSyslog.c:125
int zeLog_FacilityValue(char *ps)
Definition: zeSyslog.c:442
#define LOGLINELEN
Definition: zeSyslog.c:51
void zeLog_MessageInfo(int level, char *format,...)
Definition: zeSyslog.c:148
char * zeLog_PriorityName(int priority)
Definition: zeSyslog.c:452