- Timestamp:
- Mar 20, 2018 3:28:01 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/kmkbuiltin/redirect.c
r3162 r3163 105 105 # define ONLY_TARGET_STANDARD_HANDLES 106 106 #endif 107 108 109 110 #if defined(_MSC_VER)111 112 113 /** Used by safeCloseFd. */114 static void __cdecl ignore_invalid_parameter(const wchar_t *a, const wchar_t *b, const wchar_t *c, unsigned d, uintptr_t e)115 {116 }117 118 #endif /* _MSC_VER */119 120 #if 0 /* unused */121 /**122 * Safely works around MS CRT's pedantic close() function.123 *124 * @param fd The file handle.125 */126 static void safeCloseFd(int fd)127 {128 #ifdef _MSC_VER129 _invalid_parameter_handler pfnOld = _get_invalid_parameter_handler();130 _set_invalid_parameter_handler(ignore_invalid_parameter);131 close(fd);132 _set_invalid_parameter_handler(pfnOld);133 #else134 close(fd);135 #endif136 }137 #endif /* unused */138 107 139 108 … … 231 200 #ifdef _MSC_VER 232 201 202 /** Used by mscGetOsHandle. */ 203 static void __cdecl ignore_invalid_parameter(const wchar_t *a, const wchar_t *b, const wchar_t *c, unsigned d, uintptr_t e) 204 { 205 } 206 233 207 /** 234 208 * Safe way of getting the OS handle of a file descriptor without triggering … … 375 349 static KBOOL kRedirectHasConflict(int fd, unsigned cOrders, REDIRECTORDERS *paOrders) 376 350 { 351 #ifdef ONLY_TARGET_STANDARD_HANDLES 352 if (fd >= 3) 353 return K_TRUE; 354 #else 377 355 while (cOrders-- > 0) 378 356 if (paOrders[cOrders].fdTarget == fd) 379 357 return K_TRUE; 358 #endif 380 359 return K_FALSE; 381 360 } … … 434 413 if (!kRedirectHasConflict(fdOpened, cOrders, paOrders)) 435 414 { 415 #ifndef KBUILD_OS_WINDOWS 436 416 if (fdOpened != fdTarget) 437 417 return fdOpened; 438 #ifndef _MSC_VER /* Stupid, stupid MSVCRT! No friggin way of making a handle inheritable (or not). */439 418 # ifndef USE_FD_CLOEXEC 440 419 if (fcntl(fdOpened, F_SETFD, 0) != -1) 441 420 # endif 421 #endif 442 422 return fdOpened; 443 #endif444 423 } 445 424 … … 454 433 if (fdOpened >= 0) 455 434 { 435 if (!kRedirectHasConflict(fdOpened, cOrders, paOrders)) 436 { 456 437 #ifndef KBUILD_OS_WINDOWS 457 if ( !kRedirectHasConflict(fdOpened, cOrders, paOrders)458 # ifdef _MSC_VER459 && fdOpened != fdTarget460 # endif461 )462 #endif463 {464 #ifndef _MSC_VER465 438 # ifdef USE_FD_CLOEXEC 466 439 if ( fdOpened == fdTarget … … 550 523 * First, check if there's actually handle here that needs saving. 551 524 */ 552 # ifdef KBUILD_OS_WINDOWS553 HANDLE hToSave = mscGetOsHandle(fdToSave);554 if (hToSave != INVALID_HANDLE_VALUE)555 {556 pToSave->fSaved = _setmode(fdToSave, _O_BINARY);557 if (pToSave->fSaved != _O_BINARY)558 _setmode(fdToSave, pToSave->fSaved);559 if (!mscIsNativeHandleInheritable(hToSave))560 pToSave->fSaved |= _O_NOINHERIT;561 }562 if (hToSave != INVALID_HANDLE_VALUE)563 # else564 525 pToSave->fSaved = fcntl(pToSave->fdTarget, F_GETFD, 0); 565 526 if (pToSave->fSaved != -1) 566 # endif567 527 { 568 528 /* 569 529 * Try up to 32 times to get a duplicate descriptor that doesn't conflict. 570 530 */ 571 # ifdef KBUILD_OS_WINDOWS572 HANDLE hCurProc = GetCurrentProcess();573 # endif574 531 int aFdTries[32]; 575 532 int cTries = 0; … … 578 535 /* Duplicate the handle (windows makes this complicated). */ 579 536 int fdDup; 580 # ifdef KBUILD_OS_WINDOWS581 HANDLE hDup = INVALID_HANDLE_VALUE;582 if (!DuplicateHandle(hCurProc, hToSave, hCurProc, &hDup, 0 /* DesiredAccess */,583 FALSE /*fInherit*/, DUPLICATE_SAME_ACCESS))584 {585 fprintf(*ppWorkingStdErr, "%s: DuplicateHandle(%#x) failed: %u\n", g_progname, hToSave, GetLastError());586 break;587 }588 fdDup = _open_osfhandle((intptr_t)hDup, pToSave->fSaved | _O_NOINHERIT);589 if (fdDup == -1)590 {591 fprintf(*ppWorkingStdErr, "%s: _open_osfhandle(%#x) failed: %u\n", g_progname, hDup, strerror(errno));592 CloseHandle(hDup);593 break;594 }595 # else596 537 fdDup = dup(fdToSave); 597 538 if (fdDup == -1) … … 600 541 break; 601 542 } 602 #endif603 543 /* Is the duplicate usable? */ 604 544 if (!kRedirectHasConflict(fdDup, cOrders, paOrders)) … … 662 602 KBOOL fRestoreStdErr = *ppWorkingStdErr != stderr 663 603 && paOrders[i].fdSaved == fileno(*ppWorkingStdErr); 664 665 #ifdef KBUILD_OS_WINDOWS666 if (mscDup3(paOrders[i].fdSaved, paOrders[i].fdTarget, paOrders[i].fSaved, *ppWorkingStdErr) != -1)667 #else668 604 if (dup2(paOrders[i].fdSaved, paOrders[i].fdTarget) != -1) 669 #endif670 605 { 671 606 close(paOrders[i].fdSaved); … … 678 613 } 679 614 } 680 #ifndef KBUILD_OS_WINDOWS681 615 else 682 616 fprintf(*ppWorkingStdErr, "%s: dup2(%d,%d) failed: %s\n", 683 617 g_progname, paOrders[i].fdSaved, paOrders[i].fdTarget, strerror(errno)); 684 #endif 685 } 686 687 #ifndef KBUILD_OS_WINDOWS 618 } 619 688 620 if (paOrders[i].fSaved != -1) 689 621 { … … 694 626 g_progname, paOrders[i].fdTarget, paOrders[i].fSaved & FD_CLOEXEC ? "FD_CLOEXEC" : "0", strerror(errno)); 695 627 } 696 #endif697 628 } 698 629 errno = iSavedErrno; … … 728 659 if (paOrders[j].fdTarget == fdTarget) 729 660 break; 730 # ifdef _MSC_VER731 if (j >= cOrders && !mscIsInheritable(fdTarget))732 rcExit = 0;733 # else734 661 if (j >= cOrders) 735 662 { … … 751 678 fprintf(*ppWorkingStdErr, "%s: fcntl(%d,F_GETFD,0) failed: %s\n", g_progname, fdTarget, strerror(errno)); 752 679 } 753 # endif754 680 else 755 681 rcExit = kRedirectSaveHandle(&paOrders[i], cOrders, paOrders, ppWorkingStdErr); … … 794 720 795 721 #endif /* !USE_POSIX_SPAWN */ 796 797 722 #ifdef KBUILD_OS_WINDOWS 798 723 … … 1121 1046 return rc; 1122 1047 } 1048 1123 1049 #endif /* KBUILD_OS_WINDOWS */ 1124 1050 … … 1225 1151 */ 1226 1152 FILE *pWorkingStdErr = NULL; 1227 # if defined(CONFIG_NEW_WIN_CHILDREN) && defined(KMK)1228 if (cOrders > 0)1229 MkWinChildExclusiveAcquire();1230 # endif1231 1153 rcExit = kRedirectExecFdOrders(cOrders, paOrders, &pWorkingStdErr); 1232 1154 if (rcExit == 0) … … 1237 1159 * We're spawning from within kmk. 1238 1160 */ 1239 # if defined(KBUILD_OS_WINDOWS)1161 # ifdef KBUILD_OS_WINDOWS 1240 1162 /* Windows is slightly complicated due to handles and winchildren.c. */ 1241 # if 11242 1163 HANDLE hProcess = INVALID_HANDLE_VALUE; 1243 1164 rcExit = kRedirectCreateProcessWindows(pszExecutable, cArgs, papszArgs, papszEnvVars, pszCwd, 1244 1165 cOrders, paOrders, &hProcess); 1245 1166 if (rcExit == 0) 1246 # else1247 HANDLE hProcess = (HANDLE)_spawnvpe(_P_NOWAIT, pszExecutable, papszArgs, papszEnvVars);1248 kRedirectRestoreFdOrders(cOrders, paOrders, &pWorkingStdErr);1249 # ifdef CONFIG_NEW_WIN_CHILDREN1250 if (cOrders > 0)1251 MkWinChildExclusiveRelease();1252 # endif1253 if ((intptr_t)hProcess != -1)1254 # endif1255 1167 { 1256 1168 # ifndef CONFIG_NEW_WIN_CHILDREN … … 1289 1201 } 1290 1202 } 1291 # if 01292 else1293 rcExit = err(10, "_spawnvpe(%s) failed", pszExecutable);1294 # endif1295 1203 1296 1204 # elif defined(KBUILD_OS_OS2) … … 1343 1251 } 1344 1252 1345 #elif defined(KBUILD_OS_ WINDOWS) || defined(KBUILD_OS_OS2)1253 #elif defined(KBUILD_OS_OS2) 1346 1254 errno = 0; 1347 # if defined(KBUILD_OS_WINDOWS)1348 rcExit = (int)_spawnvpe(_P_WAIT, pszExecutable, papszArgs, papszEnvVars);1349 # else1350 1255 rcExit = (int)_spawnvpe(P_WAIT, pszExecutable, papszArgs, papszEnvVars); 1351 # endif1352 1256 kRedirectRestoreFdOrders(cOrders, paOrders, &pWorkingStdErr); 1353 1257 if (rcExit != -1 || errno == 0) … … 1393 1297 else 1394 1298 rcExit = errx(10, "posix_spawnp(%s) failed: %s", pszExecutable, strerror(rcExit)); 1395 1396 1299 # endif 1397 1300 #endif /* !KMK */ 1398 1301 } 1399 #if defined(CONFIG_NEW_WIN_CHILDREN) && defined(KBUILD_OS_WINDOWS) && defined(KMK) && 0 1400 else if (cOrders > 0) 1401 MkWinChildExclusiveRelease(); 1402 #endif 1403 1404 } 1405 1302 } 1303 1304 #ifndef KBUILD_OS_WINDOWS 1406 1305 /* 1407 1306 * Restore the current directory. … … 1412 1311 warn("Failed to restore directory to '%s'", pszSavedCwd); 1413 1312 } 1313 #endif 1414 1314 } 1415 1315 #ifdef _MSC_VER
Note:
See TracChangeset
for help on using the changeset viewer.