LCR now runs as a user.
[lcr.git] / main.c
diff --git a/main.c b/main.c
index 38c710a..59343ae 100644 (file)
--- a/main.c
+++ b/main.c
@@ -9,21 +9,6 @@
 **                                                                           **
 \*****************************************************************************/ 
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <signal.h>
-#include <stdarg.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <sys/file.h>
-#include <errno.h>
-#include <sys/mman.h>
-#include <sys/resource.h>
 #include "main.h"
 
 MESSAGES
@@ -41,7 +26,7 @@ struct timezone now_tz;
                now_tm = localtime(&now); \
        }
 
-int global_debug = 0;
+FILE *debug_fp = NULL;
 int quit=0;
 
 #if 0
@@ -49,8 +34,9 @@ struct lcr_fdset lcr_fdset[FD_SETSIZE];
 #endif
 
 pthread_mutex_t mutexd; // debug output mutex
-//pthread_mutex_t mutext; // trace output mutex
+pthread_mutex_t mutext; // trace output mutex
 pthread_mutex_t mutexe; // error output mutex
+//pthread_mutex_t mutex_lcr; // lcr process mutex
 
 int memuse = 0;
 int mmemuse = 0;
@@ -82,8 +68,8 @@ void debug(const char *function, int line, char *prefix, char *buffer)
                last_debug = debug_count;
                if (!nooutput)
                        printf("\033[34m--------------------- %04d.%02d.%02d %02d:%02d:%02d %06d\033[36m\n", 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, debug_count%1000000);
-               if (options.deb&DEBUG_LOG && global_debug)
-                       dprint(DBGM_MAN, 0, "--------------------- %04d.%02d.%02d %02d:%02d:%02d %06d\n", 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, debug_count%1000000);
+               if (debug_fp)
+                       fprintf(debug_fp, "--------------------- %04d.%02d.%02d %02d:%02d:%02d %06d\n", 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, debug_count%1000000);
        }
 
        if (!nooutput)
@@ -96,14 +82,14 @@ void debug(const char *function, int line, char *prefix, char *buffer)
                        printf("%s", buffer);
        }
 
-       if (options.deb&DEBUG_LOG && global_debug)
+       if (debug_fp)
        {
                if (debug_newline)
                {
                        if (function)
-                               dprint(DBGM_MAN, 0, "%s%s(in %s() line %d): %s", prefix?prefix:"", prefix?" ":"", function, line, buffer);
+                               fprintf(debug_fp, "%s%s(in %s() line %d): %s", prefix?prefix:"", prefix?" ":"", function, line, buffer);
                        else
-                               dprint(DBGM_MAN, 0, "%s%s: %s", prefix?prefix:"", prefix?" ":"", buffer);
+                               fprintf(debug_fp, "%s%s: %s", prefix?prefix:"", prefix?" ":"", buffer);
                }
        }
 
@@ -114,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;
@@ -169,7 +155,7 @@ void sighandler(int sigset)
                return;
        if (!quit)
        {
-               quit=1;
+               quit = sigset;
                /* set scheduler & priority */
                if (options.schedule > 1)
                {
@@ -178,7 +164,7 @@ void sighandler(int sigset)
                        sched_setscheduler(0, SCHED_OTHER, &schedp);
                }
                fprintf(stderr, "LCR: Signal received: %d\n", sigset);
-               PERROR("Signal received: %d\n", sigset);
+               PDEBUG(DEBUG_LOG, "Signal received: %d\n", sigset);
        }
 }
 
@@ -190,7 +176,7 @@ int main(int argc, char *argv[])
 {
        int                     ret = -1;
        int                     lockfd = -1; /* file lock */
-       struct message          *message;
+       struct lcr_msg          *message;
        class Port              *port;
        class Endpoint          *epoint;
        class Join              *join;
@@ -200,15 +186,19 @@ int main(int argc, char *argv[])
        struct sched_param      schedp;
        char                    *debug_prefix = "alloc";
        int                     created_mutexd = 0,/* created_mutext = 0,*/ created_mutexe = 0,
-                               created_lock = 0, created_signal = 0, created_debug = 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 */
        memset(lcr_fdset, 0, sizeof(lcr_fdset));
 #endif
 
+       /* lock LCR process */
+//     pthread_mutex_lock(&mutex_lcr);
+
        /* current time */
        GET_NOW();
 
@@ -236,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))
        {
@@ -285,18 +268,23 @@ int main(int argc, char *argv[])
        /* query available isdn ports */
        if (!(strcasecmp(argv[1],"query")))
        {
-               mISDN_port_info();
+               fprintf(stderr, "-> Using 'isdninfo'\n");
+               system("isdninfo");
                ret = 0;
                goto free;
        }
 
        /* read options */
        if (read_options() == 0)
+       {
+               PERROR("%s", options_error);
                goto free;
+       }
 
        /* init mISDN */
        if (mISDN_initialize() < 0)
                goto free;
+       created_misdn = 1;
        created_debug = 1;
 
        /* read ruleset(s) */
@@ -364,9 +352,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)) < 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)
@@ -420,18 +410,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, exitting...\n");
                        break;
                        case EPERM:
