mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-20 23:00:56 -05:00
Review changes.
git-svn-id: file:///svn/unbound/trunk@209 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
parent
41463a62ae
commit
0bbc6205ee
5 changed files with 55 additions and 42 deletions
|
|
@ -118,8 +118,9 @@ daemon_init()
|
||||||
signal_handling_record();
|
signal_handling_record();
|
||||||
checklock_start();
|
checklock_start();
|
||||||
daemon->need_to_exit = 0;
|
daemon->need_to_exit = 0;
|
||||||
daemon->msg_cache = slabhash_create(4, HASH_DEFAULT_STARTARRAY,
|
daemon->msg_cache = slabhash_create(HASH_DEFAULT_SLABS,
|
||||||
HASH_DEFAULT_MAXMEM, msgreply_sizefunc, query_info_compare,
|
HASH_DEFAULT_STARTARRAY, HASH_DEFAULT_MAXMEM,
|
||||||
|
msgreply_sizefunc, query_info_compare,
|
||||||
query_entry_delete, reply_info_delete, NULL);
|
query_entry_delete, reply_info_delete, NULL);
|
||||||
if(!daemon->msg_cache) {
|
if(!daemon->msg_cache) {
|
||||||
free(daemon);
|
free(daemon);
|
||||||
|
|
@ -157,7 +158,7 @@ daemon_create_workers(struct daemon* daemon)
|
||||||
sizeof(struct worker*));
|
sizeof(struct worker*));
|
||||||
for(i=0; i<daemon->num; i++) {
|
for(i=0; i<daemon->num; i++) {
|
||||||
if(!(daemon->workers[i] = worker_create(daemon, i)))
|
if(!(daemon->workers[i] = worker_create(daemon, i)))
|
||||||
fatal_exit("malloc failure");
|
fatal_exit("could not create worker");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -191,7 +192,6 @@ static void*
|
||||||
thread_start(void* arg)
|
thread_start(void* arg)
|
||||||
{
|
{
|
||||||
struct worker* worker = (struct worker*)arg;
|
struct worker* worker = (struct worker*)arg;
|
||||||
int num = worker->thread_num;
|
|
||||||
log_thread_set(&worker->thread_num);
|
log_thread_set(&worker->thread_num);
|
||||||
ub_thread_blocksigs();
|
ub_thread_blocksigs();
|
||||||
#if !defined(HAVE_PTHREAD) && !defined(HAVE_SOLARIS_THREADS)
|
#if !defined(HAVE_PTHREAD) && !defined(HAVE_SOLARIS_THREADS)
|
||||||
|
|
@ -199,10 +199,10 @@ thread_start(void* arg)
|
||||||
close(worker->cmd_send_fd);
|
close(worker->cmd_send_fd);
|
||||||
worker->cmd_send_fd = -1;
|
worker->cmd_send_fd = -1;
|
||||||
close_other_pipes(worker->daemon, worker->thread_num);
|
close_other_pipes(worker->daemon, worker->thread_num);
|
||||||
#endif /* no threads */
|
#endif
|
||||||
if(!worker_init(worker, worker->daemon->cfg, worker->daemon->ports,
|
if(!worker_init(worker, worker->daemon->cfg, worker->daemon->ports,
|
||||||
BUFSZ, 0))
|
BUFSZ, 0))
|
||||||
fatal_exit("Could not initialize thread #%d", num);
|
fatal_exit("Could not initialize thread");
|
||||||
|
|
||||||
worker_work(worker);
|
worker_work(worker);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@ static void usage()
|
||||||
static void
|
static void
|
||||||
apply_dir(struct daemon* daemon, struct config_file* cfg, int cmdline_verbose)
|
apply_dir(struct daemon* daemon, struct config_file* cfg, int cmdline_verbose)
|
||||||
{
|
{
|
||||||
/* apply changes if they have changed */
|
/* apply if they have changed */
|
||||||
daemon->cfg = cfg;
|
daemon->cfg = cfg;
|
||||||
verbosity = cmdline_verbose + cfg->verbosity;
|
verbosity = cmdline_verbose + cfg->verbosity;
|
||||||
if(cfg->directory && cfg->directory[0]) {
|
if(cfg->directory && cfg->directory[0]) {
|
||||||
|
|
@ -79,7 +79,7 @@ apply_dir(struct daemon* daemon, struct config_file* cfg, int cmdline_verbose)
|
||||||
}
|
}
|
||||||
free(daemon->cwd);
|
free(daemon->cwd);
|
||||||
if(!(daemon->cwd = strdup(cfg->directory)))
|
if(!(daemon->cwd = strdup(cfg->directory)))
|
||||||
fatal_exit("malloc failed");
|
log_err("cwd: malloc failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(cfg->msg_cache_size != slabhash_get_size(daemon->msg_cache) ||
|
if(cfg->msg_cache_size != slabhash_get_size(daemon->msg_cache) ||
|
||||||
|
|
@ -106,10 +106,16 @@ readpid (const char* file)
|
||||||
ssize_t l;
|
ssize_t l;
|
||||||
|
|
||||||
if ((fd = open(file, O_RDONLY)) == -1) {
|
if ((fd = open(file, O_RDONLY)) == -1) {
|
||||||
|
if(errno != ENOENT)
|
||||||
|
log_err("Could not read pidfile %s: %s",
|
||||||
|
file, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((l = read(fd, pidbuf, sizeof(pidbuf)))) == -1) {
|
if (((l = read(fd, pidbuf, sizeof(pidbuf)))) == -1) {
|
||||||
|
if(errno != ENOENT)
|
||||||
|
log_err("Could not read pidfile %s: %s",
|
||||||
|
file, strerror(errno));
|
||||||
close(fd);
|
close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
@ -118,7 +124,6 @@ readpid (const char* file)
|
||||||
|
|
||||||
/* Empty pidfile means no pidfile... */
|
/* Empty pidfile means no pidfile... */
|
||||||
if (l == 0) {
|
if (l == 0) {
|
||||||
errno = ENOENT;
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -156,13 +161,8 @@ static void
|
||||||
checkoldpid(struct config_file* cfg)
|
checkoldpid(struct config_file* cfg)
|
||||||
{
|
{
|
||||||
pid_t old;
|
pid_t old;
|
||||||
if((old = readpid(cfg->pidfile)) == -1) {
|
if((old = readpid(cfg->pidfile)) != -1) {
|
||||||
if(errno != ENOENT) {
|
/* see if it is still alive */
|
||||||
log_err("Could not read pidfile %s: %s",
|
|
||||||
cfg->pidfile, strerror(errno));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/** see if it is still alive */
|
|
||||||
if(kill(old, 0) == 0 || errno == EPERM)
|
if(kill(old, 0) == 0 || errno == EPERM)
|
||||||
log_warn("unbound is already running as pid %u.",
|
log_warn("unbound is already running as pid %u.",
|
||||||
(unsigned)old);
|
(unsigned)old);
|
||||||
|
|
@ -171,6 +171,34 @@ checkoldpid(struct config_file* cfg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** detach from command line */
|
||||||
|
static void
|
||||||
|
detach(struct config_file* cfg)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
/* Take off... */
|
||||||
|
switch (fork()) {
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
unlink(cfg->pidfile);
|
||||||
|
fatal_exit("fork failed: %s", strerror(errno));
|
||||||
|
default:
|
||||||
|
/* exit interactive session */
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
/* detach */
|
||||||
|
if(setsid() == -1)
|
||||||
|
fatal_exit("setsid() failed: %s", strerror(errno));
|
||||||
|
if ((fd = open("/dev/null", O_RDWR, 0)) != -1) {
|
||||||
|
(void)dup2(fd, STDIN_FILENO);
|
||||||
|
(void)dup2(fd, STDOUT_FILENO);
|
||||||
|
(void)dup2(fd, STDERR_FILENO);
|
||||||
|
if (fd > 2)
|
||||||
|
(void)close(fd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** daemonize, drop user priviliges and chroot if needed */
|
/** daemonize, drop user priviliges and chroot if needed */
|
||||||
static void
|
static void
|
||||||
do_chroot(struct daemon* daemon, struct config_file* cfg, int debug_mode)
|
do_chroot(struct daemon* daemon, struct config_file* cfg, int debug_mode)
|
||||||
|
|
@ -199,32 +227,12 @@ do_chroot(struct daemon* daemon, struct config_file* cfg, int debug_mode)
|
||||||
/* init logfile just before fork */
|
/* init logfile just before fork */
|
||||||
log_init(cfg->logfile);
|
log_init(cfg->logfile);
|
||||||
if(!debug_mode && cfg->do_daemonize) {
|
if(!debug_mode && cfg->do_daemonize) {
|
||||||
int fd;
|
detach(cfg);
|
||||||
/* Take off... */
|
|
||||||
switch (fork()) {
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
case -1:
|
|
||||||
unlink(cfg->pidfile);
|
|
||||||
fatal_exit("fork failed: %s", strerror(errno));
|
|
||||||
default:
|
|
||||||
/* exit interactive session */
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
/* detach */
|
|
||||||
if(setsid() == -1)
|
|
||||||
fatal_exit("setsid() failed: %s", strerror(errno));
|
|
||||||
if ((fd = open("/dev/null", O_RDWR, 0)) != -1) {
|
|
||||||
(void)dup2(fd, STDIN_FILENO);
|
|
||||||
(void)dup2(fd, STDOUT_FILENO);
|
|
||||||
(void)dup2(fd, STDERR_FILENO);
|
|
||||||
if (fd > 2)
|
|
||||||
(void)close(fd);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(cfg->pidfile && cfg->pidfile[0]) {
|
if(cfg->pidfile && cfg->pidfile[0]) {
|
||||||
writepid(cfg->pidfile, getpid());
|
writepid(cfg->pidfile, getpid());
|
||||||
daemon->pidfile = strdup(cfg->pidfile);
|
if(!(daemon->pidfile = strdup(cfg->pidfile)))
|
||||||
|
log_err("pidf: malloc failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -235,7 +243,8 @@ do_chroot(struct daemon* daemon, struct config_file* cfg, int debug_mode)
|
||||||
* These increase verbosity as specified in the config file.
|
* These increase verbosity as specified in the config file.
|
||||||
* @param debug_mode: if set, do not daemonize.
|
* @param debug_mode: if set, do not daemonize.
|
||||||
*/
|
*/
|
||||||
static void run_daemon(const char* cfgfile, int cmdline_verbose, int debug_mode)
|
static void
|
||||||
|
run_daemon(const char* cfgfile, int cmdline_verbose, int debug_mode)
|
||||||
{
|
{
|
||||||
struct config_file* cfg = NULL;
|
struct config_file* cfg = NULL;
|
||||||
struct daemon* daemon = NULL;
|
struct daemon* daemon = NULL;
|
||||||
|
|
|
||||||
|
|
@ -76,12 +76,12 @@ struct work_query {
|
||||||
struct query_info qinfo;
|
struct query_info qinfo;
|
||||||
/** hash value of the query qinfo */
|
/** hash value of the query qinfo */
|
||||||
hashvalue_t query_hash;
|
hashvalue_t query_hash;
|
||||||
|
/** next query in all-list */
|
||||||
|
struct work_query* all_next;
|
||||||
/** id of query, in network byteorder. */
|
/** id of query, in network byteorder. */
|
||||||
uint16_t query_id;
|
uint16_t query_id;
|
||||||
/** flags uint16 from query */
|
/** flags uint16 from query */
|
||||||
uint16_t query_flags;
|
uint16_t query_flags;
|
||||||
/** next query in all-list */
|
|
||||||
struct work_query* all_next;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
This avoids a copy of the data.
|
This avoids a copy of the data.
|
||||||
- do not do useless byteswap on query id. Store reply flags in uint16
|
- do not do useless byteswap on query id. Store reply flags in uint16
|
||||||
for easier access (and no repeated byteswapping).
|
for easier access (and no repeated byteswapping).
|
||||||
|
- reviewed code.
|
||||||
|
|
||||||
28 March 2007: Wouter
|
28 March 2007: Wouter
|
||||||
- new config option: num-queries-per-thread.
|
- new config option: num-queries-per-thread.
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,9 @@
|
||||||
#define UTIL_STORAGE_SLABHASH_H
|
#define UTIL_STORAGE_SLABHASH_H
|
||||||
#include "util/storage/lruhash.h"
|
#include "util/storage/lruhash.h"
|
||||||
|
|
||||||
|
/** default number of slabs */
|
||||||
|
#define HASH_DEFAULT_SLABS 4
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hash table formed from several smaller ones.
|
* Hash table formed from several smaller ones.
|
||||||
* This results in a partitioned lruhash table.
|
* This results in a partitioned lruhash table.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue