зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1569089 - Sync std handles after AttachConsole(). r=aklotz
AttachConsole() may change Win32 std handle values if Firefox is launched from cmd.exe that makes discrepancy between Win32 and CRT. This patch synchronizes both std handles. Differential Revision: https://phabricator.services.mozilla.com/D51275 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
a85ff06ef1
Коммит
2ee472c867
|
@ -10,23 +10,41 @@
|
|||
|
||||
namespace mozilla {
|
||||
|
||||
static void AssignStdHandle(const char* aPath, const char* aMode, FILE* aStream,
|
||||
DWORD aStdHandle) {
|
||||
// Visual Studio's _fileno() returns -2 for the standard
|
||||
// streams if they aren't associated with an output stream.
|
||||
const int fd = _fileno(aStream);
|
||||
if (fd == -2) {
|
||||
freopen(aPath, aMode, aStream);
|
||||
return;
|
||||
}
|
||||
if (fd < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(fd));
|
||||
if (handle == INVALID_HANDLE_VALUE) {
|
||||
return;
|
||||
}
|
||||
|
||||
const HANDLE oldHandle = GetStdHandle(aStdHandle);
|
||||
if (handle == oldHandle) {
|
||||
return;
|
||||
}
|
||||
|
||||
SetStdHandle(aStdHandle, handle);
|
||||
}
|
||||
|
||||
// This code attaches the process to the appropriate console.
|
||||
void UseParentConsole() {
|
||||
if (AttachConsole(ATTACH_PARENT_PROCESS)) {
|
||||
// Redirect the standard streams to the existing console, but
|
||||
// only if they haven't been redirected to a valid file.
|
||||
// Visual Studio's _fileno() returns -2 for the standard
|
||||
// streams if they aren't associated with an output stream.
|
||||
if (_fileno(stdout) == -2) {
|
||||
freopen("CONOUT$", "w", stdout);
|
||||
}
|
||||
AssignStdHandle("CONOUT$", "w", stdout, STD_OUTPUT_HANDLE);
|
||||
// There is no CONERR$, so use CONOUT$ for stderr as well.
|
||||
if (_fileno(stderr) == -2) {
|
||||
freopen("CONOUT$", "w", stderr);
|
||||
}
|
||||
if (_fileno(stdin) == -2) {
|
||||
freopen("CONIN$", "r", stdin);
|
||||
}
|
||||
AssignStdHandle("CONOUT$", "w", stderr, STD_ERROR_HANDLE);
|
||||
AssignStdHandle("CONIN$", "r", stdin, STD_INPUT_HANDLE);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче