Changeset 3169 in kBuild
- Timestamp:
- Mar 21, 2018 11:27:47 AM (7 years ago)
- Location:
- trunk/src/kmk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/dir-nt-bird.c
r3167 r3169 483 483 void nt_fullpath_cached(const char *pszPath, char *pszFull, size_t cbFull) 484 484 { 485 KFSLOOKUPERROR enmError; 486 PKFSOBJ pPathObj = kFsCacheLookupA(g_pFsCache, pszPath, &enmError); 487 assert(GetCurrentThreadId() == g_idMainThread); 488 if (pPathObj) 489 { 490 KSIZE off = pPathObj->cchParent; 491 if (off > 0) 492 { 493 KSIZE offEnd = off + pPathObj->cchName; 494 if (offEnd < cbFull) 495 { 496 PKFSDIR pAncestor; 497 498 pszFull[offEnd] = '\0'; 499 memcpy(&pszFull[off], pPathObj->pszName, pPathObj->cchName); 500 501 for (pAncestor = pPathObj->pParent; off > 0; pAncestor = pAncestor->Obj.pParent) 485 if (GetCurrentThreadId() == g_idMainThread) 486 { 487 KFSLOOKUPERROR enmError; 488 PKFSOBJ pPathObj = kFsCacheLookupA(g_pFsCache, pszPath, &enmError); 489 if (pPathObj) 490 { 491 KSIZE off = pPathObj->cchParent; 492 if (off > 0) 493 { 494 KSIZE offEnd = off + pPathObj->cchName; 495 if (offEnd < cbFull) 502 496 { 503 kHlpAssert(off > 1); 504 kHlpAssert(pAncestor != NULL); 505 kHlpAssert(pAncestor->Obj.cchName > 0); 506 pszFull[--off] = '/'; 497 PKFSDIR pAncestor; 498 499 pszFull[offEnd] = '\0'; 500 memcpy(&pszFull[off], pPathObj->pszName, pPathObj->cchName); 501 502 for (pAncestor = pPathObj->pParent; off > 0; pAncestor = pAncestor->Obj.pParent) 503 { 504 kHlpAssert(off > 1); 505 kHlpAssert(pAncestor != NULL); 506 kHlpAssert(pAncestor->Obj.cchName > 0); 507 pszFull[--off] = '/'; 507 508 #ifdef KFSCACHE_CFG_SHORT_NAMES 508 if ( pAncestor->Obj.pszName == pAncestor->Obj.pszShortName509 || memchr(pAncestor->Obj.pszName, ' ', pAncestor->Obj.cchName) == NULL)509 if ( pAncestor->Obj.pszName == pAncestor->Obj.pszShortName 510 || memchr(pAncestor->Obj.pszName, ' ', pAncestor->Obj.cchName) == NULL) 510 511 #endif 511 { 512 off -= pAncestor->Obj.cchName; 513 kHlpAssert(pAncestor->Obj.cchParent == off); 514 memcpy(&pszFull[off], pAncestor->Obj.pszName, pAncestor->Obj.cchName); 512 { 513 off -= pAncestor->Obj.cchName; 514 kHlpAssert(pAncestor->Obj.cchParent == off); 515 memcpy(&pszFull[off], pAncestor->Obj.pszName, pAncestor->Obj.cchName); 516 } 517 #ifdef KFSCACHE_CFG_SHORT_NAMES 518 else 519 { 520 /* 521 * The long name constains a space, so use the alternative name instead. 522 * Most likely the alternative name differs in length, usually it's shorter, 523 * so we have to shift the part of the path we've already assembled 524 * accordingly. 525 */ 526 KSSIZE cchDelta = (KSSIZE)pAncestor->Obj.cchShortName - (KSSIZE)pAncestor->Obj.cchName; 527 if (cchDelta != 0) 528 { 529 if ((KSIZE)(offEnd + cchDelta) >= cbFull) 530 goto l_fallback; 531 memmove(&pszFull[off + cchDelta], &pszFull[off], offEnd + 1 - off); 532 off += cchDelta; 533 offEnd += cchDelta; 534 } 535 off -= pAncestor->Obj.cchShortName; 536 kHlpAssert(pAncestor->Obj.cchParent == off); 537 memcpy(&pszFull[off], pAncestor->Obj.pszShortName, pAncestor->Obj.cchShortName); 538 } 539 #endif 515 540 } 516 #ifdef KFSCACHE_CFG_SHORT_NAMES 517 else 518 { 519 /* 520 * The long name constains a space, so use the alternative name instead. 521 * Most likely the alternative name differs in length, usually it's shorter, 522 * so we have to shift the part of the path we've already assembled 523 * accordingly. 524 */ 525 KSSIZE cchDelta = (KSSIZE)pAncestor->Obj.cchShortName - (KSSIZE)pAncestor->Obj.cchName; 526 if (cchDelta != 0) 527 { 528 if ((KSIZE)(offEnd + cchDelta) >= cbFull) 529 goto l_fallback; 530 memmove(&pszFull[off + cchDelta], &pszFull[off], offEnd + 1 - off); 531 off += cchDelta; 532 offEnd += cchDelta; 533 } 534 off -= pAncestor->Obj.cchShortName; 535 kHlpAssert(pAncestor->Obj.cchParent == off); 536 memcpy(&pszFull[off], pAncestor->Obj.pszShortName, pAncestor->Obj.cchShortName); 537 } 538 #endif 541 kFsCacheObjRelease(g_pFsCache, pPathObj); 542 return; 539 543 } 540 kFsCacheObjRelease(g_pFsCache, pPathObj); 541 return; 542 } 543 } 544 else 545 { 546 if ((size_t)pPathObj->cchName + 1 < cbFull) 547 { 548 /* Assume no spaces here. */ 549 memcpy(pszFull, pPathObj->pszName, pPathObj->cchName); 550 pszFull[pPathObj->cchName] = '/'; 551 pszFull[pPathObj->cchName + 1] = '\0'; 552 553 kFsCacheObjRelease(g_pFsCache, pPathObj); 554 return; 555 } 556 } 557 558 /* do fallback. */ 544 } 545 else 546 { 547 if ((size_t)pPathObj->cchName + 1 < cbFull) 548 { 549 /* Assume no spaces here. */ 550 memcpy(pszFull, pPathObj->pszName, pPathObj->cchName); 551 pszFull[pPathObj->cchName] = '/'; 552 pszFull[pPathObj->cchName + 1] = '\0'; 553 554 kFsCacheObjRelease(g_pFsCache, pPathObj); 555 return; 556 } 557 } 558 559 /* do fallback. */ 559 560 #ifdef KFSCACHE_CFG_SHORT_NAMES 560 561 l_fallback: 561 562 #endif 562 kHlpAssertFailed(); 563 kFsCacheObjRelease(g_pFsCache, pPathObj); 563 kHlpAssertFailed(); 564 kFsCacheObjRelease(g_pFsCache, pPathObj); 565 } 564 566 } 565 567 -
trunk/src/kmk/kmkbuiltin.c
r3168 r3169 35 35 #ifdef _MSC_VER 36 36 # include <io.h> 37 #endif 38 #if defined(KBUILD_OS_WINDOWS) && defined(CONFIG_NEW_WIN_CHILDREN) 39 # include "makeint.h" 40 # include "job.h" 41 # include "w32/winchildren.h" 37 42 #endif 38 43 #include "kmkbuiltin/err.h" … … 226 231 * kmk built command. 227 232 */ 228 static struct KMKBUILTINENTRY233 static const KMKBUILTINENTRY g_aBuiltins[] = 229 234 { 230 const char *pszName; 231 size_t cchName; 232 union 233 { 234 uintptr_t uPfn; 235 #define FN_SIG_MAIN 0 236 int (* pfnMain)(int argc, char **argv, char **envp); 237 #define FN_SIG_MAIN_SPAWNS 1 238 int (* pfnMainSpawns)(int argc, char **argv, char **envp, struct child *pChild, pid_t *pPid); 239 #define FN_SIG_MAIN_TO_SPAWN 2 240 int (* pfnMainToSpawn)(int argc, char **argv, char **envp, char ***ppapszArgvToSpawn); 241 } u; 242 size_t uFnSignature : 8; 243 size_t fMpSafe : 1; 244 size_t fNeedEnv : 1; 245 } const g_aBuiltins[] = 246 { 247 #define BUILTIN_ENTRY(a_fn, a_uFnSignature, fMpSafe, fNeedEnv) \ 248 { &(#a_fn)[12], sizeof(#a_fn) - 12 - 1, \ 249 (uintptr_t)a_fn, a_uFnSignature, fMpSafe, fNeedEnv } 235 #define BUILTIN_ENTRY(a_fn, a_sz, a_uFnSignature, fMpSafe, fNeedEnv) \ 236 { { { sizeof(a_sz) - 1, a_sz, } }, \ 237 (uintptr_t)a_fn, a_uFnSignature, fMpSafe, fNeedEnv } 250 238 251 239 /* More frequently used commands: */ 252 BUILTIN_ENTRY(kmk_builtin_append, FN_SIG_MAIN, 0, 0),253 BUILTIN_ENTRY(kmk_builtin_printf, FN_SIG_MAIN, 0, 0),254 BUILTIN_ENTRY(kmk_builtin_echo, FN_SIG_MAIN, 0, 0),255 BUILTIN_ENTRY(kmk_builtin_install, FN_SIG_MAIN, 0, 0),256 BUILTIN_ENTRY(kmk_builtin_kDepObj, FN_SIG_MAIN, 0, 0),240 BUILTIN_ENTRY(kmk_builtin_append, "append", FN_SIG_MAIN, 0, 0), 241 BUILTIN_ENTRY(kmk_builtin_printf, "printf", FN_SIG_MAIN, 0, 0), 242 BUILTIN_ENTRY(kmk_builtin_echo, "echo", FN_SIG_MAIN, 0, 0), 243 BUILTIN_ENTRY(kmk_builtin_install, "install", FN_SIG_MAIN, 0, 0), 244 BUILTIN_ENTRY(kmk_builtin_kDepObj, "kDepObj", FN_SIG_MAIN, 1, 0), 257 245 #ifdef KBUILD_OS_WINDOWS 258 BUILTIN_ENTRY(kmk_builtin_kSubmit, FN_SIG_MAIN_SPAWNS, 0, 0),259 #endif 260 BUILTIN_ENTRY(kmk_builtin_mkdir, FN_SIG_MAIN, 0, 0),261 BUILTIN_ENTRY(kmk_builtin_mv, FN_SIG_MAIN, 0, 0),262 BUILTIN_ENTRY(kmk_builtin_redirect, FN_SIG_MAIN_SPAWNS, 0, 0),263 BUILTIN_ENTRY(kmk_builtin_rm, FN_SIG_MAIN, 0, 0),264 BUILTIN_ENTRY(kmk_builtin_rmdir, FN_SIG_MAIN, 0, 0),265 BUILTIN_ENTRY(kmk_builtin_test, FN_SIG_MAIN_TO_SPAWN, 0, 0),246 BUILTIN_ENTRY(kmk_builtin_kSubmit, "kSubmit", FN_SIG_MAIN_SPAWNS, 0, 0), 247 #endif 248 BUILTIN_ENTRY(kmk_builtin_mkdir, "mkdir", FN_SIG_MAIN, 0, 0), 249 BUILTIN_ENTRY(kmk_builtin_mv, "mv", FN_SIG_MAIN, 0, 0), 250 BUILTIN_ENTRY(kmk_builtin_redirect, "redirect", FN_SIG_MAIN_SPAWNS, 0, 1), 251 BUILTIN_ENTRY(kmk_builtin_rm, "rm", FN_SIG_MAIN, 0, 1), 252 BUILTIN_ENTRY(kmk_builtin_rmdir, "rmdir", FN_SIG_MAIN, 0, 0), 253 BUILTIN_ENTRY(kmk_builtin_test, "test", FN_SIG_MAIN_TO_SPAWN, 0, 0), 266 254 /* Less frequently used commands: */ 267 BUILTIN_ENTRY(kmk_builtin_kDepIDB, FN_SIG_MAIN, 0, 0),268 BUILTIN_ENTRY(kmk_builtin_chmod, FN_SIG_MAIN, 0, 0),269 BUILTIN_ENTRY(kmk_builtin_cp, FN_SIG_MAIN, 0, 0),270 BUILTIN_ENTRY(kmk_builtin_expr, FN_SIG_MAIN, 0, 0),271 BUILTIN_ENTRY(kmk_builtin_ln, FN_SIG_MAIN, 0, 0),272 BUILTIN_ENTRY(kmk_builtin_md5sum, FN_SIG_MAIN, 0, 0),273 BUILTIN_ENTRY(kmk_builtin_cmp, FN_SIG_MAIN, 0, 0),274 BUILTIN_ENTRY(kmk_builtin_cat, FN_SIG_MAIN, 0, 0),275 BUILTIN_ENTRY(kmk_builtin_touch, FN_SIG_MAIN, 0, 0),276 BUILTIN_ENTRY(kmk_builtin_sleep, FN_SIG_MAIN, 0, 0),277 BUILTIN_ENTRY(kmk_builtin_dircache, FN_SIG_MAIN, 0, 0),255 BUILTIN_ENTRY(kmk_builtin_kDepIDB, "kDepIDB", FN_SIG_MAIN, 0, 0), 256 BUILTIN_ENTRY(kmk_builtin_chmod, "chmod", FN_SIG_MAIN, 0, 0), 257 BUILTIN_ENTRY(kmk_builtin_cp, "cp", FN_SIG_MAIN, 0, 1), 258 BUILTIN_ENTRY(kmk_builtin_expr, "expr", FN_SIG_MAIN, 0, 0), 259 BUILTIN_ENTRY(kmk_builtin_ln, "ln", FN_SIG_MAIN, 0, 0), 260 BUILTIN_ENTRY(kmk_builtin_md5sum, "md5sum", FN_SIG_MAIN, 0, 0), 261 BUILTIN_ENTRY(kmk_builtin_cmp, "cmp", FN_SIG_MAIN, 0, 0), 262 BUILTIN_ENTRY(kmk_builtin_cat, "cat", FN_SIG_MAIN, 0, 0), 263 BUILTIN_ENTRY(kmk_builtin_touch, "touch", FN_SIG_MAIN, 0, 0), 264 BUILTIN_ENTRY(kmk_builtin_sleep, "sleep", FN_SIG_MAIN, 0, 0), 265 BUILTIN_ENTRY(kmk_builtin_dircache, "dircache", FN_SIG_MAIN, 0, 0), 278 266 }; 279 267 … … 289 277 { 290 278 struct KMKBUILTINENTRY const *pEntry; 291 size_t cchCmd; 292 char ch0; 293 int cLeft; 279 size_t cchAndStart; 280 int cLeft; 294 281 295 282 pszCmd += sizeof(s_szPrefix) - 1; 283 284 /* 285 * Calc the length and start word to avoid calling memcmp/strcmp on each entry. 286 */ 287 #if K_ARCH_BITS != 64 && K_ARCH_BITS != 32 288 # error "PORT ME!" 289 #endif 290 cchAndStart = strlen(pszCmd); 291 #if K_ENDIAN == K_ENDIAN_BIG 292 cchAndStart <<= K_ARCH_BITS - 8; 293 switch (cchAndStart) 294 { 295 default: /* fall thru */ 296 # if K_ARCH_BITS >= 64 297 case 7: cchAndStart |= (size_t)pszCmd[6] << (K_ARCH_BITS - 56); /* fall thru */ 298 case 6: cchAndStart |= (size_t)pszCmd[5] << (K_ARCH_BITS - 48); /* fall thru */ 299 case 5: cchAndStart |= (size_t)pszCmd[4] << (K_ARCH_BITS - 40); /* fall thru */ 300 case 4: cchAndStart |= (size_t)pszCmd[3] << (K_ARCH_BITS - 32); /* fall thru */ 301 # endif 302 case 3: cchAndStart |= (size_t)pszCmd[2] << (K_ARCH_BITS - 24); /* fall thru */ 303 case 2: cchAndStart |= (size_t)pszCmd[1] << (K_ARCH_BITS - 16); /* fall thru */ 304 case 1: cchAndStart |= (size_t)pszCmd[0] << (K_ARCH_BITS - 8); /* fall thru */ 305 case 0: break; 306 } 307 #else 308 switch (cchAndStart) 309 { 310 default: /* fall thru */ 311 # if K_ARCH_BITS >= 64 312 case 7: cchAndStart |= (size_t)pszCmd[6] << 56; /* fall thru */ 313 case 6: cchAndStart |= (size_t)pszCmd[5] << 48; /* fall thru */ 314 case 5: cchAndStart |= (size_t)pszCmd[4] << 40; /* fall thru */ 315 case 4: cchAndStart |= (size_t)pszCmd[3] << 32; /* fall thru */ 316 # endif 317 case 3: cchAndStart |= (size_t)pszCmd[2] << 24; /* fall thru */ 318 case 2: cchAndStart |= (size_t)pszCmd[1] << 16; /* fall thru */ 319 case 1: cchAndStart |= (size_t)pszCmd[0] << 8; /* fall thru */ 320 case 0: break; 321 } 322 #endif 296 323 297 324 /* 298 325 * Look up the builtin command in the table. 299 326 */ 300 cchCmd = strlen(pszCmd);301 ch0 = *pszCmd;302 327 pEntry = &g_aBuiltins[0]; 303 328 cLeft = sizeof(g_aBuiltins) / sizeof(g_aBuiltins[0]); 304 329 while (cLeft-- > 0) 305 if ( *pEntry->pszName != ch0306 || pEntry->cchName != cchCmd307 || memcmp(pEntry->pszName, pszCmd, cchCmd) != 0)330 if ( pEntry->uName.cchAndStart != cchAndStart 331 || ( pEntry->uName.s.cch >= sizeof(cchAndStart) 332 && memcmp(pEntry->uName.s.sz, pszCmd, pEntry->uName.s.cch) != 0) ) 308 333 pEntry++; 309 334 else 310 335 { 336 /* 337 * That's a match! 338 */ 311 339 int rc; 312 #if defined(KBUILD_OS_WINDOWS) && CONFIG_NEW_WIN_CHILDREN340 #if defined(KBUILD_OS_WINDOWS) && defined(CONFIG_NEW_WIN_CHILDREN) 313 341 if (pEntry->fMpSafe) 342 rc = MkWinChildCreateBuiltIn(pEntry, argc, argv, pEntry->fNeedEnv ? pChild->environment : NULL, 343 pChild, pPidSpawned); 344 else 345 #endif 314 346 { 315 rc = 98; 316 } 317 else 318 #endif 319 { 320 char **envp = environ; /** @todo fixme? */ 347 char **envp = pChild->environment ? pChild->environment : environ; 321 348 322 349 /* … … 364 391 return rc; 365 392 } 393 394 /* 395 * No match! :-( 396 */ 366 397 fprintf(stderr, "kmk_builtin: Unknown command '%s%s'!\n", s_szPrefix, pszCmd); 367 398 } -
trunk/src/kmk/kmkbuiltin.h
r3159 r3169 63 63 int kmk_builtin_command_parsed(int argc, char **argv, struct child *pChild, char ***ppapszArgvToSpawn, pid_t *pPidSpawned); 64 64 65 /** 66 * kmk built-in command entry. 67 */ 68 typedef struct KMKBUILTINENTRY 69 { 70 union 71 { 72 struct 73 { 74 char cch; 75 char sz[15]; 76 } s; 77 size_t cchAndStart; 78 } uName; 79 union 80 { 81 uintptr_t uPfn; 82 #define FN_SIG_MAIN 0 83 int (* pfnMain)(int argc, char **argv, char **envp); 84 #define FN_SIG_MAIN_SPAWNS 1 85 int (* pfnMainSpawns)(int argc, char **argv, char **envp, struct child *pChild, pid_t *pPid); 86 #define FN_SIG_MAIN_TO_SPAWN 2 87 int (* pfnMainToSpawn)(int argc, char **argv, char **envp, char ***ppapszArgvToSpawn); 88 } u; 89 size_t uFnSignature : 8; 90 size_t fMpSafe : 1; 91 size_t fNeedEnv : 1; 92 } KMKBUILTINENTRY; 93 /** Pointer to kmk built-in command entry. */ 94 typedef KMKBUILTINENTRY const *PCKMKBUILTINENTRY; 95 65 96 extern int kmk_builtin_append(int argc, char **argv, char **envp); 66 97 extern int kmk_builtin_cp(int argc, char **argv, char **envp); -
trunk/src/kmk/w32/winchildren.c
r3165 r3169 109 109 #ifdef KMK 110 110 /** kmkbuiltin command. */ 111 WINCHILDTYPE_BUILT IN,111 WINCHILDTYPE_BUILT_IN, 112 112 /** kSubmit job. */ 113 113 WINCHILDTYPE_SUBMIT, … … 175 175 HANDLE hProcess; 176 176 } Process; 177 178 /** Data for WINCHILDTYPE_BUILT_IN. */ 179 struct 180 { 181 /** The built-in command. */ 182 PCKMKBUILTINENTRY pBuiltIn; 183 /** Number of arguments. */ 184 int cArgs; 185 /** Argument vector (single allocation, strings following array). */ 186 char **papszArgs; 187 /** Environment vector. Only a copy if fEnvIsCopy is set. */ 188 char **papszEnv; 189 } BuiltIn; 177 190 178 191 /** Data for WINCHILDTYPE_SUBMIT. */ … … 1643 1656 * @param pChild The kSubmit child. 1644 1657 */ 1645 static void mkWinChildcareWorkerThreadHandleBuiltin(PWINCHILDCAREWORKER pWorker, PWINCHILD pChild) 1646 { 1647 /** @todo later. */ 1648 __debugbreak(); 1658 static void mkWinChildcareWorkerThreadHandleBuiltIn(PWINCHILDCAREWORKER pWorker, PWINCHILD pChild) 1659 { 1660 PCKMKBUILTINENTRY pBuiltIn = pChild->u.BuiltIn.pBuiltIn; 1661 if (pBuiltIn->uFnSignature == FN_SIG_MAIN) 1662 pChild->iExitCode = pBuiltIn->u.pfnMain(pChild->u.BuiltIn.cArgs, pChild->u.BuiltIn.papszArgs, pChild->u.BuiltIn.papszEnv); 1663 else if (pBuiltIn->uFnSignature == FN_SIG_MAIN_SPAWNS) 1664 pChild->iExitCode = pBuiltIn->u.pfnMainSpawns(pChild->u.BuiltIn.cArgs, pChild->u.BuiltIn.papszArgs, 1665 pChild->u.BuiltIn.papszEnv, pChild->pMkChild, NULL); 1666 else 1667 { 1668 assert(0); 1669 pChild->iExitCode = 98; 1670 } 1649 1671 } 1650 1672 … … 1760 1782 break; 1761 1783 #ifdef KMK 1762 case WINCHILDTYPE_BUILT IN:1763 mkWinChildcareWorkerThreadHandleBuilt in(pWorker, pChild);1784 case WINCHILDTYPE_BUILT_IN: 1785 mkWinChildcareWorkerThreadHandleBuiltIn(pWorker, pChild); 1764 1786 break; 1765 1787 case WINCHILDTYPE_SUBMIT: … … 1969 1991 1970 1992 #ifdef KMK 1971 1972 case WINCHILDTYPE_BUILTIN: 1973 assert(0); 1993 case WINCHILDTYPE_BUILT_IN: 1994 if (pChild->u.BuiltIn.papszArgs) 1995 { 1996 free(pChild->u.BuiltIn.papszArgs); 1997 pChild->u.BuiltIn.papszArgs = NULL; 1998 } 1999 if (pChild->u.BuiltIn.papszEnv) 2000 { 2001 free(pChild->u.BuiltIn.papszEnv); 2002 pChild->u.BuiltIn.papszEnv = NULL; 2003 } 1974 2004 break; 1975 2005 … … 1989 2019 } 1990 2020 break; 1991 1992 2021 #endif /* KMK */ 1993 2022 … … 2230 2259 2231 2260 /** 2261 * Interface used by kmkbuiltin.c for executing builtin commands on threads. 2262 * 2263 * @returns 0 on success, windows status code on failure. 2264 * @param pBuiltIn The kmk built-in command entry. 2265 * @param cArgs The number of arguments in papszArgs. 2266 * @param papszArgs The argument vector. 2267 * @param papszEnv The environment vector, optional. 2268 * @param pMkChild The make child structure. 2269 * @param pPid Where to return the pid. 2270 */ 2271 int MkWinChildCreateBuiltIn(PCKMKBUILTINENTRY pBuiltIn, int cArgs, char **papszArgs, char **papszEnv, 2272 struct child *pMkChild, pid_t *pPid) 2273 { 2274 size_t cbIgnored; 2275 PWINCHILD pChild = mkWinChildNew(WINCHILDTYPE_BUILT_IN); 2276 pChild->pMkChild = pMkChild; 2277 pChild->u.BuiltIn.pBuiltIn = pBuiltIn; 2278 pChild->u.BuiltIn.cArgs = cArgs; 2279 pChild->u.BuiltIn.papszArgs = mkWinChildCopyStringArray(papszArgs, &cbIgnored); 2280 pChild->u.BuiltIn.papszEnv = papszEnv ? mkWinChildCopyStringArray(papszEnv, &cbIgnored) : NULL; 2281 return mkWinChildPushToCareWorker(pChild, pPid); 2282 } 2283 2284 /** 2232 2285 * Interface used by kSubmit.c for registering stuff to wait on. 2233 2286 * … … 2299 2352 break; 2300 2353 2301 case WINCHILDTYPE_BUILT IN:2354 case WINCHILDTYPE_BUILT_IN: 2302 2355 break; 2303 2356 … … 2364 2417 break; 2365 2418 #ifdef KMK 2366 case WINCHILDTYPE_BUILT IN:2419 case WINCHILDTYPE_BUILT_IN: 2367 2420 break; 2368 2421 case WINCHILDTYPE_SUBMIT: -
trunk/src/kmk/w32/winchildren.h
r3159 r3169 27 27 #define INCLUDED_WINCHILDREN_H 28 28 29 void MkWinChildInit(unsigned int cJobSlot); 30 void MkWinChildReExecMake(char **papszArgs, char **papszEnv); 29 30 void MkWinChildInit(unsigned int cJobSlot); 31 void MkWinChildReExecMake(char **papszArgs, char **papszEnv); 31 32 intptr_t MkWinChildGetCompleteEventHandle(void); 32 33 int MkWinChildCreate(char **papszArgs, char **papszEnv, const char *pszShell, struct child *pMkChild, pid_t *pPid); 33 34 int MkWinChildCreateWithStdOutPipe(char **papszArgs, char **papszEnv, int fdErr, pid_t *pPid, int *pfdReadPipe); 35 #ifdef KMK 36 struct KMKBUILTINENTRY; 37 int MkWinChildCreateBuiltIn(struct KMKBUILTINENTRY const *pBuiltIn, int cArgs, char **papszArgs, 38 char **papszEnv, struct child *pMkChild, pid_t *pPid); 34 39 int MkWinChildCreateSubmit(intptr_t hEvent, void *pvSubmitWorker, pid_t *pPid); 35 40 int MkWinChildCreateRedirect(intptr_t hProcess, pid_t *pPid); 41 #endif 36 42 int MkWinChildKill(pid_t pid, int iSignal, struct child *pMkChild); 37 43 int MkWinChildWait(int fBlock, pid_t *pPid, int *piExitCode, int *piSignal, int *pfCoreDumped, struct child **ppMkChild);
Note:
See TracChangeset
for help on using the changeset viewer.