alpha phase is open, this means:
[lcr.git] / main.c
diff --git a/main.c b/main.c
index 19d2c8d..599a911 100644 (file)
--- a/main.c
+++ b/main.c
@@ -46,7 +46,7 @@ int global_debug = 0;
 int quit=0;
 
 pthread_mutex_t mutexd; // debug output mutex
-pthread_mutex_t mutexl; // log output mutex
+//pthread_mutex_t mutext; // trace output mutex
 pthread_mutex_t mutexe; // error output mutex
 
 int memuse = 0;
@@ -66,7 +66,7 @@ int last_debug = 0;
 int debug_newline = 1;
 int nooutput = 0;
 
-static void debug(const char *function, int line, char *prefix, char *buffer)
+void debug(const char *function, int line, char *prefix, char *buffer)
 {
        /* if we have a new debug count, we add a mark */
        if (last_debug != debug_count)
@@ -105,35 +105,6 @@ static void debug(const char *function, int line, char *prefix, char *buffer)
                        debug_newline = 1;
 }
 
-void printlog(const char *fmt, ...)
-{
-       char buffer[4096];
-       va_list args;
-       FILE *fp;
-
-       pthread_mutex_lock(&mutexl);
-
-       va_start(args,fmt);
-       VUNPRINT(buffer,sizeof(buffer)-1,fmt,args);
-       buffer[sizeof(buffer)-1]=0;
-       va_end(args);
-
-       if (options.log[0])
-       {
-               if (options.deb & DEBUG_LOG)
-                       debug(NULL, 0, "LOG ->", buffer);
-
-               if ((fp = fopen(options.log, "a")))
-               {
-                       fduse++;
-                       fprintf(fp, "%04d.%02d.%02d %02d:%02d:%02d %s", now_tm->tm_year+1900, now_tm->tm_mon+1, now_tm->tm_mday, now_tm->tm_hour, now_tm->tm_min, now_tm->tm_sec, buffer);
-                       fclose(fp);
-                       fduse--;
-               }
-       }
-
-       pthread_mutex_unlock(&mutexl);
-}
 
 void _printdebug(const char *function, int line, unsigned long mask, const char *fmt, ...)
 {
@@ -198,7 +169,7 @@ void sighandler(int sigset)
                        schedp.sched_priority = 0;
                        sched_setscheduler(0, SCHED_OTHER, &schedp);
                }
-               fprintf(stderr, "PBX: Signal received: %d\n", sigset);
+               fprintf(stderr, "LCR: Signal received: %d\n", sigset);
                PERROR("Signal received: %d\n", sigset);
        }
 }
@@ -207,38 +178,29 @@ void sighandler(int sigset)
 /*
  * the main
  */
