/* * PROGRAM: Client/Server Common Code * MODULE: config_root.cpp * DESCRIPTION: Configuration manager (platform specific - linux/posix) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * You may obtain a copy of the Licence at * http://www.gnu.org/licences/lgpl.html * * As a special exception this file can also be included in modules * with other source code as long as that source code has been * released under an Open Source Initiative certificed licence. * More information about OSI certification can be found at: * http://www.opensource.org * * This module is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public Licence for more details. * * This module was created by members of the firebird development * team. All individual contributions remain the Copyright (C) of * those individuals and all rights are reserved. Contributors to * this file are either listed below or can be obtained from a CVS * history command. * * Created by: Mark O'Donohue * * Contributor(s): */ #include "firebird.h" #include #include "fb_types.h" #include "fb_string.h" #include "../jrd/os/config_root.h" #include "../jrd/os/path_utils.h" #include "../utilities/install/registry.h" typedef Firebird::string string; static const char *REGISTRY_KEY = "RootDirectory"; static const char *CONFIG_FILE = "firebird.conf"; /****************************************************************************** * * Platform-specific root locator */ void getRootFromRegistry(TEXT *buffer, DWORD buffer_length) { HKEY hkey; DWORD type; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_KEY_ROOT_CUR_VER, 0, KEY_QUERY_VALUE, &hkey) != ERROR_SUCCESS) { return; } RegQueryValueEx(hkey, REGISTRY_KEY, NULL, &type, reinterpret_cast(buffer), &buffer_length); RegCloseKey(hkey); } ConfigRoot::ConfigRoot() { TEXT buffer[MAXPATHLEN]; buffer[0] = 0; // check the registry first #if !defined(EMBEDDED) getRootFromRegistry(buffer, sizeof(buffer)); #endif if (buffer[0]) { root_dir = buffer; if (root_dir.rfind(PathUtils::dir_sep) != root_dir.length() - 1) { root_dir += PathUtils::dir_sep; } return; } // get the pathname of the running executable GetModuleFileName(NULL, buffer, sizeof(buffer)); string bin_dir = buffer; // get rid of the filename int index = bin_dir.rfind(PathUtils::dir_sep); bin_dir = bin_dir.substr(0, index); // how should we decide to use bin_dir instead of root_dir? any ideas? // ??? #if defined(EMBEDDED) root_dir = bin_dir + PathUtils::dir_sep; return; #endif // go to the parent directory index = bin_dir.rfind(PathUtils::dir_sep, bin_dir.length()); root_dir = (index ? bin_dir.substr(0, index) : bin_dir) + PathUtils::dir_sep; } const char *ConfigRoot::getRootDirectory() const { return root_dir.c_str(); } const char *ConfigRoot::getConfigFile() const { static string file = root_dir + string(CONFIG_FILE); return file.c_str(); }