1*00b67f09SDavid van Moolenbroek /* $NetBSD: ntpaths.c,v 1.5 2014/12/10 04:38:01 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek * Copyright (C) 2004, 2007, 2009, 2014 Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek * Copyright (C) 2001 Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek *
7*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek *
11*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek */
19*00b67f09SDavid van Moolenbroek
20*00b67f09SDavid van Moolenbroek /* Id: ntpaths.c,v 1.15 2009/07/14 22:54:57 each Exp */
21*00b67f09SDavid van Moolenbroek
22*00b67f09SDavid van Moolenbroek /*
23*00b67f09SDavid van Moolenbroek * This module fetches the required path information that is specific
24*00b67f09SDavid van Moolenbroek * to NT systems which can have its configuration and system files
25*00b67f09SDavid van Moolenbroek * almost anywhere. It can be used to override whatever the application
26*00b67f09SDavid van Moolenbroek * had previously assigned to the pointer. Basic information about the
27*00b67f09SDavid van Moolenbroek * file locations are stored in the registry.
28*00b67f09SDavid van Moolenbroek */
29*00b67f09SDavid van Moolenbroek
30*00b67f09SDavid van Moolenbroek #include <config.h>
31*00b67f09SDavid van Moolenbroek #include <isc/bind_registry.h>
32*00b67f09SDavid van Moolenbroek #include <isc/ntpaths.h>
33*00b67f09SDavid van Moolenbroek
34*00b67f09SDavid van Moolenbroek /*
35*00b67f09SDavid van Moolenbroek * Module Variables
36*00b67f09SDavid van Moolenbroek */
37*00b67f09SDavid van Moolenbroek
38*00b67f09SDavid van Moolenbroek static char systemDir[MAX_PATH];
39*00b67f09SDavid van Moolenbroek static char namedBase[MAX_PATH];
40*00b67f09SDavid van Moolenbroek static char ns_confFile[MAX_PATH];
41*00b67f09SDavid van Moolenbroek static char lwresd_confFile[MAX_PATH];
42*00b67f09SDavid van Moolenbroek static char lwresd_resolvconfFile[MAX_PATH];
43*00b67f09SDavid van Moolenbroek static char rndc_confFile[MAX_PATH];
44*00b67f09SDavid van Moolenbroek static char ns_defaultpidfile[MAX_PATH];
45*00b67f09SDavid van Moolenbroek static char lwresd_defaultpidfile[MAX_PATH];
46*00b67f09SDavid van Moolenbroek static char local_state_dir[MAX_PATH];
47*00b67f09SDavid van Moolenbroek static char sys_conf_dir[MAX_PATH];
48*00b67f09SDavid van Moolenbroek static char rndc_keyFile[MAX_PATH];
49*00b67f09SDavid van Moolenbroek static char session_keyFile[MAX_PATH];
50*00b67f09SDavid van Moolenbroek
51*00b67f09SDavid van Moolenbroek static DWORD baseLen = MAX_PATH;
52*00b67f09SDavid van Moolenbroek static BOOL Initialized = FALSE;
53*00b67f09SDavid van Moolenbroek
54*00b67f09SDavid van Moolenbroek void
isc_ntpaths_init(void)55*00b67f09SDavid van Moolenbroek isc_ntpaths_init(void) {
56*00b67f09SDavid van Moolenbroek HKEY hKey;
57*00b67f09SDavid van Moolenbroek BOOL keyFound = TRUE;
58*00b67f09SDavid van Moolenbroek
59*00b67f09SDavid van Moolenbroek memset(namedBase, 0, MAX_PATH);
60*00b67f09SDavid van Moolenbroek if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, BIND_SUBKEY, 0, KEY_READ, &hKey)
61*00b67f09SDavid van Moolenbroek != ERROR_SUCCESS)
62*00b67f09SDavid van Moolenbroek keyFound = FALSE;
63*00b67f09SDavid van Moolenbroek
64*00b67f09SDavid van Moolenbroek if (keyFound == TRUE) {
65*00b67f09SDavid van Moolenbroek /* Get the named directory */
66*00b67f09SDavid van Moolenbroek if (RegQueryValueEx(hKey, "InstallDir", NULL, NULL,
67*00b67f09SDavid van Moolenbroek (LPBYTE)namedBase, &baseLen) != ERROR_SUCCESS)
68*00b67f09SDavid van Moolenbroek keyFound = FALSE;
69*00b67f09SDavid van Moolenbroek RegCloseKey(hKey);
70*00b67f09SDavid van Moolenbroek }
71*00b67f09SDavid van Moolenbroek
72*00b67f09SDavid van Moolenbroek GetSystemDirectory(systemDir, MAX_PATH);
73*00b67f09SDavid van Moolenbroek
74*00b67f09SDavid van Moolenbroek if (keyFound == FALSE)
75*00b67f09SDavid van Moolenbroek /* Use the System Directory as a default */
76*00b67f09SDavid van Moolenbroek strcpy(namedBase, systemDir);
77*00b67f09SDavid van Moolenbroek
78*00b67f09SDavid van Moolenbroek strcpy(ns_confFile, namedBase);
79*00b67f09SDavid van Moolenbroek strcat(ns_confFile, "\\etc\\named.conf");
80*00b67f09SDavid van Moolenbroek
81*00b67f09SDavid van Moolenbroek strcpy(lwresd_confFile, namedBase);
82*00b67f09SDavid van Moolenbroek strcat(lwresd_confFile, "\\etc\\lwresd.conf");
83*00b67f09SDavid van Moolenbroek
84*00b67f09SDavid van Moolenbroek strcpy(lwresd_resolvconfFile, systemDir);
85*00b67f09SDavid van Moolenbroek strcat(lwresd_resolvconfFile, "\\Drivers\\etc\\resolv.conf");
86*00b67f09SDavid van Moolenbroek
87*00b67f09SDavid van Moolenbroek strcpy(rndc_keyFile, namedBase);
88*00b67f09SDavid van Moolenbroek strcat(rndc_keyFile, "\\etc\\rndc.key");
89*00b67f09SDavid van Moolenbroek
90*00b67f09SDavid van Moolenbroek strcpy(session_keyFile, namedBase);
91*00b67f09SDavid van Moolenbroek strcat(session_keyFile, "\\etc\\session.key");
92*00b67f09SDavid van Moolenbroek
93*00b67f09SDavid van Moolenbroek strcpy(rndc_confFile, namedBase);
94*00b67f09SDavid van Moolenbroek strcat(rndc_confFile, "\\etc\\rndc.conf");
95*00b67f09SDavid van Moolenbroek strcpy(ns_defaultpidfile, namedBase);
96*00b67f09SDavid van Moolenbroek strcat(ns_defaultpidfile, "\\etc\\named.pid");
97*00b67f09SDavid van Moolenbroek
98*00b67f09SDavid van Moolenbroek strcpy(lwresd_defaultpidfile, namedBase);
99*00b67f09SDavid van Moolenbroek strcat(lwresd_defaultpidfile, "\\etc\\lwresd.pid");
100*00b67f09SDavid van Moolenbroek
101*00b67f09SDavid van Moolenbroek strcpy(local_state_dir, namedBase);
102*00b67f09SDavid van Moolenbroek strcat(local_state_dir, "\\bin");
103*00b67f09SDavid van Moolenbroek
104*00b67f09SDavid van Moolenbroek strcpy(sys_conf_dir, namedBase);
105*00b67f09SDavid van Moolenbroek strcat(sys_conf_dir, "\\etc");
106*00b67f09SDavid van Moolenbroek
107*00b67f09SDavid van Moolenbroek Initialized = TRUE;
108*00b67f09SDavid van Moolenbroek }
109*00b67f09SDavid van Moolenbroek
110*00b67f09SDavid van Moolenbroek char *
isc_ntpaths_get(int ind)111*00b67f09SDavid van Moolenbroek isc_ntpaths_get(int ind) {
112*00b67f09SDavid van Moolenbroek if (!Initialized)
113*00b67f09SDavid van Moolenbroek isc_ntpaths_init();
114*00b67f09SDavid van Moolenbroek
115*00b67f09SDavid van Moolenbroek switch (ind) {
116*00b67f09SDavid van Moolenbroek case NAMED_CONF_PATH:
117*00b67f09SDavid van Moolenbroek return (ns_confFile);
118*00b67f09SDavid van Moolenbroek break;
119*00b67f09SDavid van Moolenbroek case LWRES_CONF_PATH:
120*00b67f09SDavid van Moolenbroek return (lwresd_confFile);
121*00b67f09SDavid van Moolenbroek break;
122*00b67f09SDavid van Moolenbroek case RESOLV_CONF_PATH:
123*00b67f09SDavid van Moolenbroek return (lwresd_resolvconfFile);
124*00b67f09SDavid van Moolenbroek break;
125*00b67f09SDavid van Moolenbroek case RNDC_CONF_PATH:
126*00b67f09SDavid van Moolenbroek return (rndc_confFile);
127*00b67f09SDavid van Moolenbroek break;
128*00b67f09SDavid van Moolenbroek case NAMED_PID_PATH:
129*00b67f09SDavid van Moolenbroek return (ns_defaultpidfile);
130*00b67f09SDavid van Moolenbroek break;
131*00b67f09SDavid van Moolenbroek case LWRESD_PID_PATH:
132*00b67f09SDavid van Moolenbroek return (lwresd_defaultpidfile);
133*00b67f09SDavid van Moolenbroek break;
134*00b67f09SDavid van Moolenbroek case LOCAL_STATE_DIR:
135*00b67f09SDavid van Moolenbroek return (local_state_dir);
136*00b67f09SDavid van Moolenbroek break;
137*00b67f09SDavid van Moolenbroek case SYS_CONF_DIR:
138*00b67f09SDavid van Moolenbroek return (sys_conf_dir);
139*00b67f09SDavid van Moolenbroek break;
140*00b67f09SDavid van Moolenbroek case RNDC_KEY_PATH:
141*00b67f09SDavid van Moolenbroek return (rndc_keyFile);
142*00b67f09SDavid van Moolenbroek break;
143*00b67f09SDavid van Moolenbroek case SESSION_KEY_PATH:
144*00b67f09SDavid van Moolenbroek return (session_keyFile);
145*00b67f09SDavid van Moolenbroek break;
146*00b67f09SDavid van Moolenbroek default:
147*00b67f09SDavid van Moolenbroek return (NULL);
148*00b67f09SDavid van Moolenbroek }
149*00b67f09SDavid van Moolenbroek }
150