-#ifdef VOIP
-#define ARGC (args.GetCount()+1)
-#define ARGV(a) (args[a-1])
-void PBXMain::Main(void)
-{
-       PArgList &args = GetArguments();
-#else
-#define ARGC (argc)
-#define ARGV(a) (argv[a])
 int main(int argc, char *argv[])
 {
-#endif
        int                     ret = -1;
        int                     lockfd = -1; /* file lock */
        struct message          *message;
        class Port              *port;
        class Endpoint          *epoint;
-       class Call              *call;
+       class Join              *join;
        int                     i;
        int                     all_idle;
        char                    prefix_string[64];
        struct sched_param      schedp;
        char                    *debug_prefix = "alloc";
-       int                     created_mutexd = 0, created_mutexl = 0, created_mutexe = 0,
+       int                     created_mutexd = 0,/* created_mutext = 0,*/ created_mutexe = 0,
                                created_lock = 0, created_signal = 0, created_debug = 0;
 #ifdef DEBUG_DURATION
        time_t                  durationupdate;
-       double                  idle_duration, isdn_duration, port_duration, epoint_duration, call_duration, message_duration, admin_duration;
+       double                  idle_duration, isdn_duration, port_duration, epoint_duration, join_duration, message_duration, admin_duration;
        double                  start_d;
 #endif
        int                     idletime = 0, idlecheck = 0;
        char                    debug_log[128];
+       char                    tracetext[256];
 
        /* current time */
        GET_NOW();
@@ -247,20 +209,20 @@ int main(int argc, char *argv[])
        printf("\n** %s  Version %s\n\n", NAME, VERSION_STRING);
 
        /* show options */
-       if (ARGC <= 1)
+       if (argc <= 1)
        {
                usage:
                printf("\n");
-               printf("Usage: pbx (query | start | fork | rules | route)\n");
+               printf("Usage: lcr (query | start | fork | rules | route)\n");
                printf("query     = Show available isdn ports.\n");
-               printf("start     = Run pbx normally, abort with CTRL+C.\n");
+               printf("start     = Run lcr normally, abort with CTRL+C.\n");
                printf("fork      = Do daemon fork and run as background process.\n");
                printf("interface = Get help of available interface syntax.\n");
                printf("rules     = Get help of available routing rule syntax.\n");
                printf("rules [action] = Get individual help for given action.\n");
 //             printf("route = Show current routing as it is parsed.\n");
                printf("\n");
-               ret = 0;
+               ret = 999;
                goto free;
        }
 
@@ -281,12 +243,12 @@ int main(int argc, char *argv[])
                goto free;
        }
        created_mutexd = 1;
-       if (pthread_mutex_init(&mutexl, NULL))
-       {
-               fprintf(stderr, "cannot create 'printlog' mutex\n");
-               goto free;
-       }
-       created_mutexl = 1;
+//     if (pthread_mutex_init(&mutext, NULL))
+//     {
+//             fprintf(stderr, "cannot create 'trace' mutex\n");
+//             goto free;
+//     }
+//     created_mutext = 1;
        if (pthread_mutex_init(&mutexe, NULL))
        {
                fprintf(stderr, "cannot create 'PERROR' mutex\n");
@@ -295,7 +257,7 @@ int main(int argc, char *argv[])
        created_mutexe = 1;
 
        /* show interface */
-       if (!(strcasecmp(ARGV(1),"interface")))
+       if (!(strcasecmp(argv[1],"interface")))
        {
                doc_interface();
                ret = 0;
@@ -303,18 +265,18 @@ int main(int argc, char *argv[])
        }
 
        /* show rules */
-       if (!(strcasecmp(ARGV(1),"rules")))
+       if (!(strcasecmp(argv[1],"rules")))
        {
-               if (ARGC <= 2)
+               if (argc <= 2)
                        doc_rules(NULL);
                else
-                       doc_rules(ARGV(2));
+                       doc_rules(argv[2]);
                ret = 0;
                goto free;
        }
 
        /* query available isdn ports */
-       if (!(strcasecmp(ARGV(1),"query")))
+       if (!(strcasecmp(argv[1],"query")))
        {
                mISDN_port_info();
                ret = 0;
@@ -356,7 +318,7 @@ int main(int argc, char *argv[])
 
 #if 0
        /* query available isdn ports */
-       if (!(strcasecmp(ARGV(1),"route")))
+       if (!(strcasecmp(argv[1],"route")))
        {
                ruleset_debug(ruleset_first);
                ret = 0;
@@ -365,7 +327,7 @@ int main(int argc, char *argv[])
 #endif
 
        /* do fork in special cases */
-       if (!(strcasecmp(ARGV(1),"fork")))
+       if (!(strcasecmp(argv[1],"fork")))
        {
                pid_t pid;
 
@@ -394,27 +356,27 @@ int main(int argc, char *argv[])
                }
                if (pid != 0)
                {
-                       printf("PBX: Starting daemon.\n");
+                       printf("LCR: Starting daemon.\n");
                        exit(0);
                }
                nooutput = 1;
        } else
        /* if not start */
-       if (!!strcasecmp(ARGV(1),"start"))
+       if (!!strcasecmp(argv[1],"start"))
        {
                goto usage;
        }
 
        /* create lock and lock! */
-       if ((lockfd = open("/var/run/pbx.lock", O_CREAT, 0)) < 0)
+       if ((lockfd = open("/var/run/lcr.lock", O_CREAT, 0)) < 0)
        {
-               fprintf(stderr, "Cannot create lock file: /var/run/pbx.lock\n");
+               fprintf(stderr, "Cannot create lock file: /var/run/lcr.lock\n");
                goto free;
        }
        if (flock(lockfd, LOCK_EX|LOCK_NB) < 0)
        {
                if (errno == EWOULDBLOCK)
-                       fprintf(stderr, "PBX: Another PBX process is running. Please kill the other one.\n");
+                       fprintf(stderr, "LCR: Another LCR process is running. Please kill the other one.\n");
                else    fprintf(stderr, "Locking process failed: errno=%d\n", errno);
                goto free;
        }
@@ -446,7 +408,6 @@ int main(int argc, char *argv[])
        }
        relink_interfaces();
        interface_first = interface_newlist;
-       free_interfaces(interface_newlist);
        interface_newlist = NULL;
        
        /* locking memory paging */
@@ -498,8 +459,10 @@ int main(int argc, char *argv[])
        created_signal = 1;
 
        /*** main loop ***/
-       printf("%s %s started, waiting for calls...\n", NAME, VERSION_STRING);
-       printlog("%s %s started, waiting for calls...\n", NAME, VERSION_STRING);
+       SPRINT(tracetext, "%s %s started, waiting for calls...", NAME, VERSION_STRING);
+       start_trace(0, NULL, NULL, NULL, 0, 0, 0, tracetext);
+       printf("%s\n", tracetext);
+       end_trace();
        GET_NOW();
 #ifdef DEBUG_DURATION
        start_d = now_d;
@@ -564,23 +527,23 @@ BUDETECT
                start_d = now_d;
 #endif
 
-               /* loop through all calls and call their handler */
-               call_again:
-               call = call_first;
-               while(call)
+               /* loop through all joins and call their handler */
+               join_again:
+               join = join_first;
+               while(join)
                {
-                       debug_prefix = "call";
+                       debug_prefix = "join";
                        debug_count++;
-                       ret = call->handler();
+                       ret = join->handler();
                        if (ret)
                                all_idle = 0;
-                       if (ret < 0) /* call has been destroyed */
-                               goto call_again;
-                       call = call->next;
+                       if (ret < 0) /* join has been destroyed */
+                               goto join_again;
+                       join = join->next;
                }
 #ifdef DEBUG_DURATION
                GET_NOW();
-               call_duration += (now_d - start_d);
+               join_duration += (now_d - start_d);
                start_d = now_d;
 #endif
 
@@ -612,33 +575,33 @@ BUDETECT
                                }
                                break;
 
-                               case EPOINT_TO_CALL:
-                               debug_prefix = "msg epoint->call";
-                               call = find_call_id(message->id_to);
-                               if (call)
+                               case EPOINT_TO_JOIN:
+                               debug_prefix = "msg epoint->join";
+                               join = find_join_id(message->id_to);
+                               if (join)
                                {
-                                       call->message_epoint(message->id_from, message->type, &message->param);
+                                       join->message_epoint(message->id_from, message->type, &message->param);
                                } else
                                {
-                                       PDEBUG(DEBUG_MSG, "Warning: message %s from endpoint %d to call %d. call doesn't exist anymore\n", messages_txt[message->type], message->id_from, message->id_to);
+                                       PDEBUG(DEBUG_MSG, "Warning: message %s from endpoint %d to join %d. join doesn't exist anymore\n", messages_txt[message->type], message->id_from, message->id_to);
                                }
                                break;
 
-                               case CALL_TO_EPOINT:
-                               debug_prefix = "msg call->epoint";
+                               case JOIN_TO_EPOINT:
+                               debug_prefix = "msg join->epoint";
                                epoint = find_epoint_id(message->id_to);
                                if (epoint)
                                {
                                        if (epoint->ep_app)
                                        {
-                                               epoint->ep_app->ea_message_call(message->id_from, message->type, &message->param);
+                                               epoint->ep_app->ea_message_join(message->id_from, message->type, &message->param);
                                        } else
                                        {
-                                               PDEBUG(DEBUG_MSG, "Warning: message %s from call %d to endpoint %d. endpoint doesn't have an application.\n", messages_txt[message->type], message->id_from, message->id_to);
+                                               PDEBUG(DEBUG_MSG, "Warning: message %s from join %d to endpoint %d. endpoint doesn't have an application.\n", messages_txt[message->type], message->id_from, message->id_to);
                                        }
                                } else
                                {
-                                       PDEBUG(DEBUG_MSG, "Warning: message %s from call %d to endpoint %d. endpoint doesn't exist anymore.\n", messages_txt[message->type], message->id_from, message->id_to);
+                                       PDEBUG(DEBUG_MSG, "Warning: message %s from join %d to endpoint %d. endpoint doesn't exist anymore.\n", messages_txt[message->type], message->id_from, message->id_to);
                                }
                                break;
 
@@ -702,15 +665,15 @@ BUDETECT
                if (durationupdate != now)
                {
                        durationupdate = now;
-                       printf("Idle:%3d ISDN:%3d Port:%3d Epoint:%3d Call:%3d Message:%3d Admin:%3d\n",
+                       printf("Idle:%3d ISDN:%3d Port:%3d Epoint:%3d Join:%3d Message:%3d Admin:%3d\n",
                                (int)(idle_duration*100),
                                (int)(isdn_duration*100),
                                (int)(port_duration*100),
                                (int)(epoint_duration*100),
-                               (int)(call_duration*100),
+                               (int)(join_duration*100),
                                (int)(message_duration*100),
                                (int)(admin_duration*100));
-                       idle_duration = isdn_duration = port_duration = epoint_duration = call_duration = message_duration = admin_duration = 0;
+                       idle_duration = isdn_duration = port_duration = epoint_duration = join_duration = message_duration = admin_duration = 0;
                }
 #else
                GET_NOW();
@@ -723,7 +686,12 @@ BUDETECT
                        idletime += 4000;
                }
        }
