diff --git a/CHANGES b/CHANGES index 47f5b8aed5..a3c1677880 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,10 @@ + 896. [bug] If a configuration file is set on named's command line + and it has a relative pathname, the current directory + (after any possible jailing resulting from named -t) + will be prepended to it so that reloading works + properly even when a directory option is present. + 895. [func] New function, isc_dir_current(), akin to POSIX's getcwd(). diff --git a/bin/named/main.c b/bin/named/main.c index be4c6171e8..ea07006c8c 100644 --- a/bin/named/main.c +++ b/bin/named/main.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: main.c,v 1.112 2001/05/31 10:37:08 tale Exp $ */ +/* $Id: main.c,v 1.113 2001/06/08 23:52:21 tale Exp $ */ #include @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -63,7 +64,8 @@ /* #include "xxdb.h" */ static isc_boolean_t want_stats = ISC_FALSE; -static char program_name[256] = "named"; +static char program_name[ISC_DIR_NAMEMAX] = "named"; +static char absolute_conffile[ISC_DIR_PATHMAX]; static char saved_command_line[512]; void @@ -356,6 +358,8 @@ parse_command_line(int argc, char *argv[]) { usage(); ns_main_earlyfatal("extra command line arguments"); } + + } static isc_result_t @@ -473,6 +477,28 @@ setup(void) { (void)isc_resource_getlimit(isc_resource_openfiles, &ns_g_initopenfiles); + /* + * If the named configuration filename is relative, prepend the current + * directory's name before possibly changing to another directory. + */ + if (! isc_file_isabsolute(ns_g_conffile)) { + result = isc_dir_current(absolute_conffile, + sizeof(absolute_conffile), ISC_TRUE); + if (result != ISC_R_SUCCESS) + ns_main_earlyfatal("getting current directory failed: " + "%s", isc_result_totext(result)); + + if (strlen(absolute_conffile) + strlen(ns_g_conffile) + 1 > + sizeof(absolute_conffile)) + ns_main_earlyfatal("configuration filename too long: " + "%s%s", absolute_conffile, + ns_g_conffile); + + strcat(absolute_conffile, ns_g_conffile); + + ns_g_conffile = absolute_conffile; + } + result = create_managers(); if (result != ISC_R_SUCCESS) ns_main_earlyfatal("create_managers() failed: %s",