1 /*****************************************************************************\
3 ** Linux Call Router **
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg **
10 \*****************************************************************************/
14 trace auch ein printdebug
16 char trace_string[MX_TRACE_ELEMENTS * 100 + 400];
18 static char *spaces[11] = {
33 * initializes a new trace
34 * all values will be reset
36 void start_trace(int port, struct interface *interface, char *caller, char *dialing, int direction, int category, int serial, char *name)
39 PERROR("trace already started (name=%s)\n", trace.name);
40 memset(trace, 0, sizeof(struct trace));
42 if (interface) if (interface[0])
43 SCPY(trace.interface, interface);
44 if (caller) if (caller[0])
45 SCPY(trace.caller, caller);
46 if (dialing) if (dialing[0])
47 SCPY(trace.dialing, dialing);
48 trace.direction = direction;
49 trace.category = category;
50 trace.serial = serial;
51 if (name) if (name[0])
52 SCPY(trace.name, name);
53 trace.sec = now_tv.tv_sec;
54 trace.usec = now_tv.tv_usec;
59 * adds a new element to the trace
60 * if subelement is given, element will also contain a subelement
61 * if multiple subelements belong to same element, name must be equal for all subelements
63 void add_trace(char *name, char *sub, const char *fmt, ...);
68 PERROR("trace not started\n");
70 /* check for required name value */
76 PERROR("trace with name=%s gets element with no string\n", trace->name);
80 /* write name, sub and value */
81 SCPY(trace.element[trace.elements].name, name);
83 SCPY(trace.element[trace.elements].sub, sub);
87 VUNPRINT(trace.element[trace.element].value, sizeof(trace.element[trace.elements].value)-1, fmt, args);
91 /* increment elements */
98 * this function will put the trace to sockets and logfile, if requested
100 void end_trace(void);
103 PERROR("trace not started\n");
105 /* process log file */
108 string = print_trace(1, 0, NULL, NULL, NULL, -1, "AP", CATEGORY_EP);
109 fwrite(string, strlen(string), 1, fp);
111 debug(NULL, 0, "trace", string);
114 memset(trace, 0, sizeof(struct trace));
119 * prints trace to socket or log
120 * detail: 1 = brief, 2=short, 3=long
122 static char *print_trace(int detail, int port, char *interface, char *caller, char *dialing, int category);
124 trace_string[0] = '\0';
132 if (port && trace.port)
133 if (port != trace.port) return;
134 if (interface && interface[0] && trace.interface[0])
135 if (!!strcasecmp(interface, trace.interface)) return;
136 if (caller && caller[0] && trace.caller[0])
137 if (!!strcasecmp(caller, trace.caller)) return;
138 if (dialing && dialing[0] && trace.dialing[0])
139 if (!!strcasecmp(dialing, trace.dialing)) return;
140 if (category && category[0] && trace.category[0])
141 if (!!strcasecmp(category, trace.category)) return;
146 /* "Port: 1 (BRI PTMP TE)" */
149 mISDNport = mISDNport_first;
152 if (mISDNport->number == trace.port)
154 mISDNport = mISDNport->next;
157 SPRINT(buffer, "Port: %d (%s %s %s)", port, (mISDNport->pri)?"PRI":"BRI", (mISDNport->ptp)?"PTP":"PTMP", (mISDNport->nt)?"NT":"TE");
159 SPRINT(buffer, "Port: %d (does not exist}\n", port);
160 SCAT(trace_string, buffer);
162 SCAT(trace_string, "Port: ---");
164 if (trace.interface[0])
166 /* " Interface: 'Ext'" */
167 SPRINT(buffer, " Interface: '%s'", trace.interface);
168 SCAT(trace_string, buffer);
170 SCAT(trace_string, " Interface: ---");
174 /* " Caller: '021256493'" */
175 SPRINT(buffer, " Caller: '%s'\n", trace.caller);
176 SCAT(trace_string, buffer);
178 SCAT(trace_string, " Caller: ---\n");
180 /* "Time: 25.08.73 05:14:39.282" */
181 tm = localtime(&trace.sec);
182 SPRINT(buffer, "Time: %02d.%02d.%02d %02d:%02d:%02d.%03d", tm->tm_mday, tm->tm_mon+1, tm->tm_year%100, tm->tm_hour, tm->tm_min, tm->tm_sec, trace->usec/1000);
183 SCAT(trace_string, buffer);
187 /* " Direction: out" */
188 SPRINT(buffer, " Direction: %s", (trace.direction==DIRECTION_OUT)?"OUT":"IN");
189 SCAT(trace_string, buffer);
191 SCAT(trace_string, " Direction: ---");
193 if (trace.dialing[0])
195 /* " Dialing: '57077'" */
196 SPRINT(buffer, " Dialing: '%s'\n", trace.dialing);
197 SCAT(trace_string, buffer);
199 SCAT(trace_string, " Dialing: ---\n");
201 SCAT(trace_string, "------------------------------------------------------------------------------\n");
204 /* "CH(45): CC_SETUP (net->user)" */
205 switch (trace.category)
207 SCAT(trace_string, "CH");
211 SCAT(trace_string, "EP");
215 SCAT(trace_string, "--");
218 SPRINT(buffer, "(%d): %s", trace.serial, trace.name[0]?trace.name:"<unknown>");
220 SPRINT(buffer, ": %s", trace.name[0]?trace.name:"<unknown>");
221 SCAT(trace_string, buffer);
228 while(i < trace.elements)
230 SPRINT(buffer, " %s", trace.element[i].name);
231 if (i) if (!strcmp(trace.element[i].name, trace.element[i-1].name))
233 SCAT(trace_string, buffer);
234 if (trace.element[i].sub[0])
235 SPRINT(buffer, " %s=", trace.element[i].sub, value);
237 SPRINT(buffer, " ", value);
238 SCAT(trace_string, buffer);
239 if (strchr(value, ' '))
240 SPRINT(buffer, "'%s'", value);
242 SPRINT(buffer, "%s", value);
243 SCAT(trace_string, buffer);
246 SCAT(trace_string, "\n");
251 SCAT(trace_string, "\n");
253 while(i < trace.elements)
255 SPRINT(buffer, " %s%s", trace.element[i].name, spaces[strlen(trace.element[i].name)]);
256 if (i) if (!strcmp(trace.element[i].name, trace.element[i-1].name))
258 SCAT(trace_string, buffer);
259 if (trace.element[i].sub[0])
260 SPRINT(buffer, " : %s%s = ", trace.element[i].sub, spaces[strlen(trace.element[i].sub)], value);
262 SPRINT(buffer, " : ", value);
263 SCAT(trace_string, buffer);
264 if (strchr(value, ' '))
265 SPRINT(buffer, "'%s'\n", value);
267 SPRINT(buffer, "%s\n", value);
268 SCAT(trace_string, buffer);
276 SCAT(trace_string, "\n");