Added GSM IMSI dialing by using dialing "imsi-<number>".
[lcr.git] / main.c
diff --git a/main.c b/main.c
index 21b3384..522b214 100644 (file)
--- a/main.c
+++ b/main.c
@@ -49,18 +49,18 @@ int classuse = 0;
 int fduse = 0;
 int fhuse = 0;
 
-char *debug_prefix = 0;
+const char *debug_prefix = NULL;
 int debug_count = 0;
 int last_debug = 0;
 int debug_newline = 1;
 int nooutput = 0;
 
-void debug_usleep(int msec, char *file, int line, int hour, int min, int sec)
+void debug_usleep(int msec, const char *file, int line, int hour, int min, int sec)
 {
        usleep(msec);
 }
 
-void debug(const char *function, int line, char *prefix, char *buffer)
+void debug(const char *function, int line, const char *prefix, char *buffer)
 {
        /* if we have a new debug count, we add a mark */
        if (last_debug != debug_count)
@@ -100,7 +100,7 @@ void debug(const char *function, int line, char *prefix, char *buffer)
 }
 
 
-void _printdebug(const char *function, int line, unsigned long mask, const char *fmt, ...)
+void _printdebug(const char *function, int line, unsigned int mask, const char *fmt, ...)
 {
        char buffer[4096];
        va_list args;
@@ -184,12 +184,12 @@ int main(int argc, char *argv[])
        int                     all_idle;
        char                    prefix_string[64];
        struct sched_param      schedp;
-       char                    *debug_prefix = "alloc";
+       const char              *debug_prefix = "alloc";
        int                     created_mutexd = 0,/* created_mutext = 0,*/ created_mutexe = 0,
                                created_lock = 0, created_signal = 0, created_debug = 0,
                                created_misdn = 0;
        int                     idletime = 0, idlecheck = 0;
-       char                    tracetext[256];
+       char                    tracetext[256], lock[128];
 
 #if 0
        /* init fdset */
@@ -226,13 +226,6 @@ int main(int argc, char *argv[])
        /* init crc */
        crc_init();
 
-       /* check for root (real or effective) */
-       if (getuid() && geteuid())
-       {
-               fprintf(stderr, "Please run %s as super-user.\n", NAME);
-               goto free;
-       }
-
        /* the mutex init */
        if (pthread_mutex_init(&mutexd, NULL))
        {
@@ -275,14 +268,18 @@ int main(int argc, char *argv[])
        /* query available isdn ports */
        if (!(strcasecmp(argv[1],"query")))
        {
-               mISDN_port_info();
+               fprintf(stderr, "-> Using 'misdn_info'\n");
+               system("misdn_info");
                ret = 0;
                goto free;
        }
 
        /* read options */
        if (read_options() == 0)
+       {
+               PERROR("%s", options_error);
                goto free;
+       }
 
        /* init mISDN */
        if (mISDN_initialize() < 0)
@@ -317,6 +314,7 @@ int main(int argc, char *argv[])
        if (!(strcasecmp(argv[1],"fork")))
        {
                pid_t pid;
+               FILE *pidfile;
 
                /* do daemon fork */
                pid = fork();
@@ -347,6 +345,14 @@ int main(int argc, char *argv[])
                        exit(0);
                }
                nooutput = 1;
+
+               /* write pid file */
+               pidfile = fopen("/var/run/lcr.pid","w");
+               if (pidfile)
+               {
+                       fprintf(pidfile, "%d\n", getpid());
+                       fclose(pidfile);
+               }
        } else
        /* if not start */
        if (!!strcasecmp(argv[1],"start"))
@@ -355,9 +361,11 @@ int main(int argc, char *argv[])
        }
 
        /* create lock and lock! */
-       if ((lockfd = open("/var/run/lcr.lock", O_CREAT, 0)) < 0)
+       SPRINT(lock, "%s/lcr.lock", options.lock);
+       if ((lockfd = open(lock, O_CREAT | O_WRONLY, S_IWUSR)) < 0)
        {
-               fprintf(stderr, "Cannot create lock file: /var/run/lcr.lock\n");
+               fprintf(stderr, "Cannot create lock file: %s\n", lock);
+               fprintf(stderr, "Check options.conf to change to path with permissions for you.\n");
                goto free;
        }
        if (flock(lockfd, LOCK_EX|LOCK_NB) < 0)
