Changeset 3192 for trunk/src/kmk/kmkbuiltin/kSubmit.c
- Timestamp:
- Mar 26, 2018, 10:25:56 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/kmkbuiltin/kSubmit.c
r3173 r3192 293 293 * 294 294 * @returns 0 on success, non-zero value on failure. 295 * @param pCtx The command execution context. 295 296 * @param pWorker The worker structure. Caller does the linking 296 297 * (as we might be reusing an existing worker … … 299 300 * @param cVerbosity The verbosity level. 300 301 */ 301 static int kSubmitSpawnWorker(P WORKERINSTANCE pWorker, int cVerbosity)302 static int kSubmitSpawnWorker(PKMKBUILTINCTX pCtx, PWORKERINSTANCE pWorker, int cVerbosity) 302 303 { 303 304 #if defined(KBUILD_OS_WINDOWS) || defined(KBUILD_OS_OS2) … … 319 320 pVarVolatile = lookup_variable(TUPLE("PATH_OUT_BASE")); 320 321 if (!pVarVolatile) 321 warn( "Neither PATH_OUT_BASE nor PATH_OUT was found.");322 warn(pCtx, "Neither PATH_OUT_BASE nor PATH_OUT was found."); 322 323 } 323 324 … … 346 347 if ( cchBinPath < sizeof(g_szArch) 347 348 || memcmp(&szExecutable[cchBinPath - sizeof(g_szArch) + 1], g_szArch, sizeof(g_szArch) - 1) != 0) 348 return errx(1, "KBUILD_BIN_PATH does not end with main architecture (%s) as expected: %s", pszBinPath, g_szArch); 349 return errx(pCtx, 1, "KBUILD_BIN_PATH does not end with main architecture (%s) as expected: %s", 350 pszBinPath, g_szArch); 349 351 cchExectuable -= sizeof(g_szArch) - 1; 350 352 memcpy(&szExecutable[cchExectuable], g_szAltArch, sizeof(g_szAltArch) - 1); … … 417 419 pWorker->pid = GetProcessId(pWorker->hProcess); 418 420 if (cVerbosity > 0) 419 fprintf(stderr, "kSubmit:created %d bit worker %d\n", pWorker->cBits, pWorker->pid);421 warnx(pCtx, "created %d bit worker %d\n", pWorker->cBits, pWorker->pid); 420 422 return 0; 421 423 } 422 err( 1, "_spawnve(,%s,,)", szExecutable);424 err(pCtx, 1, "_spawnve(,%s,,)", szExecutable); 423 425 CloseHandle(pWorker->OverlappedRead.hEvent); 424 426 pWorker->OverlappedRead.hEvent = INVALID_HANDLE_VALUE; 425 427 } 426 428 else 427 errx( 1, "CreateEventW failed: %u", GetLastError());429 errx(pCtx, 1, "CreateEventW failed: %u", GetLastError()); 428 430 CloseHandle(pWorker->hPipe); 429 431 pWorker->hPipe = INVALID_HANDLE_VALUE; 430 432 } 431 433 else 432 errx( 1, "Opening named pipe failed: %u", GetLastError());434 errx(pCtx, 1, "Opening named pipe failed: %u", GetLastError()); 433 435 CloseHandle(hWorkerPipe); 434 436 } 435 437 else 436 errx( 1, "CreateNamedPipeW failed: %u", GetLastError());438 errx(pCtx, 1, "CreateNamedPipeW failed: %u", GetLastError()); 437 439 438 440 #else … … 441 443 */ 442 444 if (socketpair(AF_LOCAL, SOCK_STREAM, 0, aiPair) == 0) 443 {444 445 pWorker->fdSocket = aiPair[1]; 445 }446 446 else 447 err( 1, "socketpair");447 err(pCtx, 1, "socketpair"); 448 448 #endif 449 449 } 450 450 else 451 errx( 1, "KBUILD_BIN_PATH is too long");451 errx(pCtx, 1, "KBUILD_BIN_PATH is too long"); 452 452 return -1; 453 453 } … … 458 458 * 459 459 * @returns Pointer to the selected worker instance. NULL on error. 460 * @param pCtx The command execution context. 460 461 * @param pWorker The idle worker instance to respawn. 461 462 * On failure this will be freed! 462 463 * @param cBitsWorker The worker bitness - 64 or 32. 463 464 */ 464 static int kSubmitRespawnWorker(P WORKERINSTANCE pWorker, int cVerbosity)465 static int kSubmitRespawnWorker(PKMKBUILTINCTX pCtx, PWORKERINSTANCE pWorker, int cVerbosity) 465 466 { 466 467 /* … … 475 476 { 476 477 if (!CloseHandle(pWorker->hPipe)) 477 warnx( "CloseHandle(pWorker->hPipe): %u", GetLastError());478 warnx(pCtx, "CloseHandle(pWorker->hPipe): %u", GetLastError()); 478 479 pWorker->hPipe = INVALID_HANDLE_VALUE; 479 480 } 480 481 481 482 if (!CloseHandle(pWorker->OverlappedRead.hEvent)) 482 warnx( "CloseHandle(pWorker->OverlappedRead.hEvent): %u", GetLastError());483 warnx(pCtx, "CloseHandle(pWorker->OverlappedRead.hEvent): %u", GetLastError()); 483 484 pWorker->OverlappedRead.hEvent = INVALID_HANDLE_VALUE; 484 485 … … 491 492 rcWait = WaitForSingleObject(pWorker->hProcess, 100); 492 493 if (rcWait != WAIT_OBJECT_0) 493 warnx( "WaitForSingleObject returns %u (and TerminateProcess %d)", rcWait, fRc);494 warnx(pCtx, "WaitForSingleObject returns %u (and TerminateProcess %d)", rcWait, fRc); 494 495 } 495 496 496 497 if (!CloseHandle(pWorker->hProcess)) 497 warnx( "CloseHandle(pWorker->hProcess): %u", GetLastError());498 warnx(pCtx, "CloseHandle(pWorker->hProcess): %u", GetLastError()); 498 499 pWorker->hProcess = INVALID_HANDLE_VALUE; 499 500 … … 505 506 { 506 507 if (close(pWorker->fdSocket) != 0) 507 warn( "close(pWorker->fdSocket)");508 warn(pCtx, "close(pWorker->fdSocket)"); 508 509 pWorker->fdSocket = -1; 509 510 } … … 512 513 pidWait = waitpid(pWorker->pid, &rc, 0); 513 514 if (pidWait != pWorker->pid) 514 warn( "waitpid(pWorker->pid,,0)");515 warn(pCtx, "waitpid(pWorker->pid,,0)"); 515 516 #endif 516 517 … … 523 524 * Respawn it. 524 525 */ 525 if (kSubmitSpawnWorker(p Worker, cVerbosity) == 0)526 if (kSubmitSpawnWorker(pCtx, pWorker, cVerbosity) == 0) 526 527 { 527 528 /* … … 546 547 * @param cBitsWorker The worker bitness - 64 or 32. 547 548 */ 548 static PWORKERINSTANCE kSubmitSelectWorkSpawnNewIfNecessary( unsigned cBitsWorker, int cVerbosity)549 static PWORKERINSTANCE kSubmitSelectWorkSpawnNewIfNecessary(PKMKBUILTINCTX pCtx, unsigned cBitsWorker, int cVerbosity) 549 550 { 550 551 /* … … 564 565 pWorker = (PWORKERINSTANCE)xcalloc(sizeof(*pWorker)); 565 566 pWorker->cBits = cBitsWorker; 566 if (kSubmitSpawnWorker(p Worker, cVerbosity) == 0)567 if (kSubmitSpawnWorker(pCtx, pWorker, cVerbosity) == 0) 567 568 { 568 569 /* … … 715 716 * @returns 0 on success, non-zero on failure. 716 717 * 718 * @param pCtx The command execution context. 717 719 * @param pWorker The work to send the request to. The worker is 718 720 * on the idle list. … … 722 724 * @param cVerbosity The verbosity level. 723 725 */ 724 static int kSubmitSendJobMessage(PWORKERINSTANCE pWorker, void const *pvMsg, uint32_t cbMsg, int fNoRespawning, int cVerbosity) 726 static int kSubmitSendJobMessage(PKMKBUILTINCTX pCtx, PWORKERINSTANCE pWorker, void const *pvMsg, uint32_t cbMsg, 727 int fNoRespawning, int cVerbosity) 725 728 { 726 729 int cRetries; … … 738 741 { 739 742 if (cVerbosity > 0) 740 fprintf(stderr, "kSubmit:Respawning worker (#1)...\n");741 if (kSubmitRespawnWorker(p Worker, cVerbosity) != 0)743 warnx(pCtx, "Respawning worker (#1)...\n"); 744 if (kSubmitRespawnWorker(pCtx, pWorker, cVerbosity) != 0) 742 745 return 2; 743 746 } … … 772 775 && dwErr != ERROR_NO_DATA) 773 776 || cRetries <= 0) 774 return errx( 1, "Error writing to worker: %u", dwErr);777 return errx(pCtx, 1, "Error writing to worker: %u", dwErr); 775 778 #else 776 779 ssize_t cbWritten … … 788 791 && errno != ECONNRESET)) 789 792 || cRetries <= 0) 790 return err( 1, "Error writing to worker");793 return err(pCtx, 1, "Error writing to worker"); 791 794 # error "later" 792 795 #endif … … 796 799 */ 797 800 if (cVerbosity > 0) 798 fprintf(stderr, "kSubmit:Respawning worker (#2)...\n");799 if (kSubmitRespawnWorker(p Worker, cVerbosity) != 0)801 warnx(pCtx, "Respawning worker (#2)...\n"); 802 if (kSubmitRespawnWorker(pCtx, pWorker, cVerbosity) != 0) 800 803 return 2; 801 804 } … … 814 817 * which the process can terminate without us having to actively wait for it. 815 818 * 819 * @param pCtx The command execution context. 816 820 * @param pWorker The worker instance. 817 821 */ 818 static void kSubmitCloseConnectOnExitingWorker(P WORKERINSTANCE pWorker)822 static void kSubmitCloseConnectOnExitingWorker(PKMKBUILTINCTX pCtx, PWORKERINSTANCE pWorker) 819 823 { 820 824 #ifdef KBUILD_OS_WINDOWS 821 825 if (!CloseHandle(pWorker->hPipe)) 822 warnx( "CloseHandle(pWorker->hPipe): %u", GetLastError());826 warnx(pCtx, "CloseHandle(pWorker->hPipe): %u", GetLastError()); 823 827 pWorker->hPipe = INVALID_HANDLE_VALUE; 824 828 #else 825 829 if (close(pWorker->fdSocket) != 0) 826 warn( "close(pWorker->fdSocket)");830 warn(pCtx, "close(pWorker->fdSocket)"); 827 831 pWorker->fdSocket = -1; 828 832 #endif … … 836 840 * 837 841 * @returns Exit code. 842 * @param pCtx The command execution context. 838 843 * @param pWorker The worker instance. 839 844 * @param dwErr The error code. 840 845 * @param pszWhere Where it failed. 841 846 */ 842 static int kSubmitWinReadFailed(P WORKERINSTANCE pWorker, DWORD dwErr, const char *pszWhere)847 static int kSubmitWinReadFailed(PKMKBUILTINCTX pCtx, PWORKERINSTANCE pWorker, DWORD dwErr, const char *pszWhere) 843 848 { 844 849 DWORD dwExitCode; 845 850 846 851 if (pWorker->cbResultRead == 0) 847 errx( 1, "%s/ReadFile failed: %u", pszWhere, dwErr);852 errx(pCtx, 1, "%s/ReadFile failed: %u", pszWhere, dwErr); 848 853 else 849 errx( 1, "%s/ReadFile failed: %u (read %u bytes)", pszWhere, dwErr, pWorker->cbResultRead);854 errx(pCtx, 1, "%s/ReadFile failed: %u (read %u bytes)", pszWhere, dwErr, pWorker->cbResultRead); 850 855 assert(dwErr != 0); 851 856 … … 870 875 * @returns 0 if we got the whole result, -1 if I/O is pending, and windows last 871 876 * error on ReadFile failure. 877 * @param pCtx The command execution context. 872 878 * @param pWorker The worker instance. 873 879 */ 874 static int kSubmitReadMoreResultWin(P WORKERINSTANCE pWorker, const char *pszWhere)880 static int kSubmitReadMoreResultWin(PKMKBUILTINCTX pCtx, PWORKERINSTANCE pWorker, const char *pszWhere) 875 881 { 876 882 /* … … 895 901 if (dwErr == ERROR_IO_PENDING) 896 902 return -1; 897 return kSubmitWinReadFailed(p Worker, dwErr, pszWhere);903 return kSubmitWinReadFailed(pCtx, pWorker, dwErr, pszWhere); 898 904 } 899 905 … … 913 919 * 914 920 * @returns Exit code. 921 * @param pCtx The command execution context. 915 922 * @param pWorker The worker instance to mark as active. 916 923 * @param cVerbosity The verbosity level. … … 920 927 * and we've returned the exit code of the job. 921 928 */ 922 static int kSubmitMarkActive(P WORKERINSTANCE pWorker, int cVerbosity, struct child *pChild, pid_t *pPidSpawned)929 static int kSubmitMarkActive(PKMKBUILTINCTX pCtx, PWORKERINSTANCE pWorker, int cVerbosity, struct child *pChild, pid_t *pPidSpawned) 923 930 { 924 931 #ifdef KBUILD_OS_WINDOWS … … 934 941 */ 935 942 l_again: 936 rc = kSubmitReadMoreResultWin(p Worker, "kSubmitMarkActive");943 rc = kSubmitReadMoreResultWin(pCtx, pWorker, "kSubmitMarkActive"); 937 944 if (rc == -1) 938 945 { … … 943 950 { 944 951 /* We need to do the waiting here because sub_proc.c has too much to do. */ 945 warnx( "Too many processes for sub_proc.c to handle!");952 warnx(pCtx, "Too many processes for sub_proc.c to handle!"); 946 953 WaitForSingleObject(pWorker->OverlappedRead.hEvent, INFINITE); 947 954 goto l_again; … … 953 960 { 954 961 /* We need to do the waiting here because sub_proc.c has too much to do. */ 955 warnx( "MkWinChildCreateSubmit failed!");962 warnx(pCtx, "MkWinChildCreateSubmit failed!"); 956 963 WaitForSingleObject(pWorker->OverlappedRead.hEvent, INFINITE); 957 964 goto l_again; … … 963 970 assert(rc == 0 || pWorker->Result.s.rcExit != 0); 964 971 if (pWorker->Result.s.bWorkerExiting) 965 kSubmitCloseConnectOnExitingWorker(p Worker);972 kSubmitCloseConnectOnExitingWorker(pCtx, pWorker); 966 973 *pPidSpawned = 0; 967 974 return pWorker->Result.s.rcExit; … … 998 1005 { 999 1006 PWORKERINSTANCE pWorker = (PWORKERINSTANCE)pvUser; 1007 KMKBUILTINCTX FakeCtx = { "kSubmit/GetResult", NULL }; 1008 PKMKBUILTINCTX pCtx = &FakeCtx; 1000 1009 1001 1010 /* … … 1012 1021 while (pWorker->cbResultRead < sizeof(pWorker->Result)) 1013 1022 { 1014 int rc = kSubmitReadMoreResultWin(p Worker, "kSubmitSubProcGetResult/more");1023 int rc = kSubmitReadMoreResultWin(pCtx, pWorker, "kSubmitSubProcGetResult/more"); 1015 1024 if (rc == -1) 1016 1025 return -1; … … 1022 1031 { 1023 1032 DWORD dwErr = GetLastError(); 1024 kSubmitWinReadFailed(p Worker, dwErr, "kSubmitSubProcGetResult/result");1033 kSubmitWinReadFailed(pCtx, pWorker, dwErr, "kSubmitSubProcGetResult/result"); 1025 1034 } 1026 1035 … … 1039 1048 } 1040 1049 if (pWorker->Result.s.bWorkerExiting) 1041 kSubmitCloseConnectOnExitingWorker(p Worker);1050 kSubmitCloseConnectOnExitingWorker(pCtx, pWorker); 1042 1051 1043 1052 return 0; … … 1074 1083 DWORD msStartTick; 1075 1084 DWORD cKillRaids = 0; 1085 KMKBUILTINCTX FakeCtx = { "kSubmit/atexit", NULL }; 1086 PKMKBUILTINCTX pCtx = &FakeCtx; 1076 1087 1077 1088 /* … … 1079 1090 */ 1080 1091 for (pWorker = g_IdleList.pHead; pWorker != NULL; pWorker = pWorker->pNext) 1081 kSubmitCloseConnectOnExitingWorker(p Worker);1092 kSubmitCloseConnectOnExitingWorker(pCtx, pWorker); 1082 1093 for (pWorker = g_BusyList.pHead; pWorker != NULL; pWorker = pWorker->pNext) 1083 kSubmitCloseConnectOnExitingWorker(p Worker);1094 kSubmitCloseConnectOnExitingWorker(pCtx, pWorker); 1084 1095 1085 1096 /* … … 1157 1168 if (cKillRaids == 1 && getenv("KMK_KSUBMIT_NO_KILL") == NULL) 1158 1169 { 1159 fprintf(stderr, "kmk/kSubmit:Killing %u lingering worker processe(s)!\n", cHandles);1170 warnx(pCtx, "Killing %u lingering worker processe(s)!\n", cHandles); 1160 1171 for (pWorker = g_IdleList.pHead; pWorker != NULL; pWorker = pWorker->pNext) 1161 1172 if (pWorker->hProcess != INVALID_HANDLE_VALUE) … … 1167 1178 else 1168 1179 { 1169 fprintf(stderr, "kmk/kSubmit:Giving up on the last %u worker processe(s). :-(\n", cHandles);1180 warnx(pCtx, "Giving up on the last %u worker processe(s). :-(\n", cHandles); 1170 1181 return; 1171 1182 } … … 1176 1187 bad ones as well as completed ones. */ 1177 1188 size_t idx; 1178 fprintf(stderr, "kmk/kSubmit:WaitForMultipleObjects unexpectedly returned %#u (err=%u)\n",1179 1189 warnx(pCtx, "WaitForMultipleObjects unexpectedly returned %#u (err=%u)\n", 1190 dwWait, GetLastError()); 1180 1191 for (idx = 0; idx < cHandles; idx++) 1181 1192 { … … 1194 1205 1195 1206 1196 static int usage(FILE *pOut, const char *argv0)1197 { 1198 fprintf(pOut,1199 "usage: %s [-Z|--zap-env] [-E|--set <var=val>] [-U|--unset <var=val>]\n"1200 " [-A|--append <var=val>] [-D|--prepend <var=val>]\n"1201 " [-C|--chdir <dir>] [--wcc-brain-damage] [--no-pch-caching]\n"1202 " [-3|--32-bit] [-6|--64-bit] [-v]\n"1203 " [-P|--post-cmd <cmd> [args]] -- <program> [args]\n"1204 " or: %s --help\n"1205 " or: %s --version\n"1206 "\n"1207 "Options:\n"1208 " -Z, --zap-env, -i, --ignore-environment\n"1209 " Zaps the environment. Position dependent.\n"1210 " -E, --set <var>=[value]\n"1211 " Sets an enviornment variable putenv fashion. Position dependent.\n"1212 " -U, --unset <var>\n"1213 " Removes an environment variable. Position dependent.\n"1214 " -A, --append <var>=<value>\n"1215 " Appends the given value to the environment variable.\n"1216 " -D,--prepend <var>=<value>\n"1217 " Prepends the given value to the environment variable.\n"1218 " -C, --chdir <dir>\n"1219 " Specifies the current directory for the program. Relative paths\n"1220 " are relative to the previous -C option. Default is getcwd value.\n"1221 " -3, --32-bit\n"1222 " Selects a 32-bit kWorker process. Default: kmk bit count\n"1223 " -6, --64-bit\n"1224 " Selects a 64-bit kWorker process. Default: kmk bit count\n"1225 " --wcc-brain-damage\n"1226 " Works around wcc and wcc386 (Open Watcom) not following normal\n"1227 " quoting conventions on Windows, OS/2, and DOS.\n"1228 " --no-pch-caching\n"1229 " Do not cache precompiled header files because they're being created.\n"1230 " -v,--verbose\n"1231 " More verbose execution.\n"1232 " -P|--post-cmd <cmd> ...\n"1233 " For running a built-in command on the output, specifying the command\n"1234 " and all it's parameters. Currently supported commands:\n"1235 " kDepObj\n"1236 " -V,--version\n"1237 " Show the version number.\n"1238 " -h,--help\n"1239 " Show this usage information.\n"1240 "\n"1241 ,1242 argv0, argv0, argv0);1207 static int kmk_builtin_kSubmit_usage(PKMKBUILTINCTX pCtx, int fIsErr) 1208 { 1209 kmk_builtin_ctx_printf(pCtx, fIsErr, 1210 "usage: %s [-Z|--zap-env] [-E|--set <var=val>] [-U|--unset <var=val>]\n" 1211 " [-A|--append <var=val>] [-D|--prepend <var=val>]\n" 1212 " [-C|--chdir <dir>] [--wcc-brain-damage] [--no-pch-caching]\n" 1213 " [-3|--32-bit] [-6|--64-bit] [-v]\n" 1214 " [-P|--post-cmd <cmd> [args]] -- <program> [args]\n" 1215 " or: %s --help\n" 1216 " or: %s --version\n" 1217 "\n" 1218 "Options:\n" 1219 " -Z, --zap-env, -i, --ignore-environment\n" 1220 " Zaps the environment. Position dependent.\n" 1221 " -E, --set <var>=[value]\n" 1222 " Sets an enviornment variable putenv fashion. Position dependent.\n" 1223 " -U, --unset <var>\n" 1224 " Removes an environment variable. Position dependent.\n" 1225 " -A, --append <var>=<value>\n" 1226 " Appends the given value to the environment variable.\n" 1227 " -D,--prepend <var>=<value>\n" 1228 " Prepends the given value to the environment variable.\n" 1229 " -C, --chdir <dir>\n" 1230 " Specifies the current directory for the program. Relative paths\n" 1231 " are relative to the previous -C option. Default is getcwd value.\n" 1232 " -3, --32-bit\n" 1233 " Selects a 32-bit kWorker process. Default: kmk bit count\n" 1234 " -6, --64-bit\n" 1235 " Selects a 64-bit kWorker process. Default: kmk bit count\n" 1236 " --wcc-brain-damage\n" 1237 " Works around wcc and wcc386 (Open Watcom) not following normal\n" 1238 " quoting conventions on Windows, OS/2, and DOS.\n" 1239 " --no-pch-caching\n" 1240 " Do not cache precompiled header files because they're being created.\n" 1241 " -v,--verbose\n" 1242 " More verbose execution.\n" 1243 " -P|--post-cmd <cmd> ...\n" 1244 " For running a built-in command on the output, specifying the command\n" 1245 " and all it's parameters. Currently supported commands:\n" 1246 " kDepObj\n" 1247 " -V,--version\n" 1248 " Show the version number.\n" 1249 " -h,--help\n" 1250 " Show this usage information.\n" 1251 "\n" 1252 , 1253 pCtx->pszProgName, pCtx->pszProgName, pCtx->pszProgName); 1243 1254 return 2; 1244 1255 } 1245 1256 1246 1257 1247 int kmk_builtin_kSubmit(int argc, char **argv, char **envp, struct child *pChild, pid_t *pPidSpawned)1258 int kmk_builtin_kSubmit(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx, struct child *pChild, pid_t *pPidSpawned) 1248 1259 { 1249 1260 int rcExit = 0; … … 1262 1273 PATH_VAR(szCwd); 1263 1274 1264 g_progname = argv[0];1265 1266 1275 /* 1267 1276 * Create default program environment. … … 1273 1282 { /* likely */ } 1274 1283 else 1275 return err( 1, "getcwd_fs failed\n");1284 return err(pCtx, 1, "getcwd_fs failed\n"); 1276 1285 1277 1286 /* The environment starts out in read-only mode and will be duplicated if modified. */ … … 1298 1307 else 1299 1308 { 1300 errx( 1, "Incomplete option: '-'");1301 return usage(stderr, argv[0]);1309 errx(pCtx, 1, "Incomplete option: '-'"); 1310 return kmk_builtin_kSubmit_usage(pCtx, 1); 1302 1311 } 1303 1312 } … … 1354 1363 else 1355 1364 { 1356 errx( 2, "Unknown option: '%s'", pszArg - 2);1357 return usage(stderr, argv[0]);1365 errx(pCtx, 2, "Unknown option: '%s'", pszArg - 2); 1366 return kmk_builtin_kSubmit_usage(pCtx, 1); 1358 1367 } 1359 1368 pszArg = ""; … … 1378 1387 else 1379 1388 { 1380 errx( 1, "Option -%c requires a value!", chOpt);1381 return usage(stderr, argv[0]);1389 errx(pCtx, 1, "Option -%c requires a value!", chOpt); 1390 return kmk_builtin_kSubmit_usage(pCtx, 1); 1382 1391 } 1383 1392 break; … … 1388 1397 case 'Z': 1389 1398 case 'i': /* GNU env compatibility. */ 1390 rcExit = kBuiltinOptEnvZap( &papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity);1399 rcExit = kBuiltinOptEnvZap(pCtx, &papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity); 1391 1400 if (rcExit == 0) 1392 1401 break; … … 1394 1403 1395 1404 case 'E': 1396 rcExit = kBuiltinOptEnvSet( &papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszValue);1405 rcExit = kBuiltinOptEnvSet(pCtx, &papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszValue); 1397 1406 if (rcExit == 0) 1398 1407 break; … … 1400 1409 1401 1410 case 'A': 1402 rcExit = kBuiltinOptEnvAppend( &papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszValue);1411 rcExit = kBuiltinOptEnvAppend(pCtx, &papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszValue); 1403 1412 if (rcExit == 0) 1404 1413 break; … … 1406 1415 1407 1416 case 'D': 1408 rcExit = kBuiltinOptEnvPrepend( &papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszValue);1417 rcExit = kBuiltinOptEnvPrepend(pCtx, &papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszValue); 1409 1418 if (rcExit == 0) 1410 1419 break; … … 1412 1421 1413 1422 case 'U': 1414 rcExit = kBuiltinOptEnvUnset( &papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszValue);1423 rcExit = kBuiltinOptEnvUnset(pCtx, &papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszValue); 1415 1424 if (rcExit == 0) 1416 1425 break; … … 1418 1427 1419 1428 case 'C': 1420 rcExit = kBuiltinOptChDir( szCwd, cbCwdBuf, pszValue);1429 rcExit = kBuiltinOptChDir(pCtx, szCwd, cbCwdBuf, pszValue); 1421 1430 if (rcExit == 0) 1422 1431 break; … … 1425 1434 case 'P': 1426 1435 if (cPostCmdArgs > 0) 1427 return errx( 1, "The -P option can only be used once!");1436 return errx(pCtx, 1, "The -P option can only be used once!"); 1428 1437 if (*pszArg != '\0') 1429 return errx( 1, "The cmd part of the -P needs to be a separate argument!");1438 return errx(pCtx, 1, "The cmd part of the -P needs to be a separate argument!"); 1430 1439 iPostCmd = ++iArg; 1431 1440 if (iArg >= argc) 1432 return errx( 1, "The -P option requires a command following it!");1441 return errx(pCtx, 1, "The -P option requires a command following it!"); 1433 1442 while (iArg < argc && strcmp(argv[iArg], "--") != 0) 1434 1443 iArg++; … … 1454 1463 1455 1464 case 'h': 1456 usage(stdout, argv[0]);1465 kmk_builtin_kSubmit_usage(pCtx, 0); 1457 1466 kBuiltinOptEnvCleanup(&papszEnvVars, cEnvVars, &cAllocatedEnvVars); 1458 1467 return 0; … … 1466 1475 else 1467 1476 { 1468 errx( 1, "Unknown argument: '%s'", pszArg);1469 return usage(stderr, argv[0]);1477 errx(pCtx, 1, "Unknown argument: '%s'", pszArg); 1478 return kmk_builtin_kSubmit_usage(pCtx, 1); 1470 1479 } 1471 1480 } … … 1480 1489 fWatcomBrainDamage, fNoPchCaching, 1481 1490 &argv[iPostCmd], cPostCmdArgs, &cbMsg); 1482 PWORKERINSTANCE pWorker = kSubmitSelectWorkSpawnNewIfNecessary( cBitsWorker, cVerbosity);1491 PWORKERINSTANCE pWorker = kSubmitSelectWorkSpawnNewIfNecessary(pCtx, cBitsWorker, cVerbosity); 1483 1492 if (pWorker) 1484 1493 { … … 1486 1495 pszExecutable = argv[iArg]; 1487 1496 1488 rcExit = kSubmitSendJobMessage(p Worker, pvMsg, cbMsg, 0 /*fNoRespawning*/, cVerbosity);1497 rcExit = kSubmitSendJobMessage(pCtx, pWorker, pvMsg, cbMsg, 0 /*fNoRespawning*/, cVerbosity); 1489 1498 if (rcExit == 0) 1490 rcExit = kSubmitMarkActive(p Worker, cVerbosity, pChild, pPidSpawned);1499 rcExit = kSubmitMarkActive(pCtx, pWorker, cVerbosity, pChild, pPidSpawned); 1491 1500 1492 1501 if (!g_fAtExitRegistered) … … 1500 1509 else 1501 1510 { 1502 errx( 1, "Nothing to executed!");1503 rcExit = usage(stderr, argv[0]);1511 errx(pCtx, 1, "Nothing to executed!"); 1512 rcExit = kmk_builtin_kSubmit_usage(pCtx, 1); 1504 1513 } 1505 1514
Note:
See TracChangeset
for help on using the changeset viewer.