X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=blobdiff_plain;f=main.c;h=599a91120662e5a93a87cda3a7bc62817cd994dc;hp=9bf22e86b8593e3e371fe02d2d62e6129208390a;hb=5a22e57828617abc14e27814ee918cc63b96fd46;hpb=7dc10dcae129d2ef7f40a455aba45179eb68d1d8 diff --git a/main.c b/main.c index 9bf22e8..599a911 100644 --- 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,36 +105,6 @@ static void debug(const char *function, int line, char *prefix, char *buffer) debug_newline = 1; } -muss ins trace -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, ...) { @@ -199,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); } } @@ -208,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(); @@ -248,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; } @@ -282,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"); @@ -296,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; @@ -304,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; @@ -357,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; @@ -366,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; @@ -395,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; } @@ -447,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 */ @@ -499,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; @@ -565,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 @@ -613,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; @@ -703,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(); @@ -724,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 */ @@ -763,7 +730,7 @@ free: } epoint_first = NULL; debug_count++; - call_free(); + join_free(); /* free interfaces */ if (interface_first) @@ -808,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"); @@ -824,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) @@ -841,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 }