@@ -386,6 +394,21 @@ int main(int argc, char *argv[])
                goto free;
        }
 
+#ifdef WITH_GSM
+       /* handle 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");
+               goto free;
+       }
+#endif
+
        /* read interfaces and open ports */
        if (!read_interfaces())
        {
@@ -411,18 +434,17 @@ int main(int argc, char *argv[])
                switch(errno)
                {
                        case ENOMEM:
-                       fprintf(stderr, "Not enough memory to lock paging, exitting...\n");
+                       fprintf(stderr, "Warning: Not enough memory to lock paging.\n");
                        break;
                        case EPERM:
-                       fprintf(stderr, "No permission to lock paging, exitting...\n");
+                       fprintf(stderr, "Warning: No permission to lock paging.\n");
                        break;
                        case EFAULT:
-                       fprintf(stderr, "'Bad address' while locking paging, exitting...\n");
+                       fprintf(stderr, "Warning: 'Bad address' while locking paging.\n");
                        break;
                        default:
-                       fprintf(stderr, "Unknown error %d while locking paging, exitting...\n", errno);
+                       fprintf(stderr, "Warning: Unknown error %d while locking paging.\n", errno);
                }
-               goto free;
        }
 
        /* set real time scheduler & priority */
@@ -447,7 +469,7 @@ int main(int argc, char *argv[])
 
        /*** main loop ***/
        SPRINT(tracetext, "%s %s started, waiting for calls...", NAME, VERSION_STRING);
-       start_trace(0, NULL, NULL, NULL, 0, 0, 0, tracetext);
+       start_trace(-1, NULL, NULL, NULL, 0, 0, 0, tracetext);
        printf("%s\n", tracetext);
        end_trace();
        GET_NOW();
@@ -607,6 +629,15 @@ BUDETECT
                        all_idle = 0;
 BUDETECT
 
+#ifdef WITH_GSM
+               /* handle gsm */
+               if (options.gsm)
+                       while(handle_gsm())
+                               all_idle = 0;
+#endif
+
+BUDETECT
+
 #if 0
                /* check for child to exit (eliminate zombies) */
                if (waitpid(-1, NULL, WNOHANG) > 0)
@@ -637,9 +668,9 @@ BUDETECT
        }
        SPRINT(tracetext, "%s terminated", NAME);
        printf("%s\n", tracetext);
-       start_trace(0, NULL, NULL, NULL, 0, 0, 0, tracetext);
+       start_trace(-1, NULL, NULL, NULL, 0, 0, 0, tracetext);
        if (quit)
-               add_trace("signal", NULL, "%d", quit);
+               add_trace((char *)"signal", NULL, "%d", quit);
        end_trace();
        ret=0;
 
@@ -713,7 +744,11 @@ free:
        if (created_lock)
                flock(lockfd, LOCK_UN);
        if (lockfd >= 0)
+       {
+               chmod(lock, 0700);
+               unlink(lock);
                close(lockfd);
+       }
 
        /* free rulesets */
        if (ruleset_first)
@@ -735,12 +770,18 @@ free:
        if (created_misdn)
                mISDN_deinitialize();
 
+#ifdef WITH_GSM
+       /* free gsm */
+       if (options.gsm)
+               gsm_exit(0);
+#endif
+
        /* display memory leak */
 #define MEMCHECK(a, b) \
        if (b) \
        { \
                SPRINT(tracetext, a, NAME); \
-               start_trace(0, NULL, NULL, NULL, 0, 0, 0, tracetext); \
+               start_trace(-1, NULL, NULL, NULL, 0, 0, 0, tracetext); \
                if (ret) add_trace("blocks", NULL, "%d", b); \
                end_trace(); \
                printf("\n******************************\n\007"); \
@@ -771,7 +812,7 @@ free:
 /* special debug function to detect buffer overflow
  */
 int budetect_stop = 0;
-void budetect(const char *file, int line, char *function)
+void budetect(const char *file, int line, const char *function)
 {
        if (budetect_stop)
                return;