-       printlog("PBX terminated\n");
+       SPRINT(tracetext, "%s terminated", NAME);
+       printf("%s\n", tracetext);
+       start_trace(0, NULL, NULL, NULL, 0, 0, 0, tracetext);
+       if (ret)
+               add_trace("error", NULL, "%d", ret);
+       end_trace();
        ret=0;
 
        /* free all */
@@ -762,7 +730,7 @@ free:
        }
        epoint_first = NULL;
        debug_count++;
-       call_free();
+       join_free();
 
        /* free interfaces */
        if (interface_first)
@@ -807,9 +775,9 @@ free:
        if (created_mutexe)
                if (pthread_mutex_destroy(&mutexe))
                        fprintf(stderr, "cannot destroy 'PERROR' mutex\n");
-       if (created_mutexl)
-               if (pthread_mutex_destroy(&mutexl))
-                       fprintf(stderr, "cannot destroy 'printlog' mutex\n");
+//     if (created_mutext)
+//             if (pthread_mutex_destroy(&mutext))
+//                     fprintf(stderr, "cannot destroy 'trace' mutex\n");
        if (created_mutexd)
                if (pthread_mutex_destroy(&mutexd))
                        fprintf(stderr, "cannot destroy 'PDEBUG' mutex\n");
@@ -823,15 +791,19 @@ free:
 #define MEMCHECK(a, b) \
        if (b) \
        { \
+               SPRINT(tracetext, a, NAME); \
+               start_trace(0, NULL, NULL, NULL, 0, 0, 0, tracetext); \
+               if (ret) add_trace("blocks", NULL, "%d", b); \
+               end_trace(); \
                printf("\n******************************\n\007"); \
                printf("\nERROR: %d %s\n", b, a); \
                printf("\n******************************\n"); \
                ret = -1; \
        }
        MEMCHECK("",memuse)
-       MEMCHECK("memory block(s) left (port.cpp)",pmemuse)
-       MEMCHECK("memory block(s) left (epoint.cpp)",ememuse)
-       MEMCHECK("memory block(s) left (call.cpp)",cmemuse)
+       MEMCHECK("memory block(s) left (port.cpp ...)",pmemuse)
+       MEMCHECK("memory block(s) left (epoint*.cpp ...)",ememuse)
+       MEMCHECK("memory block(s) left (join*.cpp)",cmemuse)
        MEMCHECK("memory block(s) left (message.c)",mmemuse)
        MEMCHECK("memory block(s) left (route.c)",rmemuse)
        MEMCHECK("memory block(s) left (args)",amemuse)
@@ -840,13 +812,7 @@ free:
        MEMCHECK("file handler(s) left",fhuse)
 
        /* take me out */
-       if (ret)
-               printf("PBX: Exit (code %d)\n", ret);
-#ifdef VOIP
-       return;
-#else
        return(ret);
-#endif
 }