1 /*****************************************************************************\
3 ** Linux Call Router **
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg **
10 \*****************************************************************************/
15 char trace_string[MAX_TRACE_ELEMENTS * 100 + 400];
17 static char *spaces[11] = {
32 * initializes a new trace
33 * all values will be reset
35 void start_trace(int port, struct interface *interface, char *caller, char *dialing, int direction, int category, int serial, char *name)
38 PERROR("trace already started (name=%s)\n", trace.name);
39 memset(&trace, 0, sizeof(struct trace));
42 SCPY(trace.interface, interface->name);
43 if (caller) if (caller[0])
44 SCPY(trace.caller, caller);
45 if (dialing) if (dialing[0])
46 SCPY(trace.dialing, dialing);
47 trace.direction = direction;
48 trace.category = category;
49 trace.serial = serial;
50 if (name) if (name[0])
51 SCPY(trace.name, name);
52 trace.sec = now_tv.tv_sec;
53 trace.usec = now_tv.tv_usec;
58 * adds a new element to the trace
59 * if subelement is given, element will also contain a subelement
60 * if multiple subelements belong to same element, name must be equal for all subelements
62 void add_trace(char *name, char *sub, const char *fmt, ...)
67 PERROR("trace not started\n");
69 /* check for required name value */
75 PERROR("trace with name=%s gets element with no string\n", trace.name);
79 /* write name, sub and value */
80 SCPY(trace.element[trace.elements].name, name);
82 SCPY(trace.element[trace.elements].sub, sub);
86 VUNPRINT(trace.element[trace.elements].value, sizeof(trace.element[trace.elements].value)-1, fmt, args);
90 /* increment elements */
96 * prints trace to socket or log
97 * detail: 1 = brief, 2=short, 3=long
99 static char *print_trace(int detail, int port, char *interface, char *caller, char *dialing, int category)
102 time_t ti = trace.sec;
104 struct mISDNport *mISDNport;
107 trace_string[0] = '\0'; // always clear string
113 if (port && trace.port)
114 if (port != trace.port) return(NULL);
115 if (interface) if (interface[0] && trace.interface[0])
116 if (!!strcasecmp(interface, trace.interface)) return(NULL);
117 if (caller) if (caller[0] && trace.caller[0])
118 if (!!strcasecmp(caller, trace.caller)) return(NULL);
119 if (dialing) if (dialing[0] && trace.dialing[0])
120 if (!!strcasecmp(dialing, trace.dialing)) return(NULL);
121 if (category && trace.category)
122 if (category != trace.category) return(NULL);
127 SCAT(trace_string, "------------------------------------------------------------------------------\n");
128 /* "Port: 1 (BRI PTMP TE)" */
131 mISDNport = mISDNport_first;
134 if (mISDNport->portnum == trace.port)
136 mISDNport = mISDNport->next;
140 SPRINT(buffer, "Port: %d (%s %s %s)", trace.port, (mISDNport->pri)?"PRI":"BRI", (mISDNport->ptp)?"PTP":"PTMP", (mISDNport->ntmode)?"NT":"TE");
141 /* copy interface, if we have a port */
142 if (mISDNport->ifport) if (mISDNport->ifport->interface)
143 SCPY(trace.interface, mISDNport->ifport->interface->name);
145 SPRINT(buffer, "Port: %d (does not exist)\n", trace.port);
146 SCAT(trace_string, buffer);
148 SCAT(trace_string, "Port: ---");
150 if (trace.interface[0])
152 /* " Interface: 'Ext'" */
153 SPRINT(buffer, " Interface: '%s'", trace.interface);
154 SCAT(trace_string, buffer);
156 SCAT(trace_string, " Interface: ---");
160 /* " Caller: '021256493'" */
161 SPRINT(buffer, " Caller: '%s'\n", trace.caller);
162 SCAT(trace_string, buffer);
164 SCAT(trace_string, " Caller: ---\n");
166 /* "Time: 25.08.73 05:14:39.282" */
168 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);
169 SCAT(trace_string, buffer);
173 /* " Direction: out" */
174 SPRINT(buffer, " Direction: %s", (trace.direction==DIRECTION_OUT)?"OUT":"IN");
175 SCAT(trace_string, buffer);
177 SCAT(trace_string, " Direction: ---");
179 if (trace.dialing[0])
181 /* " Dialing: '57077'" */
182 SPRINT(buffer, " Dialing: '%s'\n", trace.dialing);
183 SCAT(trace_string, buffer);
185 SCAT(trace_string, " Dialing: ---\n");
187 SCAT(trace_string, "------------------------------------------------------------------------------\n");
190 /* "CH(45): CC_SETUP (net->user)" */
191 switch (trace.category)
193 SCAT(trace_string, "CH");
197 SCAT(trace_string, "EP");
201 SCAT(trace_string, "--");
204 SPRINT(buffer, "(%d): %s", trace.serial, trace.name[0]?trace.name:"<unknown>");
206 SPRINT(buffer, ": %s", trace.name[0]?trace.name:"<unknown>");
207 SCAT(trace_string, buffer);
214 while(i < trace.elements)
216 SPRINT(buffer, " %s", trace.element[i].name);
217 if (i) if (!strcmp(trace.element[i].name, trace.element[i-1].name))
219 SCAT(trace_string, buffer);
220 if (trace.element[i].sub[0])
221 SPRINT(buffer, " %s=", trace.element[i].sub);
224 SCAT(trace_string, buffer);
225 if (strchr(trace.element[i].value, ' '))
226 SPRINT(buffer, "'%s'", trace.element[i].value);
228 SPRINT(buffer, "%s", trace.element[i].value);
229 SCAT(trace_string, buffer);
232 SCAT(trace_string, "\n");
237 SCAT(trace_string, "\n");
239 while(i < trace.elements)
241 SPRINT(buffer, " %s%s", trace.element[i].name, spaces[strlen(trace.element[i].name)]);
242 if (i) if (!strcmp(trace.element[i].name, trace.element[i-1].name))
244 SCAT(trace_string, buffer);
245 if (trace.element[i].sub[0])
246 SPRINT(buffer, " : %s%s = ", trace.element[i].sub, spaces[strlen(trace.element[i].sub)]);
248 SPRINT(buffer, " : ");
249 SCAT(trace_string, buffer);
250 if (strchr(trace.element[i].value, ' '))
251 SPRINT(buffer, "'%s'\n", trace.element[i].value);
253 SPRINT(buffer, "%s\n", trace.element[i].value);
254 SCAT(trace_string, buffer);
262 SCAT(trace_string, "\n");
263 return(trace_string);
269 * this function will put the trace to sockets and logfile, if requested
276 PERROR("trace not started\n");
278 /* process log file */
281 string = print_trace(1, 0, NULL, NULL, NULL, 0);
284 debug(NULL, 0, "trace", string);
287 printf("%s", print_trace(3, 0, NULL, NULL, NULL, 0));
288 #warning trace auch zum socket
289 // fwrite(string, strlen(string), 1, fp);
291 memset(&trace, 0, sizeof(struct trace));