libcfe  0.12.1
some useful C-functions
output.c
Go to the documentation of this file.
1 #include "config.h"
2 #include "output.h"
3 
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <stdarg.h>
7 #include <string.h>
8 
9 #include "len.h"
10 
11 #define CHECK_MODE(i, c) (((i) & (c)) == (c))
12 #define APPEND_MODE(v, m, c) if(CHECK_MODE(m, c)) \
13  v |= c;
14 
15 #define CASE(s, v) case LOG_##s: \
16  v = strdup(LOG_##s##_NAME); \
17  break;
18 
19 static short _output_lvl, _output_mode;
20 static FILE *_output_file_stream;
21 
22 char *levelname(int lvl);
23 
24 int set_output_level(int lvl)
25 {
26  if(lvl == _OUTPUT_GET_CURRENT_VALUE)
27  return _output_lvl;
28  if(lvl >= LOG_EMERG && lvl <= LOG_DEBUG)
29  _output_lvl = lvl;
30  return _output_lvl;
31 }
32 
33 int set_output_mode(int mode)
34 {
35  if(mode == _OUTPUT_GET_CURRENT_VALUE)
36  return _output_mode;
37 
38  _output_mode = 0;
39  APPEND_MODE(_output_mode, mode, _OUTPUT_MODE_PRINT)
40  APPEND_MODE(_output_mode, mode, _OUTPUT_MODE_SYSLOG)
41  APPEND_MODE(_output_mode, mode, _OUTPUT_MODE_FILE)
42  return _output_mode;
43 }
44 
45 int set_output_file(FILE *out)
46 {
47  _output_file_stream = out;
48  return 0;
49 }
50 
51 char *levelname(int lvl)
52 {
53  char *ret = NULL;
54  switch(lvl)
55  {
56  CASE(EMERG, ret)
57  CASE(ALERT, ret)
58  CASE(CRIT, ret)
59  CASE(ERR, ret)
60  CASE(WARNING, ret)
61  CASE(NOTICE, ret)
62  CASE(INFO, ret)
63  CASE(DEBUG, ret)
64  default: break;
65  }
66  return ret;
67 }
68 
69 void output1(int lvl, const char *msg, ...)
70 {
71  if(lvl <= _output_lvl)
72  {
73  va_list ap;
74  va_start(ap, msg);
75  char *msg1 = NULL;
76  char *buf = NULL;
77  int buf_len;
78  if(lvl <= LOG_WARNING || lvl == LOG_DEBUG)
79  {
80  char *lvlname = levelname(lvl);
81  asprintf(&msg1, "%s: %s", lvlname, msg);
82  free(lvlname);
83  lvlname = NULL;
84  buf_len = vasprintf(&buf, msg1, ap);
85  }
86  else
87  buf_len = vasprintf(&buf, msg, ap);
88 
89  va_end(ap);
90 
91  if(CHECK_MODE(_output_mode , _OUTPUT_MODE_SYSLOG))
92  syslog(LOG_DAEMON | lvl, "%s", buf);
93 
94  if(CHECK_MODE(_output_mode , _OUTPUT_MODE_PRINT))
95  puts(buf);
96 
97  if(CHECK_MODE(_output_mode , _OUTPUT_MODE_FILE))
98  {
99  buf[buf_len] = '\n';
100  fwrite(buf, buf_len + 1, 1, _output_file_stream);
101  fflush(_output_file_stream);
102  }
103 
104  free(buf);
105  buf = NULL;
106  free(msg1);
107  msg1 = NULL;
108  }
109  return;
110 }
#define _OUTPUT_MODE_SYSLOG
Print messages to syslog.
Definition: output.h:49
#define _OUTPUT_MODE_PRINT
Print messages to stdout.
Definition: output.h:48
#define APPEND_MODE(v, m, c)
Definition: output.c:12
#define CASE(s, v)
Definition: output.c:15
#define _OUTPUT_MODE_FILE
Print messages to a logfile (also use set_output_file to set the desired logfile).
Definition: output.h:50
int set_output_level(int lvl)
Definition: output.c:24
#define CHECK_MODE(i, c)
Definition: output.c:11
char * levelname(int lvl)
Definition: output.c:51
int set_output_mode(int mode)
Definition: output.c:33
#define _OUTPUT_GET_CURRENT_VALUE
Get the current value (See set_output_level, set_output_mode).
Definition: output.h:46
void output1(int lvl, const char *msg,...)
Definition: output.c:69
int set_output_file(FILE *out)
Definition: output.c:45