VirtualBox

Changeset 3173 in kBuild for trunk/src/kmk/kmkbuiltin/redirect.c


Ignore:
Timestamp:
Mar 21, 2018 9:37:41 PM (7 years ago)
Author:
bird
Message:

kmkbultin: environment fixes and stats.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/kmkbuiltin/redirect.c

    r3164 r3173  
    7474#include "kmkbuiltin.h"
    7575#ifdef KMK
    76 # include "job.h"
    77 # include "variable.h"
    7876# ifdef KBUILD_OS_WINDOWS
    7977#  ifndef CONFIG_NEW_WIN_CHILDREN
     
    11611159                /* Windows is slightly complicated due to handles and winchildren.c. */
    11621160                HANDLE hProcess = INVALID_HANDLE_VALUE;
    1163                 rcExit = kRedirectCreateProcessWindows(pszExecutable, cArgs, papszArgs, papszEnvVars, pszCwd,
    1164                                                        cOrders, paOrders, &hProcess);
     1161                rcExit = kRedirectCreateProcessWindows(pszExecutable, cArgs, papszArgs, papszEnvVars,
     1162                                                       pszSavedCwd ? pszCwd : NULL, cOrders, paOrders, &hProcess);
    11651163                if (rcExit == 0)
    11661164                {
     
    11681166                    if (process_kmk_register_redirect(hProcess, pPidSpawned) == 0)
    11691167#  else
    1170                     if (MkWinChildCreateRedirect((intptr_t)hProcess, pPidSpawned) == 0)
     1168                    if (   pPidSpawned
     1169                        && MkWinChildCreateRedirect((intptr_t)hProcess, pPidSpawned) == 0)
    11711170#  endif
    11721171                    {
     
    11801179                        warn("sub_proc is out of slots, waiting for child...");
    11811180#  else
    1182                         warn("MkWinChildCreateRedirect failed...");
     1181                        if (pPidSpawned)
     1182                            warn("MkWinChildCreateRedirect failed...");
    11831183#  endif
    11841184                        dwTmp = WaitForSingleObject(hProcess, INFINITE);
     
    11961196
    11971197                        CloseHandle(hProcess);
    1198                         *pPidSpawned = 0;
     1198                        if (pPidSpawned)
     1199                            *pPidSpawned = 0;
    11991200                        *pfIsChildExitCode = K_TRUE;
    12001201                    }
     
    12341235# ifdef KBUILD_OS_WINDOWS
    12351236                HANDLE hProcess = INVALID_HANDLE_VALUE;
    1236                 rcExit = kRedirectCreateProcessWindows(pszExecutable, cArgs, papszArgs, papszEnvVars, pszCwd,
    1237                                                        cOrders, paOrders, &hProcess);
     1237                rcExit = kRedirectCreateProcessWindows(pszExecutable, cArgs, papszArgs, papszEnvVars,
     1238                                                       pszSavedCwd ? pszCwd : NULL, cOrders, paOrders, &hProcess);
    12381239                if (rcExit == 0)
    12391240                {
     
    13481349    char          **papszEnvVars       = NULL;
    13491350    unsigned        cAllocatedEnvVars;
    1350     unsigned        iEnvVar;
    13511351    unsigned        cEnvVars;
    13521352    int             fWatcomBrainDamage = 0;
     
    13781378        return err(9, "getcwd failed");
    13791379
    1380 #if defined(KMK)
    1381     /* We get it from kmk and just count it:  */
    1382     papszEnvVars = pChild->environment;
    1383     if (!papszEnvVars)
    1384         pChild->environment = papszEnvVars = target_environment(pChild->file);
     1380    /* We start out with a read-only enviornment from kmk or the crt, and will
     1381       duplicate it if we make changes to it. */
     1382    cAllocatedEnvVars = 0;
     1383    papszEnvVars = envp;
    13851384    cEnvVars = 0;
    13861385    while (papszEnvVars[cEnvVars] != NULL)
    13871386        cEnvVars++;
    1388     cAllocatedEnvVars = cEnvVars;
    1389 #else
    1390     /* We make a copy and we manage ourselves: */
    1391     cEnvVars = 0;
    1392     while (envp[cEnvVars] != NULL)
    1393         cEnvVars++;
    1394 
    1395     cAllocatedEnvVars = cEnvVars + 4;
    1396     papszEnvVars = malloc((cAllocatedEnvVars + 1) * sizeof(papszEnvVars));
    1397     if (!papszEnvVars)
    1398         return errx(9, "out of memory!");
    1399 
    1400     iEnvVar = cEnvVars;
    1401     papszEnvVars[iEnvVar] = NULL;
    1402     while (iEnvVar-- > 0)
    1403     {
    1404         papszEnvVars[iEnvVar] = strdup(envp[iEnvVar]);
    1405         if (!papszEnvVars[iEnvVar])
    1406         {
    1407             while (iEnvVar-- > 0)
    1408                 free(papszEnvVars[iEnvVar]);
    1409             free(papszEnvVars);
    1410             return errx(9, "out of memory!");
    1411         }
    1412     }
    1413 #endif
    14141387
    14151388#ifdef USE_POSIX_SPAWN
     
    15781551                {
    15791552                    if (pchEqual[1] != '\0')
    1580                     {
    15811553                        rcExit = kBuiltinOptEnvSet(&papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszValue);
    1582 #ifdef KMK
    1583                         pChild->environment = papszEnvVars;
    1584 #endif
    1585                     }
    15861554                    else
    15871555                    {
     
    15901558                        {
    15911559                            pszCopy[pchEqual - pszValue] = '\0';
    1592                             rcExit = kBuiltinOptEnvUnset(papszEnvVars, &cEnvVars, cVerbosity, pszCopy);
     1560                            rcExit = kBuiltinOptEnvUnset(&papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszCopy);
    15931561                            free(pszCopy);
    15941562                        }
     
    16331601                else
    16341602#endif
    1635                     rcExit = kBuiltinOptEnvUnset(papszEnvVars, &cEnvVars, cVerbosity, pszValue);
     1603                    rcExit = kBuiltinOptEnvUnset(&papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszValue);
    16361604                continue;
    16371605            }
     
    16431611                || chOpt == 'i' /* GNU env compatibility. */ )
    16441612            {
    1645                 for (iEnvVar = 0; iEnvVar < cEnvVars; iEnvVar++)
    1646                     free(papszEnvVars[iEnvVar]);
    1647                 papszEnvVars[0] = NULL;
    1648                 cEnvVars = 0;
     1613                rcExit = kBuiltinOptEnvZap(&papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity);
    16491614                continue;
    16501615            }
     
    19981963     * Cleanup.
    19991964     */
     1965    kBuiltinOptEnvCleanup(&papszEnvVars, cEnvVars, &cAllocatedEnvVars);
    20001966    if (pszSavedCwd)
    20011967        free(pszSavedCwd);
     
    20041970    posix_spawn_file_actions_destroy(&FileActions);
    20051971#endif
    2006 #ifndef KMK
    2007     iEnvVar = cEnvVars;
    2008     while (iEnvVar-- > 0)
    2009         free(papszEnvVars[iEnvVar]);
    2010     free(papszEnvVars);
    2011 #endif
    20121972#ifdef KBUILD_OS_OS2
    20131973    for (ulLibPath = 0; ulLibPath < K_ELEMENTS(apszSavedLibPaths); ulLibPath++)
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette