ntpaths.c revision 285612
1139743Simp/*
239213Sgibbs * Copyright (C) 2004, 2007, 2009  Internet Systems Consortium, Inc. ("ISC")
339213Sgibbs * Copyright (C) 2001  Internet Software Consortium.
439213Sgibbs *
539213Sgibbs * Permission to use, copy, modify, and/or distribute this software for any
639213Sgibbs * purpose with or without fee is hereby granted, provided that the above
739213Sgibbs * copyright notice and this permission notice appear in all copies.
839213Sgibbs *
939213Sgibbs * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
1039213Sgibbs * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
1139213Sgibbs * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
1239213Sgibbs * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
1339213Sgibbs * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
1439213Sgibbs * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
1539213Sgibbs * PERFORMANCE OF THIS SOFTWARE.
1639213Sgibbs */
1750477Speter
1839213Sgibbs/* $Id: ntpaths.c,v 1.15 2009/07/14 22:54:57 each Exp $ */
1939213Sgibbs
2039213Sgibbs/*
2139213Sgibbs * This module fetches the required path information that is specific
2239213Sgibbs * to NT systems which can have its configuration and system files
2339213Sgibbs * almost anywhere. It can be used to override whatever the application
2439213Sgibbs * had previously assigned to the pointer. Basic information about the
2539213Sgibbs * file locations are stored in the registry.
2639213Sgibbs */
2739213Sgibbs
2839213Sgibbs#include <config.h>
2955205Speter#include <isc/bind_registry.h>
3039213Sgibbs#include <isc/ntpaths.h>
3147413Sgibbs
3247413Sgibbs/*
3347413Sgibbs * Module Variables
34102862Sbrooks */
3555205Speter
3647413Sgibbsstatic char systemDir[MAX_PATH];
3747413Sgibbsstatic char namedBase[MAX_PATH];
3839213Sgibbsstatic char ns_confFile[MAX_PATH];
3939213Sgibbsstatic char lwresd_confFile[MAX_PATH];
4039213Sgibbsstatic char lwresd_resolvconfFile[MAX_PATH];
4139213Sgibbsstatic char rndc_confFile[MAX_PATH];
4239213Sgibbsstatic char ns_defaultpidfile[MAX_PATH];
4339213Sgibbsstatic char lwresd_defaultpidfile[MAX_PATH];
4439213Sgibbsstatic char local_state_dir[MAX_PATH];
4539213Sgibbsstatic char sys_conf_dir[MAX_PATH];
4639213Sgibbsstatic char rndc_keyFile[MAX_PATH];
4739213Sgibbsstatic char session_keyFile[MAX_PATH];
4839213Sgibbs
4939213Sgibbsstatic DWORD baseLen = MAX_PATH;
5039213Sgibbsstatic BOOL Initialized = FALSE;
5139213Sgibbs
5239213Sgibbsvoid
5339213Sgibbsisc_ntpaths_init() {
5439213Sgibbs	HKEY hKey;
5539213Sgibbs	BOOL keyFound = TRUE;
5639213Sgibbs
5739213Sgibbs	memset(namedBase, 0, MAX_PATH);
5863171Smjacob	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, BIND_SUBKEY, 0, KEY_READ, &hKey)
5963171Smjacob		!= ERROR_SUCCESS)
6063171Smjacob		keyFound = FALSE;
6139213Sgibbs
6239213Sgibbs	if (keyFound == TRUE) {
6339213Sgibbs		/* Get the named directory */
6439213Sgibbs		if (RegQueryValueEx(hKey, "InstallDir", NULL, NULL,
6539213Sgibbs			(LPBYTE)namedBase, &baseLen) != ERROR_SUCCESS)
6639213Sgibbs			keyFound = FALSE;
6739213Sgibbs		RegCloseKey(hKey);
6839213Sgibbs	}
6939213Sgibbs
7039213Sgibbs	GetSystemDirectory(systemDir, MAX_PATH);
7139213Sgibbs
7239213Sgibbs	if (keyFound == FALSE)
7339213Sgibbs		/* Use the System Directory as a default */
7439213Sgibbs		strcpy(namedBase, systemDir);
7539213Sgibbs
7674840Sken	strcpy(ns_confFile, namedBase);
7774840Sken	strcat(ns_confFile, "\\etc\\named.conf");
7839213Sgibbs
7939213Sgibbs	strcpy(lwresd_confFile, namedBase);
8039213Sgibbs	strcat(lwresd_confFile, "\\etc\\lwresd.conf");
8139213Sgibbs
8239213Sgibbs	strcpy(lwresd_resolvconfFile, systemDir);
8339213Sgibbs	strcat(lwresd_resolvconfFile, "\\Drivers\\etc\\resolv.conf");
8439213Sgibbs
8539213Sgibbs	strcpy(rndc_keyFile, namedBase);
8639213Sgibbs	strcat(rndc_keyFile, "\\etc\\rndc.key");
8774840Sken
8874840Sken	strcpy(session_keyFile, namedBase);
8974840Sken	strcat(session_keyFile, "\\etc\\session.key");
9074840Sken
9139213Sgibbs	strcpy(rndc_confFile, namedBase);
9239213Sgibbs	strcat(rndc_confFile, "\\etc\\rndc.conf");
9339213Sgibbs	strcpy(ns_defaultpidfile, namedBase);
9439213Sgibbs	strcat(ns_defaultpidfile, "\\etc\\named.pid");
9539213Sgibbs
9639213Sgibbs	strcpy(lwresd_defaultpidfile, namedBase);
9739213Sgibbs	strcat(lwresd_defaultpidfile, "\\etc\\lwresd.pid");
9839213Sgibbs
9974840Sken	strcpy(local_state_dir, namedBase);
10074840Sken	strcat(local_state_dir, "\\bin");
10139213Sgibbs
10274840Sken	strcpy(sys_conf_dir, namedBase);
10374840Sken	strcat(sys_conf_dir, "\\etc");
10439213Sgibbs
10574840Sken	Initialized = TRUE;
10674840Sken}
10739213Sgibbs
10839213Sgibbschar *
10939213Sgibbsisc_ntpaths_get(int ind) {
11039213Sgibbs	if (!Initialized)
11139213Sgibbs		isc_ntpaths_init();
11239213Sgibbs
11339213Sgibbs	switch (ind) {
11439213Sgibbs	case NAMED_CONF_PATH:
11539213Sgibbs		return (ns_confFile);
11639213Sgibbs		break;
11739213Sgibbs	case LWRES_CONF_PATH:
11839213Sgibbs		return (lwresd_confFile);
11939213Sgibbs		break;
12039213Sgibbs	case RESOLV_CONF_PATH:
12139213Sgibbs		return (lwresd_resolvconfFile);
12239213Sgibbs		break;
12339213Sgibbs	case RNDC_CONF_PATH:
12439213Sgibbs		return (rndc_confFile);
12539213Sgibbs		break;
12639213Sgibbs	case NAMED_PID_PATH:
12739213Sgibbs		return (ns_defaultpidfile);
12839213Sgibbs		break;
12939213Sgibbs	case LWRESD_PID_PATH:
13039213Sgibbs		return (lwresd_defaultpidfile);
13139213Sgibbs		break;
13239213Sgibbs	case LOCAL_STATE_DIR:
13339213Sgibbs		return (local_state_dir);
13439213Sgibbs		break;
13539213Sgibbs	case SYS_CONF_DIR:
13639213Sgibbs		return (sys_conf_dir);
13739213Sgibbs		break;
13839213Sgibbs	case RNDC_KEY_PATH:
13939213Sgibbs		return (rndc_keyFile);
14039213Sgibbs		break;
14139213Sgibbs	case SESSION_KEY_PATH:
14239213Sgibbs		return (session_keyFile);
14339213Sgibbs		break;
14439213Sgibbs	default:
14539213Sgibbs		return (NULL);
14639213Sgibbs	}
14739213Sgibbs}
14839213Sgibbs