formatted logging module
[sip-router] / modules_s / xlog / xlog.c
1 /**\r
2  * $Id$
3  *\r
4  * Copyright (C) 2001-2003 Fhg Fokus\r
5  *\r
6  * This file is part of ser, a free SIP server.\r
7  *\r
8  * ser is free software; you can redistribute it and/or modify\r
9  * it under the terms of the GNU General Public License as published by\r
10  * the Free Software Foundation; either version 2 of the License, or\r
11  * (at your option) any later version\r
12  *\r
13  * For a license to use the ser software under conditions\r
14  * other than those described here, or to purchase support for this\r
15  * software, please contact iptel.org by e-mail at the following addresses:\r
16  *    info@iptel.org\r
17  *\r
18  * ser is distributed in the hope that it will be useful,\r
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
21  * GNU General Public License for more details.\r
22  *\r
23  * You should have received a copy of the GNU General Public License \r
24  * along with this program; if not, write to the Free Software \r
25  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
26  */\r
27 \r
28 #include <stdio.h>\r
29 #include <string.h>\r
30 #include <stdlib.h>\r
31 #include <sys/types.h>\r
32 #include <sys/ipc.h>\r
33 #include <unistd.h>\r
34 #include <fcntl.h>\r
35 #include <time.h>\r
36 \r
37 #include "../../sr_module.h"\r
38 #include "../../dprint.h"\r
39 #include "../../mem/mem.h"\r
40 \r
41 #include "xl_lib.h"\r
42
43
44 MODULE_VERSION
45
46 \r
47 #define MAX_FORMATS 10\r
48 \r
49 \r
50 /** parameters */\r
51 \r
52 char *formats[MAX_FORMATS] = { \r
53                 "XLOG{0}: [%Tf] method:<%rm> r-uri:<%ru>\n",\r
54                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };\r
55 int buf_size=4096;\r
56 \r
57 char *log_buf = NULL;\r
58 int  log_len = 0;\r
59 xl_elog_t *models[MAX_FORMATS] = {\r
60                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };\r
61 \r
62 /** module functions */\r
63 static int mod_init(void);\r
64 static int child_init(int);\r
65 \r
66 static int xlog(struct sip_msg*, char*, char*);\r
67 static int xdbg(struct sip_msg*, char*, char*);\r
68 \r
69 void destroy(void);\r
70 \r
71 static cmd_export_t cmds[]={\r
72         {"xlog",  xlog,  2, 0, REQUEST_ROUTE | FAILURE_ROUTE},\r
73         {"xdbg",  xdbg,  1, 0, REQUEST_ROUTE | FAILURE_ROUTE},\r
74         {0,0,0,0,0}\r
75 };\r
76 \r
77 \r
78 static param_export_t params[]={\r
79         {"f0",     STR_PARAM, &formats[0]},\r
80         {"f1",     STR_PARAM, &formats[1]},\r
81         {"f2",     STR_PARAM, &formats[2]},\r
82         {"f3",     STR_PARAM, &formats[3]},\r
83         {"f4",     STR_PARAM, &formats[4]},\r
84         {"f5",     STR_PARAM, &formats[5]},\r
85         {"f6",     STR_PARAM, &formats[6]},\r
86         {"f7",     STR_PARAM, &formats[7]},\r
87         {"f8",     STR_PARAM, &formats[8]},\r
88         {"f9",     STR_PARAM, &formats[9]},\r
89         {"buf_size",  INT_PARAM, &buf_size},\r
90         {0,0,0}\r
91 };\r
92 \r
93 \r
94 /** module exports */\r
95 struct module_exports exports= {\r
96         "xlog",\r
97         cmds,\r
98         params,\r
99         \r
100         mod_init,   /* module initialization function */\r
101         (response_function) 0,\r
102         (destroy_function) destroy,\r
103         0,\r
104         child_init  /* per-child init function */\r
105 };\r
106 \r
107 /**\r
108  * init module function\r
109  */\r
110 static int mod_init(void)\r
111 {\r
112         int i;\r
113         DBG("XLOG: initializing ...\n");\r
114         log_buf = (char*)pkg_malloc((buf_size+1)*sizeof(char));\r
115         if(log_buf==NULL)\r
116         {\r
117                 LOG(L_ERR, "XLOG:mod_init: ERROR: no more memory\n");\r
118                 return -1;\r
119         }\r
120         \r
121         for(i=0; i<MAX_FORMATS; i++)\r
122         {\r
123                 if(formats[i])\r
124                 {\r
125                         if(xl_parse_format(formats[i], &models[i])<0)\r
126                                 LOG(L_ERR, "XLOG:mod_init: ERROR: wrong format[%d]\n", i);\r
127                 }\r
128         }\r
129 \r
130         return 0;\r
131 }\r
132 \r
133 /**\r
134  * Initialize childs\r
135  */\r
136 static int child_init(int rank)\r
137 {\r
138         DBG("XLOG: init_child [%d]  pid [%d]\n", rank, getpid());\r
139         return 0;\r
140 }\r
141 \r
142 /**\r
143  */\r
144 static int xlog(struct sip_msg* msg, char* lev, char* frm)\r
145 {\r
146         int l=0, f=0;\r
147         \r
148         if(lev && lev[0]>'0' && lev[0]<='9')\r
149                 l = lev[0] - '0';\r
150         if(frm && frm[0]>'0' && frm[0]<='9')\r
151                 f = frm[0] - '0';\r
152 \r
153         DBG("XLOG:xlog: format[%d] level[%d] ...\n", f, l);\r
154         log_len = buf_size;\r
155 \r
156         if(xl_print_log(msg, models[f], log_buf, &log_len)<0)\r
157                 return -1;\r
158 \r
159         log_buf[log_len] = '\0';\r
160         LOG(l, log_buf);\r
161 \r
162         return 1;\r
163 }\r
164 \r
165 /**\r
166  */\r
167 static int xdbg(struct sip_msg* msg, char* frm, char* str2)\r
168 {\r
169         int f=0;\r
170 \r
171         if(frm && frm[0]>'0' && frm[0]<='9')\r
172                 f = frm[0] - '0';\r
173 \r
174         DBG("XLOG:xdbg: format[%d]  ...\n", f);\r
175         log_len = buf_size;\r
176 \r
177         if(xl_print_log(msg, models[f], log_buf, &log_len)<0)\r
178                 return -1;\r
179 \r
180         log_buf[log_len] = '\0';\r
181         DBG(log_buf);\r
182 \r
183         return 1;\r
184 }\r
185 \r
186 /**\r
187  * destroy function\r
188  */\r
189 void destroy(void)\r
190 {\r
191         int i;\r
192         DBG("XLOG: destroy module ...\n");\r
193         if(log_buf)\r
194                 pkg_free(log_buf);\r
195         for(i=0; i<MAX_FORMATS; i++)\r
196                 if(models[i])\r
197                         xl_elog_free_all(models[i]);\r
198 }\r
199 \r