From 690c9f7c6fea8c660b69710fafe774cc045454f2 Mon Sep 17 00:00:00 2001 From: R4SAS Date: Mon, 6 Jun 2022 18:20:18 +0300 Subject: [PATCH] [FS] add support for windows ProgramData path when running as service Signed-off-by: R4SAS --- daemon/Daemon.cpp | 2 -- libi2pd/FS.cpp | 38 ++++++++++++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/daemon/Daemon.cpp b/daemon/Daemon.cpp index 0ecc446a..c6e6465a 100644 --- a/daemon/Daemon.cpp +++ b/daemon/Daemon.cpp @@ -58,9 +58,7 @@ namespace util bool Daemon_Singleton::IsService () const { bool service = false; -#ifndef _WIN32 i2p::config::GetOption("service", service); -#endif return service; } diff --git a/libi2pd/FS.cpp b/libi2pd/FS.cpp index f6653e55..7334550f 100644 --- a/libi2pd/FS.cpp +++ b/libi2pd/FS.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2013-2020, The PurpleI2P Project +* Copyright (c) 2013-2022, The PurpleI2P Project * * This file is part of Purple i2pd project and licensed under BSD3 * @@ -60,10 +60,38 @@ namespace fs { } void DetectDataDir(const std::string & cmdline_param, bool isService) { + // with 'datadir' option if (cmdline_param != "") { dataDir = cmdline_param; return; } + +#if !defined(MAC_OSX) && !defined(ANDROID) + // with 'service' option + if (isService) { +#ifdef _WIN32 + wchar_t commonAppData[MAX_PATH]; + if(SHGetFolderPathW(NULL, CSIDL_COMMON_APPDATA, NULL, 0, commonAppData) != S_OK) + { +#ifdef WIN32_APP + MessageBox(NULL, TEXT("Unable to get common AppData path!"), TEXT("I2Pd: error"), MB_ICONERROR | MB_OK); +#else + fprintf(stderr, "Error: Unable to get common AppData path!"); +#endif + exit(1); + } + else + { + dataDir = boost::filesystem::wpath(commonAppData).string() + "\\" + appName; + } +#else + dataDir = "/var/lib/" + appName; +#endif + return; + } +#endif + + // detect directory as usual #ifdef _WIN32 wchar_t localAppData[MAX_PATH]; @@ -117,12 +145,10 @@ namespace fs { dataDir = std::string (ext) + "/" + appName; return; } -#endif - // otherwise use /data/files +#endif // ANDROID + // use /home/user/.i2pd or /tmp/i2pd char *home = getenv("HOME"); - if (isService) { - dataDir = "/var/lib/" + appName; - } else if (home != NULL && strlen(home) > 0) { + if (home != NULL && strlen(home) > 0) { dataDir = std::string(home) + "/." + appName; } else { dataDir = "/tmp/" + appName;