1
0
Fork 0

added TRI_LocateInstallDirectory and TRI_LocateConfigDirectory

This commit is contained in:
Frank Celler 2013-12-20 10:39:50 +01:00
parent b2d60817dd
commit 2651f7bae5
8 changed files with 181 additions and 141 deletions

View File

@ -291,19 +291,12 @@ void ArangoClient::parse (ProgramOptions& options,
}
#ifdef _SYSCONFDIR_
else {
// use packaged config file from etc/relative
string sysDir = string(_SYSCONFDIR_);
string systemConfigFile = initFilename;
char* d = TRI_LocateConfigDirectory();
if (! sysDir.empty()) {
if (sysDir[sysDir.size() - 1] != TRI_DIR_SEPARATOR_CHAR) {
sysDir += TRI_DIR_SEPARATOR_CHAR + systemConfigFile;
}
else {
sysDir += systemConfigFile;
}
if (d != 0) {
string sysDir = string(d) + initFilename;
TRI_FreeString(TRI_CORE_MEM_ZONE, d);
if (FileUtils::exists(sysDir)) {
configFile = sysDir;
@ -313,7 +306,6 @@ void ArangoClient::parse (ProgramOptions& options,
}
}
}
#endif
if (! configFile.empty()) {
LOGGER_DEBUG("using init file '" << configFile << "'");

View File

@ -45,6 +45,8 @@
#include "Basics/StringUtils.h"
#include "Basics/delete_object.h"
#include "BasicsC/conversions.h"
#include "BasicsC/files.h"
#include "BasicsC/tri-strings.h"
#include "Logger/Logger.h"
using namespace triagens::basics;
@ -124,7 +126,6 @@ ApplicationServer::ApplicationServer (std::string const& name, std::string const
_configFile(),
_userConfigFile(),
_systemConfigFile(),
_systemConfigPath(),
_uid(),
_realUid(0),
_effectiveUid(0),
@ -166,7 +167,6 @@ ApplicationServer::ApplicationServer (std::string const& name, std::string const
_configFile(),
_userConfigFile(),
_systemConfigFile(),
_systemConfigPath(),
_uid(),
_realUid(0),
_effectiveUid(0),
@ -225,20 +225,11 @@ void ApplicationServer::addFeature (ApplicationFeature* feature) {
}
////////////////////////////////////////////////////////////////////////////////
/// @brief sets the name of the system config file with a path
////////////////////////////////////////////////////////////////////////////////
void ApplicationServer::setSystemConfigFile (std::string const& name, std::string const& path) {
_systemConfigFile = name;
_systemConfigPath = path;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief sets the name of the system config file without a path
/// @brief sets the name of the system config file
////////////////////////////////////////////////////////////////////////////////
void ApplicationServer::setSystemConfigFile (std::string const& name) {
return setSystemConfigFile(name, "");
_systemConfigFile = name;
}
////////////////////////////////////////////////////////////////////////////////
@ -968,7 +959,7 @@ bool ApplicationServer::readConfigurationFile () {
// A safer approach below
// .........................................................................
string homeDir = FileUtils::homeDirectory();
string homeDir = FileUtils::homeDirectory(); // TODO homedirectory should either always or never end in "/"
if (! homeDir.empty()) {
if (homeDir[homeDir.size() - 1] != TRI_DIR_SEPARATOR_CHAR) {
@ -994,9 +985,7 @@ bool ApplicationServer::readConfigurationFile () {
return ok;
}
else {
LOGGER_DEBUG("no user init file '" << homeDir << "' found");
}
}
else {
@ -1005,56 +994,17 @@ bool ApplicationServer::readConfigurationFile () {
}
if (_systemConfigPath.empty()) {
#ifdef _SYSCONFDIR_
// try the configuration file in the system directory - if there is one
// try the configuration file in the system directory - if there is one
if (! _systemConfigFile.empty()) {
// Please note that the system directory changes depending on
// where the user installed the application server.
if (! _systemConfigFile.empty()) {
string sysDir = string(_SYSCONFDIR_);
char* d = TRI_LocateConfigDirectory();
if (! sysDir.empty()) {
if (sysDir[sysDir.size() - 1] != TRI_DIR_SEPARATOR_CHAR) {
sysDir += TRI_DIR_SEPARATOR_CHAR + _systemConfigFile;
}
else {
sysDir += _systemConfigFile;
}
// check and see if file exists
if (FileUtils::exists(sysDir)) {
LOGGER_INFO("using init file '" << sysDir << "'");
bool ok = _options.parse(_descriptionFile, sysDir);
// Observe that this is treated as an error - the configuration file exists
// but for some reason can not be parsed. Best to report an error.
if (! ok) {
LOGGER_ERROR("cannot parse config file '" << sysDir << "': " << _options.lastError());
}
return ok;
}
else {
LOGGER_INFO("no system init file '" << sysDir << "' found");
}
}
else {
LOGGER_DEBUG("no system init file, not system directory is known");
}
}
#endif
}
else {
if (! _systemConfigFile.empty()) {
string sysDir = _systemConfigPath + TRI_DIR_SEPARATOR_CHAR + _systemConfigFile;
if (d != 0) {
string sysDir = string(d) + _systemConfigFile;
TRI_FreeString(TRI_CORE_MEM_ZONE, d);
// check and see if file exists
if (FileUtils::exists(sysDir)) {
@ -1076,7 +1026,7 @@ bool ApplicationServer::readConfigurationFile () {
}
}
else {
LOGGER_DEBUG("no system init file specified");
LOGGER_DEBUG("no system init file, system directory is not known");
}
}

View File

@ -157,13 +157,7 @@ namespace triagens {
void addFeature (ApplicationFeature*);
////////////////////////////////////////////////////////////////////////////////
/// @brief sets the name of the system config file with a path
////////////////////////////////////////////////////////////////////////////////
void setSystemConfigFile (const std::string& name, const std::string& path);
////////////////////////////////////////////////////////////////////////////////
/// @brief sets the name of the system config file without a path
/// @brief sets the name of the system config file
////////////////////////////////////////////////////////////////////////////////
void setSystemConfigFile (const std::string& name);
@ -490,12 +484,6 @@ namespace triagens {
std::string _systemConfigFile;
////////////////////////////////////////////////////////////////////////////////
/// @brief system config path
////////////////////////////////////////////////////////////////////////////////
std::string _systemConfigPath;
////////////////////////////////////////////////////////////////////////////////
/// @brief the user id to use for the process
///

126
lib/BasicsC/files.c Executable file → Normal file
View File

@ -1870,8 +1870,132 @@ void TRI_SetUserTempPath (char* path) {
}
}
////////////////////////////////////////////////////////////////////////////////
/// @brief locate the installation directory
///
/// Will always end in a directory separator.
////////////////////////////////////////////////////////////////////////////////
#if _WIN32
char* TRI_LocateInstallDirectory () {
DWORD dwType;
char szPath[1023];
DWORD dwDataSize;
HKEY key;
dwDataSize = sizeof(szPath);
memset(szPath, 0, dwDataSize);
// open the key for reading
// TODO: the installer always uses the 32bit path (Wow6432)
long lResult = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
"SOFTWARE\\Wow6432Node\\triAGENS GmbH\\ArangoDB 1.4.4", // TODO
0,
KEY_READ,
&key);
if (lResult == ERROR_SUCCESS) {
// read the version value
lResult = RegQueryValueEx(key, "", NULL, &dwType, (BYTE*)szPath, &dwDataSize);
if (lResult == ERROR_SUCCESS) {
return TRI_DuplicateString(szPath);
}
RegCloseKey(key);
}
return NULL;
}
#else
char* TRI_LocateInstallDirectory () {
return NULL;
}
#endif
////////////////////////////////////////////////////////////////////////////////
/// @brief locate the configuration directory
///
/// Will always end in a directory separator.
////////////////////////////////////////////////////////////////////////////////
#if _WIN32
char* TRI_LocateConfigDirectory () {
DWORD dwType;
char szPath[1023];
DWORD dwDataSize;
HKEY key;
dwDataSize = sizeof(szPath);
memset(szPath, 0, dwDataSize);
// open the key for reading
// TODO: the installer always uses the 32bit path (Wow6432)
long lResult = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
"SOFTWARE\\Wow6432Node\\triAGENS GmbH\\ArangoDB 1.4.4", // TODO
0,
KEY_READ,
&key);
if (lResult == ERROR_SUCCESS) {
// read the version value
lResult = RegQueryValueEx(key, "", NULL, &dwType, (BYTE*)szPath, &dwDataSize);
if (lResult == ERROR_SUCCESS) {
return TRI_Concatenate2File(szPath, "etc\\arangodb\\");
}
RegCloseKey(key);
}
return NULL;
}
#elif defined(_SYSCONFDIR_)
char* TRI_LocateConfigDirectory () {
size_t len;
const char* dir = _SYSCONFDIR_;
if (*dir == '\0') {
return NULL;
}
len = strlen(dir);
if (dir[len - 1] != TRI_DIR_SEPARATOR_CHAR) {
return TRI_Concatenate2String(dir, "/");
}
else {
return TRI_DuplicateString(dir);
}
}
#else
char* TRI_LocateConfigDirectory () {
return NULL;
}
#endif
// -----------------------------------------------------------------------------
// --SECTION-- module functions
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief initialise the files subsystem
///
/// TODO: inialise logging here?
////////////////////////////////////////////////////////////////////////////////
void TRI_InitialiseFiles (void) {
@ -1881,6 +2005,8 @@ void TRI_InitialiseFiles (void) {
////////////////////////////////////////////////////////////////////////////////
/// @brief shutdown the files subsystem
///
/// TODO: inialise logging here?
////////////////////////////////////////////////////////////////////////////////
void TRI_ShutdownFiles (void) {

View File

@ -289,6 +289,22 @@ char* TRI_GetUserTempPath (void);
void TRI_SetUserTempPath (char*);
////////////////////////////////////////////////////////////////////////////////
/// @brief locate the installation directory
////////////////////////////////////////////////////////////////////////////////
char* TRI_LocateInstallDirectory ();
////////////////////////////////////////////////////////////////////////////////
/// @brief locate the configuration directory
////////////////////////////////////////////////////////////////////////////////
char* TRI_LocateConfigDirectory ();
// -----------------------------------------------------------------------------
// --SECTION-- module functions
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief initialise the files subsystem
////////////////////////////////////////////////////////////////////////////////

View File

@ -33,17 +33,6 @@
#include <malloc.h>
#include <crtdbg.h>
/*
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <share.h>
*/
// .............................................................................
// Some global variables which may be required throughout the lifetime of the
// server
@ -317,40 +306,21 @@ int TRI_openFile (const char* filename, int openFlags) {
int fileDescriptor;
fileHandle = CreateFileA(filename,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (fileHandle == INVALID_HANDLE_VALUE) {
return -1;
}
fileDescriptor = _open_osfhandle( (intptr_t)(fileHandle), O_RDWR| _O_BINARY);
return fileDescriptor;
/*
#define O_RDONLY _O_RDONLY
#define O_WRONLY _O_WRONLY
#define O_RDWR _O_RDWR
#define O_APPEND _O_APPEND
#define O_CREAT _O_CREAT
#define O_TRUNC _O_TRUNC
#define O_EXCL _O_EXCL
#define O_TEXT _O_TEXT
#define O_BINARY _O_BINARY
#define O_RAW _O_BINARY
#define O_TEMPORARY _O_TEMPORARY
#define O_NOINHERIT _O_NOINHERIT
#define O_SEQUENTIAL _O_SEQUENTIAL
#define O_RANDOM _O_RANDOM
//filename, O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR
*/
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////

View File

@ -30,23 +30,6 @@
#include <WinSock2.h>
/* Constants rounded for 21 decimals.
#define M_E 2.71828182845904523536
#define M_LOG2E 1.44269504088896340736
#define M_LOG10E 0.434294481903251827651
#define M_LN2 0.693147180559945309417
#define M_LN10 2.30258509299404568402
#define M_PI 3.14159265358979323846
#define M_PI_2 1.57079632679489661923
#define M_PI_4 0.785398163397448309616
#define M_1_PI 0.318309886183790671538
#define M_2_PI 0.636619772367581343076
#define M_1_SQRTPI 0.564189583547756286948
#define M_2_SQRTPI 1.12837916709551257390
#define M_SQRT2 1.41421356237309504880
#define M_SQRT_2 0.707106781186547524401
*/
#ifdef __cplusplus
extern "C" {
#endif

View File

@ -178,8 +178,23 @@ static char * FillVariables (const char* value) {
char* k = TRI_DuplicateString2(t, q - t);
char* v = getenv(k);
if (v != NULL && *v == '\0') {
TRI_FreeString(TRI_CORE_MEM_ZONE, v);
v = NULL;
}
if (v == NULL) {
if (TRI_EqualString(k, "ROOTDIR")) {
v = TRI_LocateInstallDirectory();
}
}
else {
v = TRI_DuplicateString(v);
}
if (v != NULL) {
TRI_AppendStringStringBuffer(&buffer, v);
TRI_FreeString(TRI_CORE_MEM_ZONE, v);
}
TRI_FreeString(TRI_CORE_MEM_ZONE, k);