1 // Copyright (c) 1999-2018 David Muse
2 // See the file COPYING for more information
3 
4 #include <sqlrelay/sqlrutil.h>
5 
6 #include <rudiments/charstring.h>
7 #include <rudiments/sys.h>
8 #include <rudiments/stringbuffer.h>
9 
10 #include <config.h>
11 
12 #ifdef _WIN32
13 	#include <windows.h>
14 #endif
15 
sqlrpaths(sqlrcmdline * cmdl)16 sqlrpaths::sqlrpaths(sqlrcmdline *cmdl) {
17 
18 	stringbuffer	scratch;
19 
20 	char	*defaultlocalstatedir;
21 	char	*sysconfdir;
22 
23 #ifdef _WIN32
24 
25 	// get prefix from HKEY_LOCAL_MACHINE\SOFTWARE\SQLRelay\prefix
26 	HKEY	hkey;
27 	char	prefix[512];
28 	DWORD	prefixsize=sizeof(prefix);
29 	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
30 				"SOFTWARE\\SQLRelay",
31 				0,KEY_READ,&hkey)!=ERROR_SUCCESS ||
32 		RegQueryValueEx(hkey,"prefix",0,NULL,
33 				(LPBYTE)prefix,&prefixsize)!=ERROR_SUCCESS) {
34 
35 		// fall back to defaults
36 		charstring::copy(prefix,PREFIX);
37 	}
38 
39 	// trim trailing slashes
40 	charstring::rightTrim(prefix,'\\');
41 
42 	// build default bindir
43 	scratch.append(prefix)->append("\\bin\\");
44 	bindir=scratch.detachString();
45 
46 	// build default localstatedir
47 	scratch.append(prefix)->append("\\var\\");
48 	defaultlocalstatedir=scratch.detachString();
49 
50 	// sysconfdir
51 	scratch.append(prefix)->append("\\etc\\");
52 	sysconfdir=scratch.detachString();
53 
54 	// libexecdir
55 	scratch.append(prefix)->append("\\libexec\\");
56 	scratch.append(SQLRELAY)->append("\\");
57 	libexecdir=scratch.detachString();
58 
59 #else
60 	bindir=charstring::duplicate(BINDIR);
61 	defaultlocalstatedir=charstring::duplicate(LOCALSTATEDIR);
62 	sysconfdir=charstring::duplicate(SYSCONFDIR);
63 	libexecdir=charstring::duplicate(LIBEXECDIR);
64 #endif
65 
66 	char	slash=sys::getDirectorySeparator();
67 
68 	const char	*lsd=cmdl->getValue("-localstatedir");
69 	if (!charstring::isNullOrEmpty(lsd)) {
70 		localstatedir=charstring::duplicate(lsd);
71 		delete[] defaultlocalstatedir;
72 	} else {
73 		localstatedir=defaultlocalstatedir;
74 	}
75 
76 	// we need to make sure that there's a slash after
77 	// localstatedir when building other paths off of it
78 	const char	*lsdterm=
79 #ifdef _WIN32
80 	(*(localstatedir+charstring::length(localstatedir)-1)=='\\')?"":"\\";
81 #else
82 	(*(localstatedir+charstring::length(localstatedir)-1)=='/')?"":"/";
83 #endif
84 
85 	scratch.append(localstatedir)->append(lsdterm)->append("run")->
86 			append(slash)->append(SQLRELAY)->append(slash);
87 	tmpdirlen=scratch.getStringLength();
88 	tmpdir=scratch.detachString();
89 
90 	scratch.append(tmpdir)->append("sockseq");
91 	sockseqfile=scratch.detachString();
92 
93 	scratch.append(tmpdir);
94 	socketsdir=scratch.detachString();
95 
96 	scratch.append(tmpdir);
97 	ipcdir=scratch.detachString();
98 
99 	scratch.append(tmpdir);
100 	piddir=scratch.detachString();
101 
102 	scratch.append(localstatedir)->append(lsdterm)->append("log")->
103 			append(slash)->append(SQLRELAY)->append(slash);
104 	logdir=scratch.detachString();
105 
106 	scratch.append(logdir)->append("debug")->append(slash);
107 	debugdir=scratch.detachString();
108 
109 	scratch.append(localstatedir)->append(lsdterm)->append("cache")->
110 			append(slash)->append(SQLRELAY)->append(slash);
111 	cachedir=scratch.detachString();
112 
113 	scratch.append(sysconfdir)->append(SQLRELAY)->append(".conf");
114 	defaultconfigfile=scratch.detachString();
115 
116 	scratch.append(sysconfdir)->append(SQLRELAY)->append(".conf.d");
117 	scratch.append(slash);
118 	defaultconfigdir=scratch.detachString();
119 
120 	scratch.append(defaultconfigfile)->
121 			append(",dir://")->append(defaultconfigdir);
122 	defaultconfigurl=scratch.detachString();
123 
124 	const char	*cfg=cmdl->getValue("-config");
125 	if (!charstring::isNullOrEmpty(cfg)) {
126 		configurl=cfg;
127 	} else {
128 		configurl=defaultconfigurl;
129 	}
130 
131 	delete[] sysconfdir;
132 }
133 
~sqlrpaths()134 sqlrpaths::~sqlrpaths() {
135 	delete[] bindir;
136 	delete[] localstatedir;
137 	delete[] tmpdir;
138 	delete[] sockseqfile;
139 	delete[] socketsdir;
140 	delete[] ipcdir;
141 	delete[] piddir;
142 	delete[] logdir;
143 	delete[] debugdir;
144 	delete[] cachedir;
145 	delete[] defaultconfigfile;
146 	delete[] defaultconfigdir;
147 	delete[] libexecdir;
148 }
149 
getBinDir()150 const char *sqlrpaths::getBinDir() {
151 	return bindir;
152 }
153 
getLocalStateDir()154 const char *sqlrpaths::getLocalStateDir() {
155 	return localstatedir;
156 }
157 
getTmpDir()158 const char *sqlrpaths::getTmpDir() {
159 	return tmpdir;
160 }
161 
getSockSeqFile()162 const char *sqlrpaths::getSockSeqFile() {
163 	return sockseqfile;
164 }
165 
getSocketsDir()166 const char *sqlrpaths::getSocketsDir() {
167 	return socketsdir;
168 }
169 
getIpcDir()170 const char *sqlrpaths::getIpcDir() {
171 	return ipcdir;
172 }
173 
getPidDir()174 const char *sqlrpaths::getPidDir() {
175 	return piddir;
176 }
177 
getLogDir()178 const char *sqlrpaths::getLogDir() {
179 	return logdir;
180 }
181 
getDebugDir()182 const char *sqlrpaths::getDebugDir() {
183 	return debugdir;
184 }
185 
getCacheDir()186 const char *sqlrpaths::getCacheDir() {
187 	return cachedir;
188 }
189 
getDefaultConfigFile()190 const char *sqlrpaths::getDefaultConfigFile() {
191 	return defaultconfigfile;
192 }
193 
getDefaultConfigDir()194 const char *sqlrpaths::getDefaultConfigDir() {
195 	return defaultconfigdir;
196 }
197 
getDefaultConfigUrl()198 const char *sqlrpaths::getDefaultConfigUrl() {
199 	return defaultconfigurl;
200 }
201 
getConfigUrl()202 const char *sqlrpaths::getConfigUrl() {
203 	return configurl;
204 }
205 
getLibExecDir()206 const char *sqlrpaths::getLibExecDir() {
207 	return libexecdir;
208 }
209