diff options
-rw-r--r-- | bin/bbackupctl/bbackupctl.cpp | 17 | ||||
-rw-r--r-- | bin/bbackupd/Win32BackupService.cpp | 26 | ||||
-rw-r--r-- | bin/bbackupd/bbackupd.cpp | 2 | ||||
-rw-r--r-- | bin/bbackupquery/bbackupquery.cpp | 22 | ||||
-rw-r--r-- | bin/bbstoreaccounts/bbstoreaccounts.cpp | 18 | ||||
-rw-r--r-- | bin/bbstored/BackupStoreDaemon.cpp | 18 | ||||
-rw-r--r-- | bin/bbstored/bbstored.cpp | 9 | ||||
-rw-r--r-- | lib/backupstore/BackupStoreConfigVerify.cpp | 8 | ||||
-rw-r--r-- | lib/common/BoxPortsAndFiles.h | 23 | ||||
-rw-r--r-- | lib/common/Guards.h | 6 | ||||
-rw-r--r-- | lib/win32/emu.cpp | 70 | ||||
-rw-r--r-- | lib/win32/emu.h | 4 | ||||
-rw-r--r-- | test/bbackupd/testbbackupd.cpp | 5 |
13 files changed, 164 insertions, 64 deletions
diff --git a/bin/bbackupctl/bbackupctl.cpp b/bin/bbackupctl/bbackupctl.cpp index 9fb8f259..f0a966c4 100644 --- a/bin/bbackupctl/bbackupctl.cpp +++ b/bin/bbackupctl/bbackupctl.cpp @@ -66,7 +66,13 @@ int main(int argc, const char *argv[]) #endif // Filename for configuration file? - const char *configFilename = BOX_FILE_BBACKUPD_DEFAULT_CONFIG; + std::string configFilename; + + #ifdef WIN32 + configFilename = BOX_GET_DEFAULT_BBACKUPD_CONFIG_FILE; + #else + configFilename = BOX_FILE_BBACKUPD_DEFAULT_CONFIG; + #endif // Quiet? bool quiet = false; @@ -103,9 +109,14 @@ int main(int argc, const char *argv[]) } // Read in the configuration file - if(!quiet) printf("Using configuration file %s\n", configFilename); + if(!quiet) printf("Using configuration file %s\n", + configFilename.c_str()); + std::string errs; - std::auto_ptr<Configuration> config(Configuration::LoadAndVerify(configFilename, &BackupDaemonConfigVerify, errs)); + std::auto_ptr<Configuration> config( + Configuration::LoadAndVerify + (configFilename, &BackupDaemonConfigVerify, errs)); + if(config.get() == 0 || !errs.empty()) { printf("Invalid configuration file:\n%s", errs.c_str()); diff --git a/bin/bbackupd/Win32BackupService.cpp b/bin/bbackupd/Win32BackupService.cpp index 7cbf4828..1470b42d 100644 --- a/bin/bbackupd/Win32BackupService.cpp +++ b/bin/bbackupd/Win32BackupService.cpp @@ -29,31 +29,23 @@ void TerminateService(void) DWORD Win32BackupService::WinService(const char* pConfigFileName) { - char exepath[MAX_PATH]; - GetModuleFileName(NULL, exepath, sizeof(exepath)); + DWORD ret; + + // keep MAINHELPER_START happy + int argc = 0; + char* argv[] = {NULL}; + + MAINHELPER_START - std::string configfile; - if (pConfigFileName != NULL) { - configfile = pConfigFileName; + ret = this->Main(pConfigFileName); } else { - // make the default config file name, - // based on the program path - configfile = exepath; - configfile = configfile.substr(0, - configfile.rfind(DIRECTORY_SEPARATOR_ASCHAR)); - configfile += DIRECTORY_SEPARATOR "bbackupd.conf"; + ret = this->Main(BOX_GET_DEFAULT_BBACKUPD_CONFIG_FILE); } - const char *argv[] = {exepath, "-c", configfile.c_str()}; - int argc = sizeof(argv) / sizeof(*argv); - DWORD ret; - - MAINHELPER_START - ret = this->Main(BOX_FILE_BBACKUPD_DEFAULT_CONFIG, argc, argv); MAINHELPER_END return ret; diff --git a/bin/bbackupd/bbackupd.cpp b/bin/bbackupd/bbackupd.cpp index f7091140..b8c8f61a 100644 --- a/bin/bbackupd/bbackupd.cpp +++ b/bin/bbackupd/bbackupd.cpp @@ -89,7 +89,7 @@ int main(int argc, const char *argv[]) else { ExitCode = gpDaemonService->Main( - BOX_FILE_BBACKUPD_DEFAULT_CONFIG, argc, argv); + BOX_GET_DEFAULT_BBACKUPD_CONFIG_FILE, argc, argv); } delete gpDaemonService; diff --git a/bin/bbackupquery/bbackupquery.cpp b/bin/bbackupquery/bbackupquery.cpp index d02c3922..9cc3eb1a 100644 --- a/bin/bbackupquery/bbackupquery.cpp +++ b/bin/bbackupquery/bbackupquery.cpp @@ -66,7 +66,8 @@ int main(int argc, const char *argv[]) { int returnCode = 0; - MAINHELPER_SETUP_MEMORY_LEAK_EXIT_REPORT("bbackupquery.memleaks", "bbackupquery") + MAINHELPER_SETUP_MEMORY_LEAK_EXIT_REPORT("bbackupquery.memleaks", + "bbackupquery") MAINHELPER_START #ifdef WIN32 @@ -77,7 +78,7 @@ int main(int argc, const char *argv[]) if (WSAStartup(0x0101, &info) == SOCKET_ERROR) { - // throw error? perhaps give it its own id in the furture + // throw error? perhaps give it its own id in the future THROW_EXCEPTION(BackupStoreException, Internal) } #endif @@ -90,7 +91,13 @@ int main(int argc, const char *argv[]) FILE *logFile = 0; // Filename for configuration file? - const char *configFilename = BOX_FILE_BBACKUPD_DEFAULT_CONFIG; + std::string configFilename; + + #ifdef WIN32 + configFilename = BOX_GET_DEFAULT_BBACKUPD_CONFIG_FILE; + #else + configFilename = BOX_FILE_BBACKUPD_DEFAULT_CONFIG; + #endif // Flags bool quiet = false; @@ -215,9 +222,14 @@ int main(int argc, const char *argv[]) #endif // WIN32 // Read in the configuration file - if(!quiet) printf("Using configuration file %s\n", configFilename); + if(!quiet) printf("Using configuration file %s\n", + configFilename.c_str()); + std::string errs; - std::auto_ptr<Configuration> config(Configuration::LoadAndVerify(configFilename, &BackupDaemonConfigVerify, errs)); + std::auto_ptr<Configuration> config( + Configuration::LoadAndVerify + (configFilename, &BackupDaemonConfigVerify, errs)); + if(config.get() == 0 || !errs.empty()) { printf("Invalid configuration file:\n%s", errs.c_str()); diff --git a/bin/bbstoreaccounts/bbstoreaccounts.cpp b/bin/bbstoreaccounts/bbstoreaccounts.cpp index dd42458b..567c5bbc 100644 --- a/bin/bbstoreaccounts/bbstoreaccounts.cpp +++ b/bin/bbstoreaccounts/bbstoreaccounts.cpp @@ -402,12 +402,19 @@ void PrintUsageAndExit() int main(int argc, const char *argv[]) { - MAINHELPER_SETUP_MEMORY_LEAK_EXIT_REPORT("bbstoreaccounts.memleaks", "bbstoreaccounts") + MAINHELPER_SETUP_MEMORY_LEAK_EXIT_REPORT("bbstoreaccounts.memleaks", + "bbstoreaccounts") MAINHELPER_START - // Filename for configuraiton file? - const char *configFilename = BOX_FILE_BBSTORED_DEFAULT_CONFIG; + // Filename for configuration file? + std::string configFilename; + + #ifdef WIN32 + configFilename = BOX_GET_DEFAULT_BBACKUPD_CONFIG_FILE; + #else + configFilename = BOX_FILE_BBSTORED_DEFAULT_CONFIG; + #endif // See if there's another entry on the command line int c; @@ -431,7 +438,10 @@ int main(int argc, const char *argv[]) // Read in the configuration file std::string errs; - std::auto_ptr<Configuration> config(Configuration::LoadAndVerify(configFilename, &BackupConfigFileVerify, errs)); + std::auto_ptr<Configuration> config( + Configuration::LoadAndVerify + (configFilename, &BackupConfigFileVerify, errs)); + if(config.get() == 0 || !errs.empty()) { printf("Invalid configuration file:\n%s", errs.c_str()); diff --git a/bin/bbstored/BackupStoreDaemon.cpp b/bin/bbstored/BackupStoreDaemon.cpp index c9601575..049c0ae4 100644 --- a/bin/bbstored/BackupStoreDaemon.cpp +++ b/bin/bbstored/BackupStoreDaemon.cpp @@ -132,7 +132,23 @@ void BackupStoreDaemon::SetupInInitialProcess() // Initialise the raid files controller RaidFileController &rcontroller = RaidFileController::GetController(); - rcontroller.Initialise(config.GetKeyValue("RaidFileConf").c_str()); + + std::string raidFileConfig; + + #ifdef WIN32 + if (!config.KeyExists("RaidFileConf")) + { + raidFileConfig = BOX_GET_DEFAULT_RAIDFILE_CONFIG_FILE; + } + else + { + raidFileConfig = config.GetKeyValue("RaidFileConf"); + } + #else + raidFileConfig = config.GetKeyValue("RaidFileConf"); + #endif + + rcontroller.Initialise(raidFileConfig); // Load the account database std::auto_ptr<BackupStoreAccountDatabase> pdb(BackupStoreAccountDatabase::Read(config.GetKeyValue("AccountDatabase").c_str())); diff --git a/bin/bbstored/bbstored.cpp b/bin/bbstored/bbstored.cpp index c0ea1199..54858dd4 100644 --- a/bin/bbstored/bbstored.cpp +++ b/bin/bbstored/bbstored.cpp @@ -23,7 +23,14 @@ int main(int argc, const char *argv[]) Logging::ToSyslog (true); BackupStoreDaemon daemon; - return daemon.Main(BOX_FILE_BBSTORED_DEFAULT_CONFIG, argc, argv); + + #ifdef WIN32 + return daemon.Main(BOX_GET_DEFAULT_BBACKUPD_CONFIG_FILE, + argc, argv); + #else + return daemon.Main(BOX_FILE_BBSTORED_DEFAULT_CONFIG, + argc, argv); + #endif MAINHELPER_END } diff --git a/lib/backupstore/BackupStoreConfigVerify.cpp b/lib/backupstore/BackupStoreConfigVerify.cpp index 6fa05d06..784adfb8 100644 --- a/lib/backupstore/BackupStoreConfigVerify.cpp +++ b/lib/backupstore/BackupStoreConfigVerify.cpp @@ -35,7 +35,13 @@ static const ConfigurationVerifyKey verifyrootkeys[] = {"AccountDatabase", 0, ConfigTest_Exists, 0}, {"TimeBetweenHousekeeping", 0, ConfigTest_Exists | ConfigTest_IsInt, 0}, {"ExtendedLogging", "no", ConfigTest_IsBool, 0}, // make value "yes" to enable in config file - {"RaidFileConf", BOX_FILE_RAIDFILE_DEFAULT_CONFIG, ConfigTest_LastEntry, 0} + + #ifdef WIN32 + {"RaidFileConf", "", ConfigTest_LastEntry, 0} + #else + {"RaidFileConf", BOX_FILE_RAIDFILE_DEFAULT_CONFIG, ConfigTest_LastEntry, 0} + #endif + }; const ConfigurationVerify BackupConfigFileVerify = diff --git a/lib/common/BoxPortsAndFiles.h b/lib/common/BoxPortsAndFiles.h index 562c6724..a6ca9f6d 100644 --- a/lib/common/BoxPortsAndFiles.h +++ b/lib/common/BoxPortsAndFiles.h @@ -14,20 +14,27 @@ // Backup store daemon -#define BOX_PORT_BBSTORED (BOX_PORT_BASE+1) -#define BOX_FILE_BBSTORED_DEFAULT_CONFIG "/etc/box/bbstored.conf" +#define BOX_PORT_BBSTORED (BOX_PORT_BASE+1) + // directory within the RAIDFILE root for the backup store daemon -#define BOX_RAIDFILE_ROOT_BBSTORED "backup" +#define BOX_RAIDFILE_ROOT_BBSTORED "backup" -// Backup client daemon +// configuration file paths #ifdef WIN32 -#define BOX_FILE_BBACKUPD_DEFAULT_CONFIG "C:\\Program Files\\Box Backup\\bbackupd.conf" + // no default config file path, use these macros to call + // GetDefaultConfigFilePath() instead. + + #define BOX_GET_DEFAULT_BBACKUPD_CONFIG_FILE \ + GetDefaultConfigFilePath("bbackupd.conf").c_str() + #define BOX_GET_DEFAULT_RAIDFILE_CONFIG_FILE \ + GetDefaultConfigFilePath("raidfile.conf").c_str() + #define BOX_GET_DEFAULT_BBSTORED_CONFIG_FILE \ + GetDefaultConfigFilePath("bbstored.conf").c_str() #else #define BOX_FILE_BBACKUPD_DEFAULT_CONFIG "/etc/box/bbackupd.conf" -#endif - -// RaidFile conf location default #define BOX_FILE_RAIDFILE_DEFAULT_CONFIG "/etc/box/raidfile.conf" +#define BOX_FILE_BBSTORED_DEFAULT_CONFIG "/etc/box/bbstored.conf" +#endif // Default name of the named pipe #define BOX_NAMED_PIPE_NAME L"\\\\.\\pipe\\boxbackup" diff --git a/lib/common/Guards.h b/lib/common/Guards.h index fbcfedaf..d2fb84e0 100644 --- a/lib/common/Guards.h +++ b/lib/common/Guards.h @@ -32,13 +32,13 @@ template <int flags = O_RDONLY | O_BINARY, int mode = (S_IRUSR | S_IWUSR | S_IRG class FileHandleGuard { public: - FileHandleGuard(const char *filename) - : mOSFileHandle(::open(filename, flags, mode)) + FileHandleGuard(const std::string& rFilename) + : mOSFileHandle(::open(rFilename.c_str(), flags, mode)) { if(mOSFileHandle < 0) { BOX_ERROR("FileHandleGuard: failed to open file '" << - filename << "': " << strerror(errno)); + rFilename << "': " << strerror(errno)); THROW_EXCEPTION(CommonException, OSFileOpenError) } } diff --git a/lib/win32/emu.cpp b/lib/win32/emu.cpp index 4224d62e..1a6b0e79 100644 --- a/lib/win32/emu.cpp +++ b/lib/win32/emu.cpp @@ -218,6 +218,44 @@ bool EnableBackupRights( void ) } } +// forward declaration +char* ConvertFromWideString(const WCHAR* pString, unsigned int codepage); + +// -------------------------------------------------------------------------- +// +// Function +// Name: GetDefaultConfigFilePath(std::string name) +// Purpose: Calculates the default configuration file name, +// by using the directory location of the currently +// executing program, and appending the provided name. +// In case of fire, returns an empty string. +// Created: 26th May 2007 +// +// -------------------------------------------------------------------------- +std::string GetDefaultConfigFilePath(const std::string& rName) +{ + WCHAR exePathWide[MAX_PATH]; + GetModuleFileNameW(NULL, exePathWide, MAX_PATH-1); + + char* exePathUtf8 = ConvertFromWideString(exePathWide, CP_UTF8); + if (exePathUtf8 == NULL) + { + return ""; + } + + std::string configfile = exePathUtf8; + delete [] exePathUtf8; + + // make the default config file name, + // based on the program path + configfile = configfile.substr(0, + configfile.rfind('\\')); + configfile += "\\"; + configfile += rName; + + return configfile; +} + // -------------------------------------------------------------------------- // // Function @@ -1252,15 +1290,15 @@ BOOL AddEventSource // Work out the executable file name, to register ourselves // as the event source - char cmd[MAX_PATH]; - if (GetModuleFileName(NULL, cmd, sizeof(cmd)-1) == 0) + WCHAR cmd[MAX_PATH]; + DWORD len = GetModuleFileNameW(NULL, cmd, MAX_PATH); + + if (len == 0) { ::syslog(LOG_ERR, "Failed to get the program file name: %s", GetErrorMessage(GetLastError()).c_str()); return FALSE; } - cmd[sizeof(cmd)-1] = 0; - std::string exepath(cmd); // Create the event source as a subkey of the log. @@ -1282,12 +1320,12 @@ BOOL AddEventSource // Set the name of the message file. - if (RegSetValueEx(hk, // subkey handle - "EventMessageFile", // value name - 0, // must be zero - REG_EXPAND_SZ, // value type - (LPBYTE) exepath.c_str(), // pointer to value data - (DWORD) (exepath.size()))) // data size + if (RegSetValueExW(hk, // subkey handle + L"EventMessageFile", // value name + 0, // must be zero + REG_EXPAND_SZ, // value type + (LPBYTE)cmd, // pointer to value data + len*sizeof(WCHAR))) // data size { ::syslog(LOG_ERR, "Failed to set the event message file: %s", GetErrorMessage(GetLastError()).c_str()); @@ -1315,12 +1353,12 @@ BOOL AddEventSource // Set the category message file and number of categories. - if (RegSetValueEx(hk, // subkey handle - "CategoryMessageFile", // value name - 0, // must be zero - REG_EXPAND_SZ, // value type - (LPBYTE) exepath.c_str(), // pointer to value data - (DWORD) (exepath.size()))) // data size + if (RegSetValueExW(hk, // subkey handle + L"CategoryMessageFile", // value name + 0, // must be zero + REG_EXPAND_SZ, // value type + (LPBYTE)cmd, // pointer to value data + len*sizeof(WCHAR))) // data size { ::syslog(LOG_ERR, "Failed to set the category message file: " "%s", GetErrorMessage(GetLastError()).c_str()); diff --git a/lib/win32/emu.h b/lib/win32/emu.h index 1f078c14..8ab74130 100644 --- a/lib/win32/emu.h +++ b/lib/win32/emu.h @@ -377,6 +377,10 @@ bool ConvertFromUtf8 (const std::string& rSource, std::string& rDest, bool ConvertUtf8ToConsole(const char* pString, std::string& rDest); bool ConvertConsoleToUtf8(const char* pString, std::string& rDest); +// Utility function which returns a default config file name, +// based on the path of the current executable. +std::string GetDefaultConfigFilePath(const std::string& rName); + // GetErrorMessage() returns a system error message, like strerror() // but for Windows error codes. std::string GetErrorMessage(DWORD errorCode); diff --git a/test/bbackupd/testbbackupd.cpp b/test/bbackupd/testbbackupd.cpp index 696bd1a6..3942ea7c 100644 --- a/test/bbackupd/testbbackupd.cpp +++ b/test/bbackupd/testbbackupd.cpp @@ -612,10 +612,7 @@ int start_internal_daemon() int own_pid = getpid(); BackupDaemon daemon; - const char* fake_argv[] = { "bbackupd", "testfiles/bbackupd.conf" }; - - int result = daemon.Main(BOX_FILE_BBACKUPD_DEFAULT_CONFIG, 2, - fake_argv); + int result = daemon.Main("testfiles/bbackupd.conf"); TEST_THAT(result == 0); if (result != 0) |