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