From f4d2dec628edae884ae7c5ac5ace99b8dbbb7949 Mon Sep 17 00:00:00 2001
From: XMRig <support@xmrig.com>
Date: Fri, 15 Feb 2019 05:42:46 +0700
Subject: [PATCH] Added classes Process and Arguments.

---
 CMakeLists.txt                     |   4 ++
 src/App.cpp                        |  24 +++----
 src/App.h                          |  24 ++++---
 src/App_unix.cpp                   |   5 +-
 src/App_win.cpp                    |   5 +-
 src/base/kernel/Process.cpp        | 101 +++++++++++++++++++++++++++++
 src/base/kernel/Process.h          |  64 ++++++++++++++++++
 src/base/tools/Arguments.cpp       |  76 ++++++++++++++++++++++
 src/base/tools/Arguments.h         |  61 +++++++++++++++++
 src/common/Platform.cpp            |  35 +---------
 src/common/Platform.h              |   8 +--
 src/common/config/ConfigLoader.cpp |   7 +-
 src/common/config/ConfigLoader.h   |   3 +-
 src/core/Config.cpp                |   4 +-
 src/core/Config.h                  |   7 +-
 src/core/Controller.cpp            |  12 ++--
 src/core/Controller.h              |   5 +-
 src/xmrig.cpp                      |  10 ++-
 18 files changed, 373 insertions(+), 82 deletions(-)
 create mode 100644 src/base/kernel/Process.cpp
 create mode 100644 src/base/kernel/Process.h
 create mode 100644 src/base/tools/Arguments.cpp
 create mode 100644 src/base/tools/Arguments.h

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3eb8a0fcf..238a9b7f3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -24,6 +24,8 @@ set(HEADERS
     src/base/io/Watcher.h
     src/base/kernel/interfaces/IConfigListener.h
     src/base/kernel/interfaces/IWatcherListener.h
+    src/base/kernel/Process.h
+    src/base/tools/Arguments.h
     src/base/tools/Handle.h
     src/base/tools/String.h
     src/common/config/CommonConfig.h
@@ -104,6 +106,8 @@ set(SOURCES
     src/App.cpp
     src/base/io/Json.cpp
     src/base/io/Watcher.cpp
+    src/base/kernel/Process.cpp
+    src/base/tools/Arguments.cpp
     src/base/tools/Handle.cpp
     src/base/tools/String.cpp
     src/common/config/CommonConfig.cpp
diff --git a/src/App.cpp b/src/App.cpp
index e3c4c222d..d6ed7190e 100644
--- a/src/App.cpp
+++ b/src/App.cpp
@@ -5,7 +5,9 @@
  * Copyright 2014-2016 Wolf9466    <https://github.com/OhGodAPet>
  * Copyright 2016      Jay D Dee   <jayddee246@gmail.com>
  * Copyright 2017-2018 XMR-Stak    <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
- * Copyright 2016-2018 XMRig       <https://github.com/xmrig>, <support@xmrig.com>
+ * Copyright 2018      Lee Clagett <https://github.com/vtnerd>
+ * Copyright 2018      SChernykh   <https://github.com/SChernykh>
+ * Copyright 2016-2019 XMRig       <https://github.com/xmrig>, <support@xmrig.com>
  *
  *   This program is free software: you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -47,18 +49,18 @@
 #endif
 
 
-App *App::m_self = nullptr;
+xmrig::App *xmrig::App::m_self = nullptr;
 
 
 
-App::App(int argc, char **argv) :
+xmrig::App::App(Process *process) :
     m_console(nullptr),
     m_httpd(nullptr)
 {
     m_self = this;
 
-    m_controller = new xmrig::Controller();
-    if (m_controller->init(argc, argv) != 0) {
+    m_controller = new xmrig::Controller(process);
+    if (m_controller->init() != 0) {
         return;
     }
 
@@ -72,7 +74,7 @@ App::App(int argc, char **argv) :
 }
 
 
-App::~App()
+xmrig::App::~App()
 {
     uv_tty_reset_mode();
 
@@ -85,7 +87,7 @@ App::~App()
 }
 
 
-int App::exec()
+int xmrig::App::exec()
 {
     if (m_controller->isDone()) {
         return 0;
@@ -139,7 +141,7 @@ int App::exec()
 }
 
 
-void App::onConsoleCommand(char command)
+void xmrig::App::onConsoleCommand(char command)
 {
     switch (command) {
     case 'h':
@@ -174,7 +176,7 @@ void App::onConsoleCommand(char command)
 }
 
 
-void App::close()
+void xmrig::App::close()
 {
     m_controller->network()->stop();
     Workers::stop();
@@ -183,12 +185,12 @@ void App::close()
 }
 
 
-void App::release()
+void xmrig::App::release()
 {
 }
 
 
-void App::onSignal(uv_signal_t *handle, int signum)
+void xmrig::App::onSignal(uv_signal_t *handle, int signum)
 {
     switch (signum)
     {
diff --git a/src/App.h b/src/App.h
index 964400e6b..b93fc4a1d 100644
--- a/src/App.h
+++ b/src/App.h
@@ -5,7 +5,9 @@
  * Copyright 2014-2016 Wolf9466    <https://github.com/OhGodAPet>
  * Copyright 2016      Jay D Dee   <jayddee246@gmail.com>
  * Copyright 2017-2018 XMR-Stak    <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
- * Copyright 2016-2018 XMRig       <https://github.com/xmrig>, <support@xmrig.com>
+ * Copyright 2018      Lee Clagett <https://github.com/vtnerd>
+ * Copyright 2018-2019 SChernykh   <https://github.com/SChernykh>
+ * Copyright 2016-2019 XMRig       <https://github.com/xmrig>, <support@xmrig.com>
  *
  *   This program is free software: you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -21,8 +23,8 @@
  *   along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef __APP_H__
-#define __APP_H__
+#ifndef XMRIG_APP_H
+#define XMRIG_APP_H
 
 
 #include <uv.h>
@@ -34,19 +36,20 @@
 class Console;
 class Httpd;
 class Network;
-class Options;
 
 
 namespace xmrig {
-    class Controller;
-}
+
+
+class Controller;
+class Process;
 
 
 class App : public IConsoleListener
 {
 public:
-  App(int argc, char **argv);
-  ~App();
+  App(Process *process);
+  ~App() override;
 
   int exec();
 
@@ -71,4 +74,7 @@ private:
 };
 
 
-#endif /* __APP_H__ */
+} /* namespace xmrig */
+
+
+#endif /* XMRIG_APP_H */
diff --git a/src/App_unix.cpp b/src/App_unix.cpp
index 45f73d2dc..2b598c229 100644
--- a/src/App_unix.cpp
+++ b/src/App_unix.cpp
@@ -5,7 +5,8 @@
  * Copyright 2014-2016 Wolf9466    <https://github.com/OhGodAPet>
  * Copyright 2016      Jay D Dee   <jayddee246@gmail.com>
  * Copyright 2017-2018 XMR-Stak    <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
- * Copyright 2016-2018 XMRig       <https://github.com/xmrig>, <support@xmrig.com>
+ * Copyright 2018-2019 SChernykh   <https://github.com/SChernykh>
+ * Copyright 2016-2019 XMRig       <https://github.com/xmrig>, <support@xmrig.com>
  *
  *   This program is free software: you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -34,7 +35,7 @@
 #include "core/Controller.h"
 
 
-void App::background()
+void xmrig::App::background()
 {
     signal(SIGPIPE, SIG_IGN);
 
diff --git a/src/App_win.cpp b/src/App_win.cpp
index 9b923870e..57f57a6df 100644
--- a/src/App_win.cpp
+++ b/src/App_win.cpp
@@ -5,7 +5,8 @@
  * Copyright 2014-2016 Wolf9466    <https://github.com/OhGodAPet>
  * Copyright 2016      Jay D Dee   <jayddee246@gmail.com>
  * Copyright 2017-2018 XMR-Stak    <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
- * Copyright 2016-2018 XMRig       <https://github.com/xmrig>, <support@xmrig.com>
+ * Copyright 2018-2019 SChernykh   <https://github.com/SChernykh>
+ * Copyright 2016-2019 XMRig       <https://github.com/xmrig>, <support@xmrig.com>
  *
  *   This program is free software: you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -31,7 +32,7 @@
 #include "core/Config.h"
 
 
-void App::background()
+void xmrig::App::background()
 {
     if (!m_controller->config()->isBackground()) {
         return;
diff --git a/src/base/kernel/Process.cpp b/src/base/kernel/Process.cpp
new file mode 100644
index 000000000..0bc40e2da
--- /dev/null
+++ b/src/base/kernel/Process.cpp
@@ -0,0 +1,101 @@
+/* XMRig
+ * Copyright 2010      Jeff Garzik <jgarzik@pobox.com>
+ * Copyright 2012-2014 pooler      <pooler@litecoinpool.org>
+ * Copyright 2014      Lucas Jones <https://github.com/lucasjones>
+ * Copyright 2014-2016 Wolf9466    <https://github.com/OhGodAPet>
+ * Copyright 2016      Jay D Dee   <jayddee246@gmail.com>
+ * Copyright 2017-2018 XMR-Stak    <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
+ * Copyright 2018-2019 SChernykh   <https://github.com/SChernykh>
+ * Copyright 2016-2019 XMRig       <https://github.com/xmrig>, <support@xmrig.com>
+ *
+ *   This program is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program 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 General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <uv.h>
+#include <time.h>
+
+
+#include "base/kernel/Process.h"
+
+
+static size_t location(xmrig::Process::Location location, char *buf, size_t max)
+{
+    using namespace xmrig;
+
+    size_t size = max;
+    if (location == Process::ExeLocation) {
+        return uv_exepath(buf, &size) < 0 ? 0 : size;
+    }
+
+    if (location == Process::CwdLocation) {
+        return uv_cwd(buf, &size) < 0 ? 0 : size;
+    }
+
+    return 0;
+}
+
+
+xmrig::Process::Process(int argc, char **argv) :
+    m_arguments(argc, argv)
+{
+    srand(static_cast<unsigned int>(static_cast<uintptr_t>(time(nullptr)) ^ reinterpret_cast<uintptr_t>(this)));
+}
+
+
+xmrig::Process::~Process()
+{
+}
+
+
+xmrig::String xmrig::Process::location(Location location, const char *fileName) const
+{
+    constexpr const size_t max = 520;
+
+    char *buf   = new char[max]();
+    size_t size = ::location(location, buf, max);
+
+    if (size == 0) {
+        delete [] buf;
+
+        return String();
+    }
+
+    if (fileName == nullptr) {
+        return buf;
+    }
+
+    if (location == ExeLocation) {
+        char *p = strrchr(buf, kDirSeparator);
+
+        if (p == nullptr) {
+            delete [] buf;
+
+            return String();
+        }
+
+        size = static_cast<size_t>(p - buf);
+    }
+
+    if ((size + strlen(fileName) + 2) >= max) {
+        delete [] buf;
+
+        return String();
+    }
+
+    buf[size] = kDirSeparator;
+    strcpy(buf + size + 1, fileName);
+
+    return buf;
+}
diff --git a/src/base/kernel/Process.h b/src/base/kernel/Process.h
new file mode 100644
index 000000000..9b29eb57f
--- /dev/null
+++ b/src/base/kernel/Process.h
@@ -0,0 +1,64 @@
+/* XMRig
+ * Copyright 2010      Jeff Garzik <jgarzik@pobox.com>
+ * Copyright 2012-2014 pooler      <pooler@litecoinpool.org>
+ * Copyright 2014      Lucas Jones <https://github.com/lucasjones>
+ * Copyright 2014-2016 Wolf9466    <https://github.com/OhGodAPet>
+ * Copyright 2016      Jay D Dee   <jayddee246@gmail.com>
+ * Copyright 2017-2018 XMR-Stak    <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
+ * Copyright 2018-2019 SChernykh   <https://github.com/SChernykh>
+ * Copyright 2016-2019 XMRig       <https://github.com/xmrig>, <support@xmrig.com>
+ *
+ *   This program is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program 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 General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef XMRIG_PROCESS_H
+#define XMRIG_PROCESS_H
+
+
+#include "base/tools/Arguments.h"
+
+
+namespace xmrig {
+
+
+class Process
+{
+public:
+    enum Location {
+        ExeLocation,
+        CwdLocation
+    };
+
+#   ifdef WIN32
+    constexpr const static char kDirSeparator = '\\';
+#   else
+    constexpr const static char kDirSeparator = '/';
+#   endif
+
+    Process(int argc, char **argv);
+    ~Process();
+
+    String location(Location location, const char *fileName = nullptr) const;
+
+    inline const Arguments &arguments() const { return m_arguments; }
+
+private:
+    Arguments m_arguments;
+};
+
+
+} /* namespace xmrig */
+
+
+#endif /* XMRIG_PROCESS_H */
diff --git a/src/base/tools/Arguments.cpp b/src/base/tools/Arguments.cpp
new file mode 100644
index 000000000..3713dd116
--- /dev/null
+++ b/src/base/tools/Arguments.cpp
@@ -0,0 +1,76 @@
+/* XMRig
+ * Copyright 2010      Jeff Garzik <jgarzik@pobox.com>
+ * Copyright 2012-2014 pooler      <pooler@litecoinpool.org>
+ * Copyright 2014      Lucas Jones <https://github.com/lucasjones>
+ * Copyright 2014-2016 Wolf9466    <https://github.com/OhGodAPet>
+ * Copyright 2016      Jay D Dee   <jayddee246@gmail.com>
+ * Copyright 2017-2018 XMR-Stak    <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
+ * Copyright 2018-2019 SChernykh   <https://github.com/SChernykh>
+ * Copyright 2016-2019 XMRig       <https://github.com/xmrig>, <support@xmrig.com>
+ *
+ *   This program is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program 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 General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <algorithm>
+#include <uv.h>
+
+
+#include "base/tools/Arguments.h"
+
+
+xmrig::Arguments::Arguments(int argc, char **argv) :
+    m_argv(argv),
+    m_argc(argc)
+{
+    uv_setup_args(argc, argv);
+
+    for (size_t i = 0; i < static_cast<size_t>(argc); ++i) {
+        add(argv[i]);
+    }
+}
+
+
+bool xmrig::Arguments::hasArg(const char *name) const
+{
+    if (m_argc == 1) {
+        return false;
+    }
+
+    return std::find(m_data.begin() + 1, m_data.end(), name) != m_data.end();
+}
+
+
+void xmrig::Arguments::add(const char *arg)
+{
+    if (arg == nullptr) {
+        return;
+    }
+
+    const size_t size = strlen(arg);
+    if (size > 4 && arg[0] == '-' && arg[1] == '-') {
+        const char *p = strstr(arg, "=");
+
+        if (p) {
+            const size_t keySize = static_cast<size_t>(p - arg);
+
+            m_data.push_back(String(arg, keySize));
+            m_data.push_back(arg + keySize + 1);
+
+            return;
+        }
+    }
+
+    m_data.push_back(arg);
+}
diff --git a/src/base/tools/Arguments.h b/src/base/tools/Arguments.h
new file mode 100644
index 000000000..e47e39e38
--- /dev/null
+++ b/src/base/tools/Arguments.h
@@ -0,0 +1,61 @@
+/* XMRig
+ * Copyright 2010      Jeff Garzik <jgarzik@pobox.com>
+ * Copyright 2012-2014 pooler      <pooler@litecoinpool.org>
+ * Copyright 2014      Lucas Jones <https://github.com/lucasjones>
+ * Copyright 2014-2016 Wolf9466    <https://github.com/OhGodAPet>
+ * Copyright 2016      Jay D Dee   <jayddee246@gmail.com>
+ * Copyright 2017-2018 XMR-Stak    <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
+ * Copyright 2018-2019 SChernykh   <https://github.com/SChernykh>
+ * Copyright 2016-2019 XMRig       <https://github.com/xmrig>, <support@xmrig.com>
+ *
+ *   This program is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program 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 General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef XMRIG_ARGUMENTS_H
+#define XMRIG_ARGUMENTS_H
+
+
+#include <vector>
+
+
+#include "base/tools/String.h"
+
+
+namespace xmrig {
+
+
+class Arguments
+{
+public:
+    Arguments(int argc, char **argv);
+
+    bool hasArg(const char *name) const;
+
+    inline char **argv() const                     { return m_argv; }
+    inline const std::vector<String> &data() const { return m_data; }
+    inline int argc() const                        { return m_argc; }
+
+private:
+    void add(const char *arg);
+
+    char **m_argv;
+    int m_argc;
+    std::vector<String> m_data;
+};
+
+
+} /* namespace xmrig */
+
+
+#endif /* XMRIG_ARGUMENTS_H */
diff --git a/src/common/Platform.cpp b/src/common/Platform.cpp
index 17fcc38e6..6bd0ac80d 100644
--- a/src/common/Platform.cpp
+++ b/src/common/Platform.cpp
@@ -5,8 +5,8 @@
  * Copyright 2014-2016 Wolf9466    <https://github.com/OhGodAPet>
  * Copyright 2016      Jay D Dee   <jayddee246@gmail.com>
  * Copyright 2017-2018 XMR-Stak    <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
- * Copyright 2018      SChernykh   <https://github.com/SChernykh>
- * Copyright 2016-2018 XMRig       <https://github.com/xmrig>, <support@xmrig.com>
+ * Copyright 2018-2019 SChernykh   <https://github.com/SChernykh>
+ * Copyright 2016-2019 XMRig       <https://github.com/xmrig>, <support@xmrig.com>
  *
  *   This program is free software: you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -36,40 +36,9 @@
 #include "Platform.h"
 
 
-char Platform::m_defaultConfigName[520] = { 0 };
 xmrig::String Platform::m_userAgent;
 
 
-const char *Platform::defaultConfigName()
-{
-    size_t size = 520;
-
-    if (*m_defaultConfigName) {
-        return m_defaultConfigName;
-    }
-
-    if (uv_exepath(m_defaultConfigName, &size) < 0) {
-        return nullptr;
-    }
-
-    if (size < 500) {
-#       ifdef WIN32
-        char *p = strrchr(m_defaultConfigName, '\\');
-#       else
-        char *p = strrchr(m_defaultConfigName, '/');
-#       endif
-
-        if (p) {
-            strcpy(p + 1, "config.json");
-            return m_defaultConfigName;
-        }
-    }
-
-    *m_defaultConfigName = '\0';
-    return nullptr;
-}
-
-
 void Platform::init(const char *userAgent)
 {
 #   ifndef XMRIG_NO_TLS
diff --git a/src/common/Platform.h b/src/common/Platform.h
index fc10e83b3..85f08a2eb 100644
--- a/src/common/Platform.h
+++ b/src/common/Platform.h
@@ -5,8 +5,8 @@
  * Copyright 2014-2016 Wolf9466    <https://github.com/OhGodAPet>
  * Copyright 2016      Jay D Dee   <jayddee246@gmail.com>
  * Copyright 2017-2018 XMR-Stak    <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
- * Copyright 2018      SChernykh   <https://github.com/SChernykh>
- * Copyright 2016-2018 XMRig       <https://github.com/xmrig>, <support@xmrig.com>
+ * Copyright 2018-2019 SChernykh   <https://github.com/SChernykh>
+ * Copyright 2016-2019 XMRig       <https://github.com/xmrig>, <support@xmrig.com>
  *
  *   This program is free software: you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -36,19 +36,17 @@ class Platform
 {
 public:
     static bool setThreadAffinity(uint64_t cpu_id);
-    static const char *defaultConfigName();
     static uint32_t setTimerResolution(uint32_t resolution);
     static void init(const char *userAgent);
     static void restoreTimerResolution();
     static void setProcessPriority(int priority);
     static void setThreadPriority(int priority);
 
-    static inline const char *userAgent() { return m_userAgent.data(); }
+    static inline const char *userAgent() { return m_userAgent; }
 
 private:
     static char *createUserAgent();
 
-    static char m_defaultConfigName[520];
     static xmrig::String m_userAgent;
 };
 
diff --git a/src/common/config/ConfigLoader.cpp b/src/common/config/ConfigLoader.cpp
index c60953a12..42c93f5c3 100644
--- a/src/common/config/ConfigLoader.cpp
+++ b/src/common/config/ConfigLoader.cpp
@@ -40,6 +40,7 @@
 
 #include "base/io/Json.h"
 #include "base/kernel/interfaces/IConfigListener.h"
+#include "base/kernel/Process.h"
 #include "common/config/ConfigLoader.h"
 #include "common/config/ConfigWatcher.h"
 #include "common/interfaces/IConfig.h"
@@ -144,13 +145,15 @@ bool xmrig::ConfigLoader::reload(xmrig::IConfig *oldConfig, const char *json)
 }
 
 
-xmrig::IConfig *xmrig::ConfigLoader::load(int argc, char **argv, IConfigCreator *creator, IConfigListener *listener)
+xmrig::IConfig *xmrig::ConfigLoader::load(Process *process, IConfigCreator *creator, IConfigListener *listener)
 {
     m_creator  = creator;
     m_listener = listener;
 
     xmrig::IConfig *config = m_creator->create();
     int key;
+    int argc    = process->arguments().argc();
+    char **argv = process->arguments().argv();
 
     while (1) {
         key = getopt_long(argc, argv, short_options, options, nullptr);
@@ -174,7 +177,7 @@ xmrig::IConfig *xmrig::ConfigLoader::load(int argc, char **argv, IConfigCreator
         delete config;
 
         config = m_creator->create();
-        loadFromFile(config, Platform::defaultConfigName());
+        loadFromFile(config, process->location(Process::ExeLocation, "config.json"));
     }
 
     if (!config->finalize()) {
diff --git a/src/common/config/ConfigLoader.h b/src/common/config/ConfigLoader.h
index 13ac357bf..0a85ab944 100644
--- a/src/common/config/ConfigLoader.h
+++ b/src/common/config/ConfigLoader.h
@@ -42,6 +42,7 @@ class ConfigWatcher;
 class IConfigCreator;
 class IConfigListener;
 class IConfig;
+class Process;
 
 
 class ConfigLoader
@@ -51,7 +52,7 @@ public:
     static bool loadFromJSON(IConfig *config, const char *json);
     static bool loadFromJSON(IConfig *config, const rapidjson::Document &doc);
     static bool reload(IConfig *oldConfig, const char *json);
-    static IConfig *load(int argc, char **argv, IConfigCreator *creator, IConfigListener *listener);
+    static IConfig *load(Process *process, IConfigCreator *creator, IConfigListener *listener);
     static void release();
 
     static inline bool isDone() { return m_done; }
diff --git a/src/core/Config.cpp b/src/core/Config.cpp
index 1decb9410..f54f092b7 100644
--- a/src/core/Config.cpp
+++ b/src/core/Config.cpp
@@ -139,9 +139,9 @@ void xmrig::Config::getJSON(rapidjson::Document &doc) const
 }
 
 
-xmrig::Config *xmrig::Config::load(int argc, char **argv, IConfigListener *listener)
+xmrig::Config *xmrig::Config::load(Process *process, IConfigListener *listener)
 {
-    return static_cast<Config*>(ConfigLoader::load(argc, argv, new ConfigCreator(), listener));
+    return static_cast<Config*>(ConfigLoader::load(process, new ConfigCreator(), listener));
 }
 
 
diff --git a/src/core/Config.h b/src/core/Config.h
index 5b40a47e4..d2e8c166e 100644
--- a/src/core/Config.h
+++ b/src/core/Config.h
@@ -35,16 +35,13 @@
 #include "workers/CpuThread.h"
 
 
-class Addr;
-class Url;
-
-
 namespace xmrig {
 
 
 class ConfigLoader;
 class IThread;
 class IConfigListener;
+class Process;
 
 
 /**
@@ -85,7 +82,7 @@ public:
     inline int64_t affinity() const                      { return m_threads.mask; }
     inline ThreadsMode threadsMode() const               { return m_threads.mode; }
 
-    static Config *load(int argc, char **argv, IConfigListener *listener);
+    static Config *load(Process *process, IConfigListener *listener);
 
 protected:
     bool finalize() override;
diff --git a/src/core/Controller.cpp b/src/core/Controller.cpp
index b9c64ca1c..1113c6d5d 100644
--- a/src/core/Controller.cpp
+++ b/src/core/Controller.cpp
@@ -46,8 +46,9 @@
 class xmrig::ControllerPrivate
 {
 public:
-    inline ControllerPrivate() :
+    inline ControllerPrivate(Process *process) :
         network(nullptr),
+        process(process),
         config(nullptr)
     {}
 
@@ -60,13 +61,14 @@ public:
 
 
     Network *network;
+    Process *process;
     std::vector<xmrig::IControllerListener *> listeners;
     xmrig::Config *config;
 };
 
 
-xmrig::Controller::Controller()
-    : d_ptr(new ControllerPrivate())
+xmrig::Controller::Controller(Process *process)
+    : d_ptr(new ControllerPrivate(process))
 {
 }
 
@@ -99,11 +101,11 @@ xmrig::Config *xmrig::Controller::config() const
 }
 
 
-int xmrig::Controller::init(int argc, char **argv)
+int xmrig::Controller::init()
 {
     Cpu::init();
 
-    d_ptr->config = xmrig::Config::load(argc, argv, this);
+    d_ptr->config = xmrig::Config::load(d_ptr->process, this);
     if (!d_ptr->config) {
         return 1;
     }
diff --git a/src/core/Controller.h b/src/core/Controller.h
index 199343734..7bb34db2f 100644
--- a/src/core/Controller.h
+++ b/src/core/Controller.h
@@ -39,18 +39,19 @@ namespace xmrig {
 class Config;
 class ControllerPrivate;
 class IControllerListener;
+class Process;
 
 
 class Controller : public IConfigListener
 {
 public:
-    Controller();
+    Controller(Process *process);
     ~Controller() override;
 
     bool isDone() const;
     bool isReady() const;
     Config *config() const;
-    int init(int argc, char **argv);
+    int init();
     Network *network() const;
     void addListener(IControllerListener *listener);
 
diff --git a/src/xmrig.cpp b/src/xmrig.cpp
index 48362adaa..eec5f5faf 100644
--- a/src/xmrig.cpp
+++ b/src/xmrig.cpp
@@ -4,8 +4,9 @@
  * Copyright 2014      Lucas Jones <https://github.com/lucasjones>
  * Copyright 2014-2016 Wolf9466    <https://github.com/OhGodAPet>
  * Copyright 2016      Jay D Dee   <jayddee246@gmail.com>
- * Copyright 2016-2017 XMRig       <support@xmrig.com>
- *
+ * Copyright 2017-2018 XMR-Stak    <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
+ * Copyright 2018-2019 SChernykh   <https://github.com/SChernykh>
+ * Copyright 2016-2019 XMRig       <https://github.com/xmrig>, <support@xmrig.com>
  *
  *   This program is free software: you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -22,10 +23,13 @@
  */
 
 #include "App.h"
+#include "base/kernel/Process.h"
 
 
 int main(int argc, char **argv) {
-    App app(argc, argv);
+    xmrig::Process process(argc, argv);
+
+    xmrig::App app(&process);
 
     return app.exec();
 }