Fix potential bug with freed timers.
[doldaconnect.git] / daemon / main.c
index 299fd0d..025c5a2 100644 (file)
@@ -371,17 +371,17 @@ int main(int argc, char **argv)
     char *configfile;
     char *pidfile;
     FILE *pfstream, *confstream;
-    int delay;
+    int delay, immsyslog;
     struct module *mod;
-    struct timer *timer, *ntimer;
+    struct timer *timer;
     struct child *child;
     double now;
     
-    nofork = 0;
+    immsyslog = nofork = 0;
     syslogfac = LOG_DAEMON;
     configfile = NULL;
     pidfile = NULL;
-    while((c = getopt(argc, argv, "p:C:f:hn")) != -1)
+    while((c = getopt(argc, argv, "p:C:f:hns")) != -1)
     {
        switch(c)
        {
@@ -424,16 +424,24 @@ int main(int argc, char **argv)
        case 'n':
            nofork = 1;
            break;
+       case 's':
+           immsyslog = 1;
+           break;
        case 'h':
        case ':':
        case '?':
        default:
-           printf("usage: doldacond [-hn] [-C configfile] [-p pidfile] [-f facility]\n");
+           printf("usage: doldacond [-hns] [-C configfile] [-p pidfile] [-f facility]\n");
            exit(c != 'h');
        }
     }
     setlocale(LC_ALL, "");
     initlog();
+    if(immsyslog)
+    {
+       logtosyslog = 1;
+       logtostderr = 0;
+    }
     signal(SIGPIPE, SIG_IGN);
     signal(SIGHUP, handler);
     signal(SIGINT, handler);
@@ -519,20 +527,23 @@ int main(int argc, char **argv)
        }
        pollsocks(delay);
        now = ntime();
-       for(timer = timers; timer != NULL; timer = ntimer)
+       do
        {
-           ntimer = timer->next;
-           if(now < timer->at)
-               continue;
-           if(timer->prev != NULL)
-               timer->prev->next = timer->next;
-           if(timer->next != NULL)
-               timer->next->prev = timer->prev;
-           if(timer == timers)
-               timers = timer->next;
-           timer->func(0, timer->data);
-           free(timer);
-       }
+           for(timer = timers; timer != NULL; timer = timer->next)
+           {
+               if(now < timer->at)
+                   continue;
+               if(timer->prev != NULL)
+                   timer->prev->next = timer->next;
+               if(timer->next != NULL)
+                   timer->next->prev = timer->prev;
+               if(timer == timers)
+                   timers = timer->next;
+               timer->func(0, timer->data);
+               free(timer);
+               break;
+           }
+       } while(timer != NULL);
        do
        {
            for(child = children; child != NULL; child = child->next)
@@ -554,5 +565,7 @@ int main(int argc, char **argv)
     }
     flog(LOG_INFO, "terminating...");
     terminate();
+    if(pidfile != NULL)
+       unlink(pidfile);
     return(0);
 }