X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Fmain.c;h=58d1c6c21721e3088c5838808ad652d8390ac142;hb=refs%2Fheads%2Fjava;hp=1c19101a2108d177f7e95ba3e050752d4e5dcc28;hpb=5cccc2d5af152f67e5bb77b41403f74403926235;p=doldaconnect.git diff --git a/daemon/main.c b/daemon/main.c index 1c19101..58d1c6c 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -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 * * 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 @@ -30,6 +30,7 @@ #include #include #include +#include #ifdef HAVE_CONFIG_H #include @@ -43,6 +44,10 @@ #include "sysevents.h" #include "auth.h" +#ifdef HAVE_KEYUTILS +#include +#endif + struct module *modchain = NULL; static struct timer *timers = NULL; static struct child *children = NULL; @@ -300,9 +305,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)); @@ -332,12 +341,12 @@ pid_t forksess(uid_t user, struct authhandle *auth, void (*ccbfunc)(pid_t, int, flog(LOG_WARNING, "could not setuid: %s", strerror(errno)); exit(127); } + putenv(sprintf2("HOME=%s", pwent->pw_dir)); + putenv(sprintf2("SHELL=%s", pwent->pw_shell)); + putenv(sprintf2("PATH=%s/bin:/usr/local/bin:/bin:/usr/bin", pwent->pw_dir)); } - putenv(sprintf2("HOME=%s", pwent->pw_dir)); - putenv(sprintf2("SHELL=%s", pwent->pw_shell)); putenv(sprintf2("USER=%s", pwent->pw_name)); putenv(sprintf2("LOGNAME=%s", pwent->pw_name)); - putenv(sprintf2("PATH=%s/bin:/usr/local/bin:/bin:/usr/bin", pwent->pw_dir)); chdir(pwent->pw_dir); return(0); } @@ -373,15 +382,16 @@ int main(int argc, char **argv) FILE *pfstream, *confstream; int delay, immsyslog; struct module *mod; - struct timer *timer, *ntimer; + struct timer *timer; struct child *child; double now; + now = ntime(); immsyslog = nofork = 0; syslogfac = LOG_DAEMON; configfile = NULL; pidfile = NULL; - while((c = getopt(argc, argv, "p:C:f:hns")) != -1) + while((c = getopt(argc, argv, "p:C:f:hnsV")) != -1) { switch(c) { @@ -427,11 +437,14 @@ int main(int argc, char **argv) case 's': immsyslog = 1; break; + case 'V': + printf("%s", RELEASEINFO); + exit(0); case 'h': case ':': case '?': default: - printf("usage: doldacond [-hns] [-C configfile] [-p pidfile] [-f facility]\n"); + printf("usage: doldacond [-hnsV] [-C configfile] [-p pidfile] [-f facility]\n"); exit(c != 'h'); } } @@ -452,7 +465,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); @@ -486,6 +499,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) @@ -527,20 +541,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) @@ -562,5 +579,7 @@ int main(int argc, char **argv) } flog(LOG_INFO, "terminating..."); terminate(); + if(pidfile != NULL) + unlink(pidfile); return(0); }