/*
* 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;
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));
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);
}
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;
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);
fprintf(pfstream, "%i\n", getpid());
fclose(pfstream);
}
+ flog(LOG_INFO, "startup took %f seconds", ntime() - now);
running = 1;
reinit = 0;
while(running)
}
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)