Use proper e-mail address format everywhere.
[doldaconnect.git] / daemon / main.c
index 1670c5e..3737270 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Dolda Connect - Modular multiuser Direct Connect-style client
- *  Copyright (C) 2004 Fredrik Tolf (fredrik@dolda2000.com)
+ *  Copyright (C) 2004 Fredrik Tolf <fredrik@dolda2000.com>
  *  
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
 #include "sysevents.h"
 #include "auth.h"
 
+#ifdef HAVE_KEYUTILS
+#include <keyutils.h>
+#endif
+
 struct module *modchain = NULL;
 static struct timer *timers = NULL;
 static struct child *children = NULL;
@@ -300,9 +304,13 @@ pid_t forksess(uid_t user, struct authhandle *auth, void (*ccbfunc)(pid_t, int,
                close(i);
            }
        }
-       setpgrp();
+       setpgid(0, 0);
        signal(SIGHUP, SIG_IGN);
        errno = 0;
+#ifdef HAVE_KEYUTILS
+       keyctl_join_session_keyring(NULL);
+       keyctl_chown(KEY_SPEC_SESSION_KEYRING, pwent->pw_uid, pwent->pw_gid);
+#endif
        if((authopensess(auth)) != AUTH_SUCCESS)
        {
            flog(LOG_WARNING, "could not open session for user %s: %s", pwent->pw_name, (errno == 0)?"Unknown error - should be logged above":strerror(errno));
@@ -371,13 +379,14 @@ 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;
+    now = ntime();
+    immsyslog = nofork = 0;
     syslogfac = LOG_DAEMON;
     configfile = NULL;
     pidfile = NULL;
@@ -425,8 +434,7 @@ int main(int argc, char **argv)
            nofork = 1;
            break;
        case 's':
-           logtosyslog = 1;
-           logtostderr = 0;
+           immsyslog = 1;
            break;
        case 'h':
        case ':':
@@ -438,6 +446,11 @@ int main(int argc, char **argv)
     }
     setlocale(LC_ALL, "");
     initlog();
+    if(immsyslog)
+    {
+       logtosyslog = 1;
+       logtostderr = 0;
+    }
     signal(SIGPIPE, SIG_IGN);
     signal(SIGHUP, handler);
     signal(SIGINT, handler);
@@ -448,7 +461,7 @@ int main(int argc, char **argv)
     preinit(0);
     if(configfile == NULL)
     {
-       if((configfile = findconfigfile()) == NULL)
+       if((configfile = findfile("doldacond.conf", NULL, 0)) == NULL)
        {
            flog(LOG_CRIT, "could not find a configuration file");
            exit(1);
@@ -482,6 +495,7 @@ int main(int argc, char **argv)
        fprintf(pfstream, "%i\n", getpid());
        fclose(pfstream);
     }
+    flog(LOG_INFO, "startup took %f seconds", ntime() - now);
     running = 1;
     reinit = 0;
     while(running)
@@ -523,20 +537,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)
@@ -558,5 +575,7 @@ int main(int argc, char **argv)
     }
     flog(LOG_INFO, "terminating...");
     terminate();
+    if(pidfile != NULL)
+       unlink(pidfile);
     return(0);
 }