The new GeckoChildID type introduced in this patch is inspired by the existing ContentParentID type used by ContentParent, but is currently distinct. It is supported by all process types at the GeckoChildProcessHost level and can be read for the current process from anywhere. As this type is similar in many ways to the process type, and should be available as early as possible within child processes, this was added alongside the GeckoProcessType value within mozglue to make that easier to do. The type was chosen to be an int32_t to make it feel similar to a PID, which we currently use for process identity comparisons across the codebase. The intention is for GeckoChildID to be preferred for these within-gecko checks, as these IDs will not be re-used and can be known earlier during child process creation. Differential Revision: https://phabricator.services.mozilla.com/D217117
63 lines
1.8 KiB
C++
63 lines
1.8 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
* vim: sw=2 ts=4 et :
|
|
* 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/. */
|
|
|
|
#include "nsXPCOM.h"
|
|
#include "nsXULAppAPI.h"
|
|
#include "mozilla/Bootstrap.h"
|
|
#include "mozilla/ProcessType.h"
|
|
#include "XREChildData.h"
|
|
|
|
#ifdef XP_WIN
|
|
# include <windows.h>
|
|
// we want a wmain entry point
|
|
# include "nsWindowsWMain.cpp"
|
|
#else
|
|
// FIXME/cjones testing
|
|
# include <unistd.h>
|
|
#endif
|
|
|
|
#if defined(XP_WIN) && defined(MOZ_SANDBOX)
|
|
# include "mozilla/sandboxing/SandboxInitialization.h"
|
|
# include "mozilla/sandboxing/sandboxLogging.h"
|
|
#endif
|
|
|
|
int content_process_main(mozilla::Bootstrap* bootstrap, int argc,
|
|
char* argv[]) {
|
|
// Check for the absolute minimum number of args we need to move
|
|
// forward here. We expect the last arg to be the child process type, and the
|
|
// second-last argument to be the gecko child id.
|
|
if (argc < 2) {
|
|
return 3;
|
|
}
|
|
|
|
XREChildData childData;
|
|
|
|
#if defined(XP_WIN) && defined(MOZ_SANDBOX)
|
|
if (IsSandboxedProcess()) {
|
|
childData.sandboxTargetServices =
|
|
mozilla::sandboxing::GetInitializedTargetServices();
|
|
if (!childData.sandboxTargetServices) {
|
|
return 1;
|
|
}
|
|
|
|
childData.ProvideLogFunction = mozilla::sandboxing::ProvideLogFunction;
|
|
}
|
|
#endif
|
|
|
|
mozilla::SetGeckoProcessType(argv[--argc]);
|
|
mozilla::SetGeckoChildID(argv[--argc]);
|
|
|
|
#if defined(XP_WIN) && defined(MOZ_SANDBOX)
|
|
if (mozilla::GetGeckoProcessType() == GeckoProcessType_RemoteSandboxBroker) {
|
|
childData.sandboxBrokerServices =
|
|
mozilla::sandboxing::GetInitializedBrokerServices();
|
|
}
|
|
#endif
|
|
|
|
nsresult rv = bootstrap->XRE_InitChildProcess(argc, argv, &childData);
|
|
return NS_FAILED(rv);
|
|
}
|