summaryrefslogtreecommitdiffstats
path: root/toolkit/xre/GeckoArgs.h
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/xre/GeckoArgs.h')
-rw-r--r--toolkit/xre/GeckoArgs.h149
1 files changed, 149 insertions, 0 deletions
diff --git a/toolkit/xre/GeckoArgs.h b/toolkit/xre/GeckoArgs.h
new file mode 100644
index 0000000000..667ddb4ba4
--- /dev/null
+++ b/toolkit/xre/GeckoArgs.h
@@ -0,0 +1,149 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_GeckoArgs_h
+#define mozilla_GeckoArgs_h
+
+#include "mozilla/CmdLineAndEnvUtils.h"
+#include "mozilla/Maybe.h"
+
+#include <array>
+#include <cctype>
+#include <climits>
+#include <string>
+#include <vector>
+
+namespace mozilla {
+
+namespace geckoargs {
+
+template <typename T>
+struct CommandLineArg {
+ Maybe<T> Get(int& aArgc, char** aArgv,
+ const CheckArgFlag aFlags = CheckArgFlag::RemoveArg);
+
+ const char* Name() { return sName; };
+
+ void Put(std::vector<std::string>& aArgs);
+ void Put(T aValue, std::vector<std::string>& aArgs);
+
+ const char* sName;
+ const char* sMatch;
+};
+
+/// Get()
+
+template <>
+inline Maybe<const char*> CommandLineArg<const char*>::Get(
+ int& aArgc, char** aArgv, const CheckArgFlag aFlags) {
+ MOZ_ASSERT(aArgv, "aArgv must be initialized before CheckArg()");
+ const char* rv = nullptr;
+ if (ARG_FOUND == CheckArg(aArgc, aArgv, sMatch, &rv, aFlags)) {
+ return Some(rv);
+ }
+ return Nothing();
+}
+
+template <>
+inline Maybe<bool> CommandLineArg<bool>::Get(int& aArgc, char** aArgv,
+ const CheckArgFlag aFlags) {
+ MOZ_ASSERT(aArgv, "aArgv must be initialized before CheckArg()");
+ if (ARG_FOUND ==
+ CheckArg(aArgc, aArgv, sMatch, (const char**)nullptr, aFlags)) {
+ return Some(true);
+ }
+ return Nothing();
+}
+
+template <>
+inline Maybe<uint64_t> CommandLineArg<uint64_t>::Get(
+ int& aArgc, char** aArgv, const CheckArgFlag aFlags) {
+ MOZ_ASSERT(aArgv, "aArgv must be initialized before CheckArg()");
+ const char* rv = nullptr;
+ if (ARG_FOUND == CheckArg(aArgc, aArgv, sMatch, &rv, aFlags)) {
+ errno = 0;
+ char* endptr = nullptr;
+ uint64_t conv = std::strtoull(rv, &endptr, 10);
+ if (errno == 0 && endptr && *endptr == '\0') {
+ return Some(conv);
+ }
+ }
+ return Nothing();
+}
+
+/// Put()
+
+template <>
+inline void CommandLineArg<const char*>::Put(const char* aValue,
+ std::vector<std::string>& aArgs) {
+ aArgs.push_back(Name());
+ aArgs.push_back(aValue);
+}
+
+template <>
+inline void CommandLineArg<bool>::Put(bool aValue,
+ std::vector<std::string>& aArgs) {
+ if (aValue) {
+ aArgs.push_back(Name());
+ }
+}
+
+template <>
+inline void CommandLineArg<bool>::Put(std::vector<std::string>& aArgs) {
+ Put(true, aArgs);
+}
+
+template <>
+inline void CommandLineArg<uint64_t>::Put(uint64_t aValue,
+ std::vector<std::string>& aArgs) {
+ aArgs.push_back(Name());
+ aArgs.push_back(std::to_string(aValue));
+}
+
+#if defined(__GNUC__)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wunused-variable"
+#endif
+
+static CommandLineArg<const char*> sParentBuildID{"-parentBuildID",
+ "parentbuildid"};
+static CommandLineArg<const char*> sAppDir{"-appDir", "appdir"};
+static CommandLineArg<const char*> sProfile{"-profile", "profile"};
+
+static CommandLineArg<uint64_t> sJsInitHandle{"-jsInitHandle", "jsinithandle"};
+static CommandLineArg<uint64_t> sJsInitLen{"-jsInitLen", "jsinitlen"};
+static CommandLineArg<uint64_t> sPrefsHandle{"-prefsHandle", "prefshandle"};
+static CommandLineArg<uint64_t> sPrefsLen{"-prefsLen", "prefslen"};
+static CommandLineArg<uint64_t> sPrefMapHandle{"-prefMapHandle",
+ "prefmaphandle"};
+static CommandLineArg<uint64_t> sPrefMapSize{"-prefMapSize", "prefmapsize"};
+
+static CommandLineArg<uint64_t> sChildID{"-childID", "childid"};
+
+static CommandLineArg<uint64_t> sSandboxingKind{"-sandboxingKind",
+ "sandboxingkind"};
+
+static CommandLineArg<bool> sSafeMode{"-safeMode", "safemode"};
+
+static CommandLineArg<bool> sIsForBrowser{"-isForBrowser", "isforbrowser"};
+static CommandLineArg<bool> sNotForBrowser{"-notForBrowser", "notforbrowser"};
+
+#if defined(XP_WIN)
+# if defined(MOZ_SANDBOX)
+static CommandLineArg<bool> sWin32kLockedDown{"-win32kLockedDown",
+ "win32klockeddown"};
+# endif // defined(MOZ_SANDBOX)
+static CommandLineArg<bool> sDisableDynamicDllBlocklist{
+ "-disableDynamicBlocklist", "disabledynamicblocklist"};
+#endif // defined(XP_WIN)
+
+#if defined(__GNUC__)
+# pragma GCC diagnostic pop
+#endif
+
+} // namespace geckoargs
+
+} // namespace mozilla
+
+#endif // mozilla_GeckoArgs_h