backup
[lcr.git] / trace.c
diff --git a/trace.c b/trace.c
index f2698c1..999a6fe 100644 (file)
--- a/trace.c
+++ b/trace.c
@@ -11,8 +11,7 @@
 
 #include "main.h"
 
-struct trace trace[MAX_NESTED_TRACES];
-int trace_current = -1;
+struct trace trace;
 char trace_string[MX_TRACE_ELEMENTS * 100 + 400];
 
 static char *spaces[11] = {
@@ -33,29 +32,25 @@ static char *spaces[11] = {
  * initializes a new trace
  * all values will be reset
  */
-void start_trace(int port, char *interface, char *caller, char *dialing, int direction, char *category, char *name);
+void start_trace(int port, char *interface, char *caller, char *dialing, int direction, int category, int serial, char *name);
 {
-       if (++trace_current == MAX_NESTED_TRACES)
-       {
-               PERROR("maximum nesting level of traces exceeding: %d, exitting!\n", MAX_NESTED_TRACES);
-               PERROR("last trace=%s\n", trace[MAX_NESTED_TRACE-1].name);
-               exit(-1);
-       }
-       memset(trace[trace_current], 0, sizeof(struct trace));
-       trace[trace_current].port = port;
+       if (trace.name[0])
+               PERROR("trace already started (name=%s)\n", trace.name);
+       memset(trace, 0, sizeof(struct trace));
+       trace.port = port;
        if (interface) if (interface[0])
-               SCPY(trace[trace_current].interface, interface);
+               SCPY(trace.interface, interface);
        if (caller) if (caller[0])
-               SCPY(trace[trace_current].caller, caller);
+               SCPY(trace.caller, caller);
        if (dialing) if (dialing[0])
-               SCPY(trace[trace_current].dialing, dialing);
-       trace[trace_current].direction = direction;
-       if (category) if (category[0])
-               SCPY(trace[trace_current].category, category);
+               SCPY(trace.dialing, dialing);
+       trace.direction = direction;
+       trace.category = category;
+       trace.serial = serial;
        if (name) if (name[0])
-               SCPY(trace[trace_current].name, name);
-       trace[trace_current].sec = now_tv.tv_sec;
-       trace[trace_current].usec = now_tv.tv_usec;
+               SCPY(trace.name, name);
+       trace.sec = now_tv.tv_sec;
+       trace.usec = now_tv.tv_usec;
 }
 
 
@@ -68,19 +63,8 @@ void add_trace(char *name, char *sub, const char *fmt, ...);
 {
        va_list args;
 
-       /* check nesting */
-       if (trace_current < 0)
-       {
-               PERROR("add_trace called without start_trace, exitting.\n");
-               exit(0);
-       }
-       
-       /* check for space */
-       if (trace[trace_current].elements == MAX_TRACE_ELEMENTS)
-       {
-               PERROR("trace with name=%s exceeds the maximum number of elements (%d)\n", trace.name, MAX_TRACE_ELEMENTS);
-               return;
-       }
+       if (!trace.name[0])
+               PERROR("trace not started\n");
        
        /* check for required name value */
        if (!name)
@@ -93,18 +77,18 @@ void add_trace(char *name, char *sub, const char *fmt, ...);
        }
        
        /* write name, sub and value */
-       SCPY(trace[trace_current].element[trace[trace_current].elements].name, name);
+       SCPY(trace.element[trace.elements].name, name);
        if (sub) if (sub[0])
-               SCPY(trace[trace_current].element[trace[trace_current].elements].sub, sub);
+               SCPY(trace.element[trace.elements].sub, sub);
        if (fmt) if (fmt[0])
        {
                va_start(args, fmt);
-               VUNPRINT(trace[trace_current].element[trace[trace_current].element].value, sizeof(trace[trace_current].element[trace[trace_current].elements].value)-1, fmt, args);
+               VUNPRINT(trace.element[trace.element].value, sizeof(trace.element[trace.elements].value)-1, fmt, args);
                va_end(args);
        }
 
        /* increment elements */
-       trace[trace_current].elements++;
+       trace.elements++;
 }
 
 
@@ -114,22 +98,17 @@ void add_trace(char *name, char *sub, const char *fmt, ...);
  */
 void end_trace(void);
 {
-       /* check nesting */
-       if (trace_current < 0)
-       {
-               PERROR("end_trace called without start_trace, exitting.\n");
-               exit(0);
-       }
+       if (!trace.name[0])
+               PERROR("trace not started\n");
        
        /* process log file */
        if (options.log[0])
        {
-               string = print_trace(1, 0, NULL, NULL, NULL, -1, "AP", NULL);
+               string = print_trace(1, 0, NULL, NULL, NULL, -1, "AP", CATEGORY_EP);
                fwrite(string, strlen(string), 1, fp);
        }
 
-       /* reduce nesting level */
-       trace_current--;
+       memset(trace, 0, sizeof(struct trace));
 }
 
 
@@ -137,7 +116,7 @@ void end_trace(void);
  * prints trace to socket or log
  * detail: 1 = brief, 2=short, 3=long
  */
-static char *print_trace(int detail, int port, char *interface, char *caller, char *dialing, int direction, char *category);
+static char *print_trace(int detail, int port, char *interface, char *caller, char *dialing, int category);
 {
        trace_string[0] = '\0';
        char buffer[256];
@@ -155,8 +134,6 @@ static char *print_trace(int detail, int port, char *interface, char *caller, ch
                if (!!strcasecmp(caller, trace.caller)) return;
        if (dialing && dialing[0] && trace.dialing[0])
                if (!!strcasecmp(dialing, trace.dialing)) return;
-       if (direction && trace.direction)
-               if (direction != trace.direction) return;
        if (category && category[0] && trace.category[0])
                if (!!strcasecmp(category, trace.category)) return;
 
@@ -221,8 +198,20 @@ static char *print_trace(int detail, int port, char *interface, char *caller, ch
                SCAT(trace_string, "------------------------------------------------------------------------------\n");
        }
 
-       /* "L3: CC_SETUP (net->user)" */
-       SPRINT(buffer, "%s: %s", trace.category[0]?trace.category:"--", trace.name[0]?trace.name:"<unknown>");
+       /* "CH(45): CC_SETUP (net->user)" */
+       switch (trace.category)
+       {       case CATEGORY_CH:
+               SCAT(trace_string, "CH");
+               break;
+
+               case CATEGORY_EP:
+               SCAT(trace_string, "EP");
+               break;
+
+               default:
+               SCAT(trace_string, "--");
+       }
+       SPRINT(buffer, "(%d): %s", trace.serial, trace.name[0]?trace.name:"<unknown>");
        SCAT(trace_string, buffer);
 
        /* elements */
@@ -237,9 +226,14 @@ static char *print_trace(int detail, int port, char *interface, char *caller, ch
                                buffer[0] = '\0';
                        SCAT(trace_string, buffer);
                        if (trace.element[i].sub[0])
-                               SPRINT(buffer, " %s=%s", trace.element[i].sub, value);
+                               SPRINT(buffer, " %s=", trace.element[i].sub, value);
                        else
-                               SPRINT(buffer, " %s", value);
+                               SPRINT(buffer, " ", value);
+                       SCAT(trace_string, buffer);
+                       if (strchr(value, ' '))
+                               SPRINT(buffer, "'%s'", value);
+                       else
+                               SPRINT(buffer, "%s", value);
                        SCAT(trace_string, buffer);
                        i++;
                }
@@ -257,9 +251,14 @@ static char *print_trace(int detail, int port, char *interface, char *caller, ch
                                SPRINT(buffer, "           ");
                        SCAT(trace_string, buffer);
                        if (trace.element[i].sub[0])
-                               SPRINT(buffer, " : %s%s = %s\n", trace.element[i].sub, spaces[strlen(trace.element[i].sub)], value);
+                               SPRINT(buffer, " : %s%s = ", trace.element[i].sub, spaces[strlen(trace.element[i].sub)], value);
+                       else
+                               SPRINT(buffer, " :              ", value);
+                       SCAT(trace_string, buffer);
+                       if (strchr(value, ' '))
+                               SPRINT(buffer, "'%s'\n", value);
                        else
-                               SPRINT(buffer, " :              %s\n", value);
+                               SPRINT(buffer, "%s\n", value);
                        SCAT(trace_string, buffer);
                        i++;
                }