X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=blobdiff_plain;f=main.c;h=1e85e39ddb0bebc88eb057f7bb023e8166a608aa;hp=1aa2d8b232a12b569cac53e41fdef9b6e531bc02;hb=034d3a91404addedc1c7a3494862c79532b0b878;hpb=34598a346419f0e661526e6208dade4aff570008 diff --git a/main.c b/main.c index 1aa2d8b..1e85e39 100644 --- a/main.c +++ b/main.c @@ -10,12 +10,10 @@ \*****************************************************************************/ #include "main.h" -#include "config.h" -#ifdef WITH_GSM_MS -extern "C" { -#include -} +#ifdef PACKAGE_VERSION +#undef PACKAGE_VERSION #endif +#include "config.h" //MESSAGES @@ -55,7 +53,7 @@ int last_debug = 0; int debug_newline = 1; int nooutput = 0; -void debug(const char *function, int line, const char *prefix, char *buffer) +void debug(const char *file, const char *function, int line, const char *prefix, char *buffer) { time_t now; struct tm *now_tm; @@ -75,7 +73,7 @@ void debug(const char *function, int line, const char *prefix, char *buffer) if (debug_newline) printf("\033[32m%06d %s\033[37m%s", debug_count%1000000, prefix?prefix:"", prefix?" ":""); if (function) - printf("(in %s() line %d): %s", function, line, buffer); + printf("(in %s/%s() line %d): %s", file, function, line, buffer); else printf("%s", buffer); } @@ -86,6 +84,7 @@ void debug(const char *function, int line, const char *prefix, char *buffer) fprintf(debug_fp, "%s%s(in %s() line %d): %s", prefix?prefix:"", prefix?" ":"", function, line, buffer); else fprintf(debug_fp, "%s%s: %s", prefix?prefix:"", prefix?" ":"", buffer); + fflush(debug_fp); } } @@ -96,7 +95,7 @@ void debug(const char *function, int line, const char *prefix, char *buffer) } -void _printdebug(const char *function, int line, unsigned int mask, const char *fmt, ...) +void _printdebug(const char *file, const char *function, int line, unsigned int mask, const char *fmt, ...) { char buffer[4096]; va_list args; @@ -110,12 +109,12 @@ void _printdebug(const char *function, int line, unsigned int mask, const char * buffer[sizeof(buffer)-1]=0; va_end(args); - debug(function, line, "DEBUG", buffer); + debug(file, function, line, "DEBUG", buffer); pthread_mutex_unlock(&mutexd); } -void _printerror(const char *function, int line, const char *fmt, ...) +void _printerror(const char *file, const char *function, int line, const char *fmt, ...) { char buffer[4096]; va_list args; @@ -128,7 +127,7 @@ void _printerror(const char *function, int line, const char *fmt, ...) va_end(args); if (options.deb) - debug(function, line, "ERROR", buffer); + debug(file, function, line, "ERROR", buffer); else { /* only if we do not debug */ if (function) fprintf(stderr, "ERROR (in %s() line %d) %s", function, line, buffer); @@ -143,9 +142,6 @@ void _printerror(const char *function, int line, const char *fmt, ...) void sighandler(int sigset) { struct sched_param schedp; -#ifdef WITH_GSM_MS - int wait_ms = 0; -#endif if (sigset == SIGHUP) return; @@ -153,13 +149,11 @@ void sighandler(int sigset) return; fprintf(stderr, "LCR: Signal received: %d\n", sigset); PDEBUG(DEBUG_LOG, "Signal received: %d\n", sigset); -#ifdef WITH_GSM_MS - if (!wait_ms) { - wait_ms = 1; - dispatch_signal(SS_GLOBAL, S_GLOBAL_SHUTDOWN, NULL); - return; - } -#endif + /* reset signals */ + signal(SIGINT,SIG_DFL); + signal(SIGHUP,SIG_DFL); + signal(SIGTERM,SIG_DFL); + signal(SIGPIPE,SIG_DFL); if (!quit) { quit = sigset; /* set scheduler & priority */ @@ -177,7 +171,7 @@ void sighandler(int sigset) */ int main(int argc, char *argv[]) { -#if defined WITH_GSM_BS || defined WITH_GSM_MS +#if 0 double now_d, last_d; int all_idle; #endif @@ -187,8 +181,10 @@ int main(int argc, char *argv[]) int i; struct sched_param schedp; int created_mutexd = 0,/* created_mutext = 0,*/ created_mutexe = 0, - created_lock = 0, created_signal = 0, created_debug = 0, - created_misdn = 0; + created_lock = 0, created_signal = 0, created_message = 0; +#ifdef WITH_MISDN + int created_misdn = 0; +#endif char tracetext[256], lock[128]; char options_error[256]; @@ -220,8 +216,16 @@ int main(int argc, char *argv[]) goto free; } +#ifdef WITH_CRYPT /* init crc */ crc_init(); +#endif + +#ifdef WITH_VOOTP + /* init VoOTP */ + vootp_init(stderr); + vootp_loglevel(VOOTP_LOGL_INFO); +#endif /* the mutex init */ if (pthread_mutex_init(&mutexd, NULL)) { @@ -259,7 +263,7 @@ int main(int argc, char *argv[]) /* query available isdn ports */ if (!(strcasecmp(argv[1],"query"))) { - int rc; + int __attribute__((__unused__)) rc; fprintf(stderr, "-> Using 'misdn_info'\n"); rc = system("misdn_info"); ret = 0; @@ -272,11 +276,12 @@ int main(int argc, char *argv[]) goto free; } +#ifdef WITH_MISDN /* init mISDN */ if (mISDN_initialize() < 0) goto free; created_misdn = 1; - created_debug = 1; +#endif /* read ruleset(s) */ if (!(ruleset_first = ruleset_parse())) @@ -331,11 +336,13 @@ int main(int argc, char *argv[]) nooutput = 1; /* write pid file */ - pidfile = fopen("/var/run/lcr.pid","w"); + SPRINT(lock, "%s/lcr.pid", options.lock); + pidfile = fopen(lock,"w"); if (pidfile) { fprintf(pidfile, "%d\n", getpid()); fclose(pidfile); - } + } else + fprintf(stderr, "Failed to create PID file: %s\n", lock); } else /* if not start */ if (!!strcasecmp(argv[1],"start")) { @@ -366,6 +373,11 @@ int main(int argc, char *argv[]) /* generate alaw / ulaw tables */ generate_tables(options.law); +#ifdef WITH_SIP + /* init SIP globals */ + sip_init(); +#endif + #ifdef WITH_SS5 /* init ss5 sine tables */ ss5_sine_generate(); @@ -380,24 +392,22 @@ int main(int argc, char *argv[]) #if defined WITH_GSM_BS || defined WITH_GSM_MS /* init gsm */ - if (options.gsm && gsm_init()) { + if (gsm_init()) { fprintf(stderr, "GSM initialization failed.\n"); goto free; } -#else - if (options.gsm) { - fprintf(stderr, "GSM is enabled, but not compiled. Use --with-gsm-bs or --with-gsm-ms while configure!\n"); - goto free; - } #endif +#if 0 +init is done when interface is up #ifdef WITH_GSM_BS - if (options.gsm && gsm_bs_init()) { + if (gsm_bs_init()) { fprintf(stderr, "GSM BS initialization failed.\n"); goto free; } #endif +#endif #ifdef WITH_GSM_MS - if (options.gsm && gsm_ms_init()) { + if (gsm_ms_init()) { fprintf(stderr, "GSM MS initialization failed.\n"); goto free; } @@ -457,6 +467,7 @@ int main(int argc, char *argv[]) /* init message */ init_message(); + created_message = 1; /*** main loop ***/ SPRINT(tracetext, "%s %s started, waiting for calls...", NAME, VERSION_STRING); @@ -464,11 +475,11 @@ int main(int argc, char *argv[]) printf("%s\n", tracetext); end_trace(); quit = 0; -#if defined WITH_GSM_BS || defined WITH_GSM_MS +#if 0 GET_NOW(); #endif while(!quit) { -#if defined WITH_GSM_BS || defined WITH_GSM_MS +#if 0 last_d = now_d; GET_NOW(); if (now_d-last_d > 1.0) { @@ -480,23 +491,23 @@ int main(int argc, char *argv[]) /* must be processed after all queues, so they are empty */ if (select_main(1, NULL, NULL, NULL)) all_idle = 0; - /* handle gsm */ - if (options.gsm) { - if (handle_gsm()) - all_idle = 0; -#ifdef WITH_GSM_MS - if (handle_gsm_ms(&quit)) - all_idle = 0; -#endif - } if (all_idle) { usleep(10000); } #else - if (options.polling) - if (!select_main(1, NULL, NULL, NULL)) +#ifdef WITH_SIP + if (options.polling || any_sip_interface) { +#else + if (options.polling) { +#endif + if (!select_main(1, NULL, NULL, NULL)) { +#ifdef WITH_SIP + /* FIXME: check if work was done */ + sip_handle(); +#endif usleep(10000); - else + } + } else select_main(0, NULL, NULL, NULL); #endif } @@ -510,9 +521,6 @@ int main(int argc, char *argv[]) end_trace(); ret=0; - /* clean messacleane */ - cleanup_message(); - /* free all */ free: @@ -532,7 +540,6 @@ free: } /* destroy objects */ - while(port_first) { debug_count++; delete port_first; @@ -550,8 +557,10 @@ free: free_interfaces(interface_first); interface_first = NULL; +#ifdef WITH_MISDN /* close isdn ports */ mISDNport_close_all(); +#endif /* flush messages */ debug_count++; @@ -564,6 +573,10 @@ free: PDEBUG(DEBUG_MSG, "freed %d pending messages\n", i); } + /* clean messages */ + if (created_message) + cleanup_message(); + /* free tones */ if (toneset_first) free_tones(); @@ -575,8 +588,10 @@ free: if (created_lock) flock(lockfd, LOCK_UN); if (lockfd >= 0) { - chmod(lock, 0700); - unlink(lock); + if (created_lock) { + chmod(lock, 0700); + unlink(lock); + } close(lockfd); } @@ -596,26 +611,30 @@ free: if (pthread_mutex_destroy(&mutexd)) fprintf(stderr, "cannot destroy 'PDEBUG' mutex\n"); +#ifdef WITH_MISDN /* deinitialize mISDN */ if (created_misdn) mISDN_deinitialize(); +#endif /* free gsm */ - if (options.gsm) { +#if 0 +exit is done when interface is down #ifdef WITH_GSM_BS - gsm_bs_exit(0); + gsm_bs_exit(0); +#endif #endif #ifdef WITH_GSM_MS - gsm_ms_exit(0); + gsm_ms_exit(0); #endif #if defined WITH_GSM_BS || defined WITH_GSM_MS - gsm_exit(0); + gsm_exit(0); #endif - } - /* close loopback, if used by GSM or remote */ - if (mISDNloop.sock > -1) - mISDNloop_close(); +#ifdef WITH_SIP + /* cleanup SIP globals */ + sip_exit(); +#endif /* display memory leak */ #define MEMCHECK(a, b) \