X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=blobdiff_plain;f=main.c;h=1aa2d8b232a12b569cac53e41fdef9b6e531bc02;hp=b70ed0597da7475065f37c98dcfaef6fbcdb71d7;hb=34598a346419f0e661526e6208dade4aff570008;hpb=b0bd74e35e935aa976b68c594def4e8d2c22ef95 diff --git a/main.c b/main.c index b70ed05..1aa2d8b 100644 --- a/main.c +++ b/main.c @@ -10,6 +10,12 @@ \*****************************************************************************/ #include "main.h" +#include "config.h" +#ifdef WITH_GSM_MS +extern "C" { +#include +} +#endif //MESSAGES @@ -22,7 +28,7 @@ struct timezone now_tz; } FILE *debug_fp = NULL; -int quit=0; +int quit = 0; #if 0 struct lcr_fdset lcr_fdset[FD_SETSIZE]; @@ -137,11 +143,23 @@ 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; if (sigset == SIGPIPE) 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 if (!quit) { quit = sigset; /* set scheduler & priority */ @@ -150,8 +168,6 @@ void sighandler(int sigset) schedp.sched_priority = 0; sched_setscheduler(0, SCHED_OTHER, &schedp); } - fprintf(stderr, "LCR: Signal received: %d\n", sigset); - PDEBUG(DEBUG_LOG, "Signal received: %d\n", sigset); } } @@ -161,7 +177,7 @@ void sighandler(int sigset) */ int main(int argc, char *argv[]) { -#ifdef WITH_GSM +#if defined WITH_GSM_BS || defined WITH_GSM_MS double now_d, last_d; int all_idle; #endif @@ -174,6 +190,7 @@ int main(int argc, char *argv[]) created_lock = 0, created_signal = 0, created_debug = 0, created_misdn = 0; char tracetext[256], lock[128]; + char options_error[256]; #if 0 /* init fdset */ @@ -242,14 +259,15 @@ int main(int argc, char *argv[]) /* query available isdn ports */ if (!(strcasecmp(argv[1],"query"))) { + int rc; fprintf(stderr, "-> Using 'misdn_info'\n"); - system("misdn_info"); + rc = system("misdn_info"); ret = 0; goto free; } /* read options */ - if (read_options() == 0) { + if (read_options(options_error) == 0) { PERROR("%s", options_error); goto free; } @@ -360,15 +378,27 @@ int main(int argc, char *argv[]) goto free; } -#ifdef WITH_GSM - /* handle gsm */ +#if defined WITH_GSM_BS || defined WITH_GSM_MS + /* init gsm */ if (options.gsm && 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 while configure!\n"); + fprintf(stderr, "GSM is enabled, but not compiled. Use --with-gsm-bs or --with-gsm-ms while configure!\n"); + goto free; + } +#endif +#ifdef WITH_GSM_BS + if (options.gsm && gsm_bs_init()) { + fprintf(stderr, "GSM BS initialization failed.\n"); + goto free; + } +#endif +#ifdef WITH_GSM_MS + if (options.gsm && gsm_ms_init()) { + fprintf(stderr, "GSM MS initialization failed.\n"); goto free; } #endif @@ -434,11 +464,11 @@ int main(int argc, char *argv[]) printf("%s\n", tracetext); end_trace(); quit = 0; -#ifdef WITH_GSM +#if defined WITH_GSM_BS || defined WITH_GSM_MS GET_NOW(); #endif while(!quit) { -#ifdef WITH_GSM +#if defined WITH_GSM_BS || defined WITH_GSM_MS last_d = now_d; GET_NOW(); if (now_d-last_d > 1.0) { @@ -451,21 +481,32 @@ int main(int argc, char *argv[]) if (select_main(1, NULL, NULL, NULL)) all_idle = 0; /* handle gsm */ - if (options.gsm) - while(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 - select_main(0, NULL, NULL, NULL); + if (options.polling) + if (!select_main(1, NULL, NULL, NULL)) + usleep(10000); + else + select_main(0, NULL, NULL, NULL); #endif } SPRINT(tracetext, "%s terminated", NAME); printf("%s\n", tracetext); start_trace(-1, NULL, NULL, NULL, 0, 0, 0, tracetext); - if (quit) + if (quit > 0) add_trace((char *)"signal", NULL, "%d", quit); + if (quit < 0) + add_trace((char *)"errno", NULL, "%d", quit); end_trace(); ret=0; @@ -559,11 +600,22 @@ free: if (created_misdn) mISDN_deinitialize(); -#ifdef WITH_GSM /* free gsm */ - if (options.gsm) + if (options.gsm) { +#ifdef WITH_GSM_BS + gsm_bs_exit(0); +#endif +#ifdef WITH_GSM_MS + gsm_ms_exit(0); +#endif +#if defined WITH_GSM_BS || defined WITH_GSM_MS gsm_exit(0); #endif + } + + /* close loopback, if used by GSM or remote */ + if (mISDNloop.sock > -1) + mISDNloop_close(); /* display memory leak */ #define MEMCHECK(a, b) \