summaryrefslogtreecommitdiffstats
path: root/lib/isc/win32/ntpaths.c
blob: 793b72a09763af7f6b20c421b2f0708e47391ad5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*
 * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
 *
 * SPDX-License-Identifier: MPL-2.0
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0.  If a copy of the MPL was not distributed with this
 * file, you can obtain one at https://mozilla.org/MPL/2.0/.
 *
 * See the COPYRIGHT file distributed with this work for additional
 * information regarding copyright ownership.
 */

/*
 * This module fetches the required path information that is specific
 * to NT systems which can have its configuration and system files
 * almost anywhere. It can be used to override whatever the application
 * had previously assigned to the pointer. Basic information about the
 * file locations are stored in the registry.
 */

#include <isc/bind_registry.h>
#include <isc/ntpaths.h>
#include <isc/string.h>

/*
 * Module Variables
 */

static char systemDir[MAX_PATH];
static char namedBase[MAX_PATH];
static char ns_confFile[MAX_PATH];
static char rndc_confFile[MAX_PATH];
static char ns_defaultpidfile[MAX_PATH];
static char ns_lockfile[MAX_PATH];
static char local_state_dir[MAX_PATH];
static char sys_conf_dir[MAX_PATH];
static char rndc_keyFile[MAX_PATH];
static char session_keyFile[MAX_PATH];
static char resolv_confFile[MAX_PATH];
static char bind_keysFile[MAX_PATH];

static DWORD baseLen = MAX_PATH;
static BOOL Initialized = FALSE;

void
isc_ntpaths_init(void) {
	HKEY hKey;
	BOOL keyFound = TRUE;

	memset(namedBase, 0, sizeof(namedBase));
	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, BIND_SUBKEY, 0, KEY_READ, &hKey) !=
	    ERROR_SUCCESS)
	{
		keyFound = FALSE;
	}

	if (keyFound == TRUE) {
		/* Get the named directory */
		if (RegQueryValueEx(hKey, "InstallDir", NULL, NULL,
				    (LPBYTE)namedBase,
				    &baseLen) != ERROR_SUCCESS)
		{
			keyFound = FALSE;
		}
		RegCloseKey(hKey);
	}

	GetSystemDirectory(systemDir, MAX_PATH);

	if (keyFound == FALSE) {
		/* Use the System Directory as a default */
		strlcpy(namedBase, systemDir, sizeof(namedBase));
	}

	strlcpy(ns_confFile, namedBase, sizeof(ns_confFile));
	strlcat(ns_confFile, "\\etc\\named.conf", sizeof(ns_confFile));

	strlcpy(rndc_keyFile, namedBase, sizeof(rndc_keyFile));
	strlcat(rndc_keyFile, "\\etc\\rndc.key", sizeof(rndc_keyFile));

	strlcpy(session_keyFile, namedBase, sizeof(session_keyFile));
	strlcat(session_keyFile, "\\etc\\session.key", sizeof(session_keyFile));

	strlcpy(rndc_confFile, namedBase, sizeof(rndc_confFile));
	strlcat(rndc_confFile, "\\etc\\rndc.conf", sizeof(rndc_confFile));

	strlcpy(ns_defaultpidfile, namedBase, sizeof(ns_defaultpidfile));
	strlcat(ns_defaultpidfile, "\\etc\\named.pid",
		sizeof(ns_defaultpidfile));

	strlcpy(ns_lockfile, namedBase, sizeof(ns_lockfile));
	strlcat(ns_lockfile, "\\etc\\named.lock", sizeof(ns_lockfile));

	strlcpy(local_state_dir, namedBase, sizeof(local_state_dir));
	strlcat(local_state_dir, "\\bin", sizeof(local_state_dir));

	strlcpy(sys_conf_dir, namedBase, sizeof(sys_conf_dir));
	strlcat(sys_conf_dir, "\\etc", sizeof(sys_conf_dir));

	/* Added to avoid an assert on NULL value */
	strlcpy(resolv_confFile, namedBase, sizeof(resolv_confFile));
	strlcat(resolv_confFile, "\\etc\\resolv.conf", sizeof(resolv_confFile));

	strlcpy(bind_keysFile, namedBase, sizeof(bind_keysFile));
	strlcat(bind_keysFile, "\\etc\\bind.keys", sizeof(bind_keysFile));

	Initialized = TRUE;
}

char *
isc_ntpaths_get(int ind) {
	if (!Initialized) {
		isc_ntpaths_init();
	}

	switch (ind) {
	case NAMED_CONF_PATH:
		return (ns_confFile);
		break;
	case RESOLV_CONF_PATH:
		return (resolv_confFile);
		break;
	case RNDC_CONF_PATH:
		return (rndc_confFile);
		break;
	case NAMED_PID_PATH:
		return (ns_defaultpidfile);
		break;
	case NAMED_LOCK_PATH:
		return (ns_lockfile);
		break;
	case LOCAL_STATE_DIR:
		return (local_state_dir);
		break;
	case SYS_CONF_DIR:
		return (sys_conf_dir);
		break;
	case RNDC_KEY_PATH:
		return (rndc_keyFile);
		break;
	case SESSION_KEY_PATH:
		return (session_keyFile);
		break;
	case BIND_KEYS_PATH:
		return (bind_keysFile);
		break;
	default:
		return (NULL);
	}
}