-                       fprintf(stderr, "No permission to lock paging, exitting...\n");
+                       fprintf(stderr, "Warning: No permission to lock paging, exitting...\n");
                        break;
                        case EFAULT:
-                       fprintf(stderr, "'Bad address' while locking paging, exitting...\n");
+                       fprintf(stderr, "Warning: 'Bad address' while locking paging, exitting...\n");
                        break;
                        default:
-                       fprintf(stderr, "Unknown error %d while locking paging, exitting...\n", errno);
+                       fprintf(stderr, "Warning: Unknown error %d while locking paging, exitting...\n", errno);
                }
-               goto free;
        }
 
        /* set real time scheduler & priority */
@@ -463,6 +452,7 @@ int main(int argc, char *argv[])
        quit = 0;
        while(!quit)
        {
+
                last_d = now_d;
                GET_NOW();
                if (now_d-last_d > 1.0)
@@ -472,15 +462,15 @@ int main(int argc, char *argv[])
                /* all loops must be counted from the beginning since nodes might get freed during handler */
                all_idle = 1;
 
-#warning debugging usleep crash
-               debug_usleep(1, __FILE__, __LINE__, now_tm->tm_hour, now_tm->tm_min, now_tm->tm_sec);
+//#warning debugging usleep crash
+//             debug_usleep(1, __FILE__, __LINE__, now_tm->tm_hour, now_tm->tm_min, now_tm->tm_sec);
 
                /* handle mISDN messages from kernel */
                debug_prefix = "ISDN";
                if (mISDN_handler())
                        all_idle = 0;
-#warning debugging usleep crash
-               debug_usleep(1, __FILE__, __LINE__, now_tm->tm_hour, now_tm->tm_min, now_tm->tm_sec);
+//#warning debugging usleep crash
+//             debug_usleep(1, __FILE__, __LINE__, now_tm->tm_hour, now_tm->tm_min, now_tm->tm_sec);
 
 BUDETECT
 
@@ -623,8 +613,8 @@ BUDETECT
                        all_idle = 0;
                }
 #endif
-#warning debugging usleep crash
-               debug_usleep(1, __FILE__, __LINE__, now_tm->tm_hour, now_tm->tm_min, now_tm->tm_sec);
+//#warning debugging usleep crash
+//             debug_usleep(1, __FILE__, __LINE__, now_tm->tm_hour, now_tm->tm_min, now_tm->tm_sec);
 
                /* do idle checking */
                if (idlecheck != now)
@@ -637,15 +627,17 @@ BUDETECT
                /* did we do nothing? so we wait to give time to other processes */
                if (all_idle)
                {
+//                     pthread_mutex_unlock(&mutex_lcr); // unlock LCR
                        debug_usleep(4000, __FILE__, __LINE__, now_tm->tm_hour, now_tm->tm_min, now_tm->tm_sec);
+//                     pthread_mutex_lock(&mutex_lcr); // lock LCR
                        idletime += 4000;
                }
        }
        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);
+       if (quit)
+               add_trace("signal", NULL, "%d", quit);
        end_trace();
        ret=0;
 
@@ -658,7 +650,7 @@ free:
        if (options.schedule > 1)
        {
                memset(&schedp, 0, sizeof(schedp));
-               schedp.sched_priority = 0;
+               schedp.sched_priority = options.schedule;
                sched_setscheduler(0, SCHED_OTHER, &schedp);
        }
        /* reset signals */
@@ -719,7 +711,11 @@ free:
        if (created_lock)
                flock(lockfd, LOCK_UN);
        if (lockfd >= 0)
+       {
+               chmod(lock, 0700);
+               unlink(lock);
                close(lockfd);
+       }
 
        /* free rulesets */
        if (ruleset_first)
@@ -738,8 +734,8 @@ free:
                        fprintf(stderr, "cannot destroy 'PDEBUG' mutex\n");
 
        /* deinitialize mISDN */
-       mISDN_deinitialize();
-       global_debug = 0;
+       if (created_misdn)
+               mISDN_deinitialize();
 
        /* display memory leak */
 #define MEMCHECK(a, b) \
@@ -765,6 +761,9 @@ free:
        MEMCHECK("file descriptor(s) left",fduse)
        MEMCHECK("file handler(s) left",fhuse)
 
+       /* unlock LCR process */
+//     pthread_mutex_unlock(&mutex_lcr);
+
        /* take me out */
        return(ret);
 }