Data-Over-Voice
[lcr.git] / main.c
diff --git a/main.c b/main.c
index b425abe..1e85e39 100644 (file)
--- a/main.c
+++ b/main.c
 \*****************************************************************************/ 
 
 #include "main.h"
+#ifdef PACKAGE_VERSION
+#undef PACKAGE_VERSION
+#endif
+#include "config.h"
 
 //MESSAGES
 
@@ -22,7 +26,7 @@ struct timezone now_tz;
        }
 
 FILE *debug_fp = NULL;
-int quit=0;
+int quit = 0;
 
 #if 0
 struct lcr_fdset lcr_fdset[FD_SETSIZE];
@@ -49,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;
@@ -69,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);
        }
@@ -80,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);
                }
        }
 
@@ -90,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;
@@ -104,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;
@@ -122,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);
@@ -142,6 +147,13 @@ void sighandler(int sigset)
                return;
        if (sigset == SIGPIPE)
                return;
+       fprintf(stderr, "LCR: Signal received: %d\n", sigset);
+       PDEBUG(DEBUG_LOG, "Signal received: %d\n", sigset);
+       /* 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 */
@@ -150,8 +162,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 +171,7 @@ void sighandler(int sigset)
  */
 int main(int argc, char *argv[])
 {
-#ifdef WITH_GSM
+#if 0
        double                  now_d, last_d;
        int                     all_idle;
 #endif
@@ -171,9 +181,12 @@ 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];
 
 #if 0
        /* init fdset */
@@ -203,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)) {
@@ -242,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;
@@ -250,16 +271,17 @@ int main(int argc, char *argv[])
        }
 
        /* read options */
-       if (read_options() == 0) {
+       if (read_options(options_error) == 0) {
                PERROR("%s", options_error);
                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()))
@@ -314,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")) {
@@ -349,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();
@@ -361,15 +390,25 @@ int main(int argc, char *argv[])
                goto free;
        }
 
-#ifdef WITH_GSM
-       /* handle gsm */
-       if (options.gsm && gsm_init()) {
+#if defined WITH_GSM_BS || defined WITH_GSM_MS
+       /* init gsm */
+       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 while configure!\n");
+#endif
+#if 0
+init is done when interface is up
+#ifdef WITH_GSM_BS
+       if (gsm_bs_init()) {
+               fprintf(stderr, "GSM BS initialization failed.\n");
+               goto free;
+       }
+#endif
+#endif
+#ifdef WITH_GSM_MS
+       if (gsm_ms_init()) {
+               fprintf(stderr, "GSM MS initialization failed.\n");
                goto free;
        }
 #endif
@@ -428,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);
@@ -435,11 +475,11 @@ int main(int argc, char *argv[])
        printf("%s\n", tracetext);
        end_trace();
        quit = 0;
-#ifdef WITH_GSM
+#if 0
        GET_NOW();
 #endif
        while(!quit) {
-#ifdef WITH_GSM
+#if 0
                last_d = now_d;
                GET_NOW();
                if (now_d-last_d > 1.0) {
@@ -451,28 +491,36 @@ 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)
-                       while(handle_gsm())
-                               all_idle = 0;
                if (all_idle) {
                        usleep(10000);
                }
 #else
-               select_main(0, 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
+                       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;
 
-       /* clean messacleane */
-       cleanup_message();
-
        /* free all */
 free:
 
@@ -492,7 +540,6 @@ free:
        }
 
        /* destroy objects */
-
        while(port_first) {
                debug_count++;
                delete port_first;
@@ -510,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++;
@@ -524,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();
@@ -535,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);
        }
 
@@ -556,14 +611,29 @@ free:
                if (pthread_mutex_destroy(&mutexd))
                        fprintf(stderr, "cannot destroy 'PDEBUG' mutex\n");
 
+#ifdef WITH_MISDN
        /* deinitialize mISDN */
        if (created_misdn)
                mISDN_deinitialize();
+#endif
 
-#ifdef WITH_GSM
        /* free gsm */
-       if (options.gsm)
-               gsm_exit(0);
+#if 0
+exit is done when interface is down
+#ifdef WITH_GSM_BS
+       gsm_bs_exit(0);
+#endif
+#endif
+#ifdef WITH_GSM_MS
+       gsm_ms_exit(0);
+#endif
+#if defined WITH_GSM_BS || defined WITH_GSM_MS
+       gsm_exit(0);
+#endif
+
+#ifdef WITH_SIP
+       /* cleanup SIP globals */
+       sip_exit();
 #endif
 
        /* display memory leak */