1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- // Copyright (c) 2022 Slack Technologies, Inc.
- // Use of this source code is governed by the MIT license that can be
- // found in the LICENSE file.
- #include <cstdlib>
- #include <memory>
- #include "base/strings/cstring_view.h"
- #include "electron/fuses.h"
- #include "electron/mas.h"
- #include "shell/app/electron_library_main.h"
- #include "shell/app/uv_stdio_fix.h"
- #include "shell/common/electron_constants.h"
- #if defined(HELPER_EXECUTABLE) && !IS_MAS_BUILD()
- #include <mach-o/dyld.h>
- #include <cstdio>
- #include "sandbox/mac/seatbelt_exec.h" // nogncheck
- #endif
- extern "C" {
- // abort_report_np() records the message in a special section that both the
- // system CrashReporter and Crashpad collect in crash reports. Using a Crashpad
- // Annotation would be preferable, but this executable cannot depend on
- // Crashpad directly.
- void abort_report_np(const char* fmt, ...);
- }
- namespace {
- [[nodiscard]] bool IsEnvSet(const base::cstring_view name) {
- const char* const indicator = getenv(name.c_str());
- return indicator && *indicator;
- }
- #if defined(HELPER_EXECUTABLE) && !IS_MAS_BUILD()
- [[noreturn]] void FatalError(const char* format, ...) {
- va_list valist;
- va_start(valist, format);
- char message[4096];
- if (vsnprintf(message, sizeof(message), format, valist) >= 0) {
- fputs(message, stderr);
- abort_report_np("%s", message);
- }
- va_end(valist);
- abort();
- }
- #endif
- } // namespace
- int main(int argc, char* argv[]) {
- FixStdioStreams();
- if (electron::fuses::IsRunAsNodeEnabled() && IsEnvSet(electron::kRunAsNode)) {
- return ElectronInitializeICUandStartNode(argc, argv);
- }
- #if defined(HELPER_EXECUTABLE) && !IS_MAS_BUILD()
- uint32_t exec_path_size = 0;
- int rv = _NSGetExecutablePath(nullptr, &exec_path_size);
- if (rv != -1) {
- FatalError("_NSGetExecutablePath: get length failed.");
- }
- auto exec_path = std::make_unique<char[]>(exec_path_size);
- rv = _NSGetExecutablePath(exec_path.get(), &exec_path_size);
- if (rv != 0) {
- FatalError("_NSGetExecutablePath: get path failed.");
- }
- sandbox::SeatbeltExecServer::CreateFromArgumentsResult seatbelt =
- sandbox::SeatbeltExecServer::CreateFromArguments(exec_path.get(), argc,
- argv);
- if (seatbelt.sandbox_required) {
- if (!seatbelt.server) {
- FatalError("Failed to create seatbelt sandbox server.");
- }
- if (!seatbelt.server->InitializeSandbox()) {
- FatalError("Failed to initialize sandbox.");
- }
- }
- #endif // defined(HELPER_EXECUTABLE) && !IS_MAS_BUILD
- return ElectronMain(argc, argv);
- }
|