Changeset 2894 in kBuild for trunk/src/kmk/kmkbuiltin/kSubmit.c
- Timestamp:
- Sep 8, 2016 1:27:56 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/kmkbuiltin/kSubmit.c
r2884 r2894 574 574 * @param pszCwd The current directory. 575 575 * @param fWatcomBrainDamage The wcc/wcc386 workaround. 576 * @param papszPostCmdArgs The post command and it's arguments. 577 * @param cPostCmdArgs Number of post command argument, including the 578 * command. Zero if no post command scheduled. 576 579 * @param pcbMsg Where to return the message length. 577 580 */ 578 581 static void *kSubmitComposeJobMessage(const char *pszExecutable, char **papszArgs, char **papszEnvVars, 579 const char *pszCwd, int fWatcomBrainDamage, uint32_t *pcbMsg) 582 const char *pszCwd, int fWatcomBrainDamage, 583 char **papszPostCmdArgs, uint32_t cPostCmdArgs, uint32_t *pcbMsg) 580 584 { 581 585 size_t cbTmp; … … 613 617 cbMsg += 1; 614 618 619 cbMsg += sizeof(cPostCmdArgs); 620 for (i = 0; i < cPostCmdArgs; i++) 621 cbMsg += strlen(papszPostCmdArgs[i]) + 1; 622 615 623 /* 616 624 * Compose the message. … … 618 626 pbMsg = pbCursor = xmalloc(cbMsg); 619 627 628 /* header */ 620 629 memcpy(pbCursor, &cbMsg, sizeof(cbMsg)); 621 630 pbCursor += sizeof(cbMsg); … … 623 632 pbCursor += sizeof("JOB"); 624 633 634 /* executable. */ 625 635 cbTmp = strlen(pszExecutable) + 1; 626 636 memcpy(pbCursor, pszExecutable, cbTmp); 627 637 pbCursor += cbTmp; 628 638 639 /* cwd */ 629 640 cbTmp = strlen(pszCwd) + 1; 630 641 memcpy(pbCursor, pszCwd, cbTmp); 631 642 pbCursor += cbTmp; 632 643 644 /* argument */ 633 645 memcpy(pbCursor, &cArgs, sizeof(cArgs)); 634 646 pbCursor += sizeof(cArgs); … … 642 654 assert(i == cArgs); 643 655 656 /* environment */ 644 657 memcpy(pbCursor, &cEnvVars, sizeof(cEnvVars)); 645 658 pbCursor += sizeof(cEnvVars); … … 652 665 assert(i == cEnvVars); 653 666 667 /* flags */ 654 668 *pbCursor++ = fWatcomBrainDamage != 0; 655 669 670 /* post command */ 671 memcpy(pbCursor, &cPostCmdArgs, sizeof(cPostCmdArgs)); 672 pbCursor += sizeof(cPostCmdArgs); 673 for (i = 0; i < cPostCmdArgs; i++) 674 { 675 cbTmp = strlen(papszPostCmdArgs[i]) + 1; 676 memcpy(pbCursor, papszPostCmdArgs[i], cbTmp); 677 pbCursor += cbTmp; 678 } 679 assert(i == cPostCmdArgs); 680 656 681 assert(pbCursor - pbMsg == (size_t)cbMsg); 657 682 658 /* done */ 683 /* 684 * Done. 685 */ 659 686 *pcbMsg = cbMsg; 660 687 return pbMsg; … … 1339 1366 "usage: %s [-Z|--zap-env] [-E|--set <var=val>] [-U|--unset <var=val>]\n" 1340 1367 " [-C|--chdir <dir>] [--wcc-brain-damage]\n" 1341 " [-3|--32-bit] [-6|--64-bit] [-v] -- <program> [args]\n" 1368 " [-3|--32-bit] [-6|--64-bit] [-v]\n" 1369 " [-P|--post-cmd <cmd> [args]] -- <program> [args]\n" 1342 1370 " or: %s --help\n" 1343 1371 " or: %s --version\n" … … 1362 1390 " -v,--verbose\n" 1363 1391 " More verbose execution.\n" 1392 " -P|--post-cmd <cmd> ...\n" 1393 " For running a built-in command on the output, specifying the command\n" 1394 " and all it's parameters. Currently supported commands:\n" 1395 " kDepObj\n" 1364 1396 " -V,--version\n" 1365 1397 " Show the version number.\n" … … 1383 1415 const char *pszExecutable = NULL; 1384 1416 const char *pszCwd = NULL; 1417 int iPostCmd = argc; 1418 int cPostCmdArgs = 0; 1385 1419 unsigned cBitsWorker = g_cArchBits; 1386 1420 int fWatcomBrainDamage = 0; … … 1457 1491 else if (strcmp(pszArg, "chdir") == 0) 1458 1492 chOpt = 'C'; 1493 else if (strcmp(pszArg, "post-cmd") == 0) 1494 chOpt = 'P'; 1459 1495 else if (strcmp(pszArg, "32-bit") == 0) 1460 1496 chOpt = '3'; … … 1489 1525 else 1490 1526 { 1491 errx(1, "Option -%c requires a nvalue!", chOpt);1527 errx(1, "Option -%c requires a value!", chOpt); 1492 1528 return usage(stderr, argv[0]); 1493 1529 } … … 1524 1560 return rcExit; 1525 1561 1562 case 'P': 1563 if (cPostCmdArgs > 0) 1564 return errx(1, "The -P option can only be used once!"); 1565 if (*pszArg != '\0') 1566 return errx(1, "The cmd part of the -P needs to be a separate argument!"); 1567 iPostCmd = ++iArg; 1568 if (iArg >= argc) 1569 return errx(1, "The -P option requires a command following it!"); 1570 while (iArg < argc && strcmp(argv[iArg], "--") != 0) 1571 iArg++; 1572 cPostCmdArgs = iArg - iPostCmd; 1573 iArg--; 1574 break; 1575 1526 1576 case '3': 1527 1577 cBitsWorker = 32; … … 1563 1613 uint32_t cbMsg; 1564 1614 void *pvMsg = kSubmitComposeJobMessage(pszExecutable, &argv[iArg], papszEnv, szCwd, 1565 fWatcomBrainDamage, & cbMsg);1615 fWatcomBrainDamage, &argv[iPostCmd], cPostCmdArgs, &cbMsg); 1566 1616 PWORKERINSTANCE pWorker = kSubmitSelectWorkSpawnNewIfNecessary(cBitsWorker, cVerbosity); 1567 1617 if (pWorker)
Note:
See TracChangeset
for help on using the changeset viewer.