Changeset 2844 for trunk/src/kmk/kmkbuiltin
- Timestamp:
- Aug 29, 2016, 6:31:33 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/kmkbuiltin/kSubmit.c
r2843 r2844 52 52 #ifdef KBUILD_OS_WINDOWS 53 53 # include "sub_proc.h" 54 # include "quote_argv.h" 54 55 #endif 55 56 … … 366 367 if (pWorker->OverlappedRead.hEvent != NULL) 367 368 { 368 char szHandleArg[ 16];369 char szHandleArg[32]; 369 370 const char *apszArgs[4] = { szExecutable, "--pipe", szHandleArg, NULL }; 370 371 _snprintf(szHandleArg, sizeof(szHandleArg), "%p", hWorkerPipe); … … 557 558 const char *pszCwd, uint32_t *pcbMsg) 558 559 { 559 size_t i;560 560 size_t cbTmp; 561 uint32_t i; 561 562 uint32_t cbMsg; 563 uint32_t cArgs; 564 uint32_t cEnvVars; 562 565 uint8_t *pbMsg; 563 566 uint8_t *pbCursor; 567 568 /* 569 * Adjust input. 570 */ 571 if (!pszExecutable) 572 pszExecutable = papszArgs[0]; 564 573 565 574 /* … … 569 578 cbMsg += sizeof("JOB"); 570 579 cbMsg += strlen(pszExecutable) + 1; 571 580 cbMsg += strlen(pszCwd) + 1; 581 582 cbMsg += sizeof(cArgs); 572 583 for (i = 0; papszArgs[i] != NULL; i++) 573 cbMsg += strlen(papszArgs[i]) + 1; 574 cbMsg += 1; 575 584 cbMsg += 1 + strlen(papszArgs[i]) + 1; 585 cArgs = i; 586 587 cbMsg += sizeof(cArgs); 576 588 for (i = 0; papszEnvVars[i] != NULL; i++) 577 589 cbMsg += strlen(papszEnvVars[i]) + 1; 578 cbMsg += 1; 579 580 cbMsg += strlen(pszCwd) + 1; 590 cEnvVars = i; 591 581 592 582 593 /* … … 594 605 pbCursor += cbTmp; 595 606 607 cbTmp = strlen(pszCwd) + 1; 608 memcpy(pbCursor, pszCwd, cbTmp); 609 pbCursor += cbTmp; 610 611 memcpy(pbCursor, &cArgs, sizeof(cArgs)); 612 pbCursor += sizeof(cArgs); 596 613 for (i = 0; papszArgs[i] != NULL; i++) 597 614 { 615 *pbCursor++ = 0; /* Argument expansion flags (MSC, EMX). */ 598 616 cbTmp = strlen(papszArgs[i]) + 1; 599 617 memcpy(pbCursor, papszArgs[i], cbTmp); 600 618 pbCursor += cbTmp; 601 619 } 602 *pbCursor++ = '\0'; 603 620 assert(i == cArgs); 621 622 memcpy(pbCursor, &cEnvVars, sizeof(cEnvVars)); 623 pbCursor += sizeof(cEnvVars); 604 624 for (i = 0; papszEnvVars[i] != NULL; i++) 605 625 { … … 608 628 pbCursor += cbTmp; 609 629 } 610 *pbCursor++ = '\0'; 611 612 cbTmp = strlen(pszCwd) + 1; 613 memcpy(pbCursor, pszCwd, cbTmp); 614 pbCursor += cbTmp; 630 assert(i == cEnvVars); 615 631 616 632 assert(pbCursor - pbMsg == (size_t)cbMsg); … … 780 796 /** 781 797 * Used by 782 * @returns 0 if we got the whole result, -1 if I/O is pending, windows last798 * @returns 0 if we got the whole result, -1 if I/O is pending, and windows last 783 799 * error on ReadFile failure. 784 800 * @param pWorker The worker instance. … … 806 822 DWORD dwErr = GetLastError(); 807 823 if (dwErr == ERROR_IO_PENDING) 808 return 1;809 return kSubmitWinReadFailed(pWorker, GetLastError());824 return -1; 825 return kSubmitWinReadFailed(pWorker, dwErr); 810 826 } 811 827 … … 849 865 if (rc == -1) 850 866 { 851 if (process_kmk_register_submit(pWorker->OverlappedRead.hEvent, (intptr_t)pWorker ) == 0)867 if (process_kmk_register_submit(pWorker->OverlappedRead.hEvent, (intptr_t)pWorker, pPidSpawned) == 0) 852 868 { /* likely */ } 853 869 else … … 873 889 */ 874 890 pWorker->pBusyWith = pChild; 891 #ifndef KBUILD_OS_WINDOWS 875 892 *pPidSpawned = pWorker->pid; 893 #endif 876 894 877 895 kSubmitListUnlink(&g_IdleList, pWorker); … … 977 995 PWORKERINSTANCE apWorkers[MAXIMUM_WAIT_OBJECTS]; 978 996 HANDLE ahHandles[MAXIMUM_WAIT_OBJECTS]; 979 DWORD cHandles ;997 DWORD cHandles = 0; 980 998 981 999 for (pWorker = g_IdleList.pHead; pWorker != NULL; pWorker = pWorker->pNext) … … 1329 1347 1330 1348 papszEnv = pChild->environment; 1331 if ( papszEnv)1349 if (!papszEnv) 1332 1350 pChild->environment = papszEnv = target_environment(pChild->file); 1333 1351 cEnvVars = 0; … … 1495 1513 if (pWorker) 1496 1514 { 1515 #ifdef KBUILD_OS_WINDOWS 1516 /* Quote the argv elements, but first we need unquoted pszExecute. */ 1517 char *pszFreeExec = NULL; 1518 if (!pszExecutable) 1519 pszExecutable = pszFreeExec = xstrdup(argv[0]); 1520 quote_argv(argc, argv, fWatcomBrainDamage, 1 /*fFreeOrLeak*/); 1521 #endif 1522 1497 1523 rcExit = kSubmitSendJobMessage(pWorker, pvMsg, cbMsg, 0 /*fNoRespawning*/, cVerbosity); 1498 1524 if (rcExit == 0) … … 1502 1528 if (atexit(kSubmitAtExitCallback) == 0) 1503 1529 g_fAtExitRegistered = 1; 1530 1531 #ifdef KBUILD_OS_WINDOWS 1532 free(pszFreeExec); 1533 #endif 1504 1534 } 1505 1535 else
Note:
See TracChangeset
for help on using the changeset viewer.