VirtualBox

Changeset 3029 in kBuild


Ignore:
Timestamp:
Apr 13, 2017 1:32:42 PM (8 years ago)
Author:
bird
Message:

kmk,redirect: bootstrap and build fixes.

Location:
trunk/src/kmk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/Makefile.am

    r2723 r3029  
    5757                ../lib/md5.c \
    5858                ../lib/kDep.c \
     59                ../lib/kbuild_version.c \
     60                ../lib/maybe_con_fwrite.c \
    5961                \
    6062                kmkbuiltin.c \
     
    7678                kmkbuiltin/mv.c \
    7779                kmkbuiltin/printf.c \
     80                kmkbuiltin/redirect.c \
    7881                kmkbuiltin/rm.c \
    7982                kmkbuiltin/rmdir.c \
     
    8790                kmkbuiltin/osdep.c \
    8891                kmkbuiltin/kbuild_protection.c \
    89                 kmkbuiltin/kbuild_version.c
    90 
    91 kmk_redirect_SOURCES = kmkbuiltin/redirect.c
     92                kmkbuiltin/common-env-and-cwd-opt.c
     93
     94kmk_redirect_SOURCES = kmkbuiltin/redirect.c \
     95                kmkbuiltin/common-env-and-cwd-opt.c \
     96                kmkbuiltin/err.c \
     97                ../lib/kbuild_version.c
     98kmk_redirect_CFLAGS = -UKMK
     99
    92100
    93101EXTRA_kmk_SOURCES = vmsjobs.c remote-stub.c remote-cstms.c
     
    172180    @DEFS@
    173181
    174 AM_CPPFLAGS =   $(GLOBINC) -I$(srcdir)/../lib
     182AM_CPPFLAGS =   $(GLOBINC) -I$(srcdir)/../lib -I$(srcdir)/../lib/kStuff/include
    175183# Only process if target is MS-Windows
    176184if WINDOWSENV
  • trunk/src/kmk/kmkbuiltin/redirect.c

    r2916 r3029  
    2727*   Header Files                                                               *
    2828*******************************************************************************/
    29 #ifdef __APPLE__
    30 # define _POSIX_C_SOURCE 1 /* 10.4 sdk and unsetenv */
     29#if defined(__APPLE__)
     30/*# define _POSIX_C_SOURCE 1  / *  10.4 sdk and unsetenv  * / - breaks O_CLOEXEC on 10.8 */
    3131#endif
    3232#include "make.h"
     
    9090#endif /* _MSC_VER */
    9191
    92 
     92#if 0 /* unused */
    9393/**
    9494 * Safely works around MS CRT's pedantic close() function.
     
    107107#endif
    108108}
     109#endif /* unused */
    109110
    110111
     
    176177        kRedirectOrder_Close,
    177178        kRedirectOrder_Open,
    178         kRedirectOrder_Dup,
     179        kRedirectOrder_Dup
    179180    }           enmOrder;
    180181    /** The target file handle. */
     
    386387#endif
    387388    int         aFdTries[32];
    388     int         cTries;
     389    unsigned    cTries;
    389390    int         fdOpened;
    390391
     
    456457    return -1;
    457458}
     459
     460
     461/**
     462 * Cleans up the file operation orders.
     463 *
     464 * This does not restore stuff, just closes handles we've opened for the child.
     465 *
     466 * @param   cOrders         Number of file operation orders.
     467 * @param   paOrders        The file operation orders.
     468 * @param   fFailed         Set if it's a failure.
     469 */
     470static void kRedirectCleanupFdOrders(unsigned cOrders, REDIRECTORDERS *paOrders, KBOOL fFailure)
     471{
     472    unsigned i = cOrders;
     473    while (i-- > 0)
     474    {
     475        if (   paOrders[i].enmOrder == kRedirectOrder_Open
     476            && paOrders[i].fdSource != -1)
     477        {
     478            close(paOrders[i].fdSource);
     479            paOrders[i].fdSource = -1;
     480            if (   fFailure
     481                && paOrders[i].fRemoveOnFailure
     482                && paOrders[i].pszFilename)
     483                remove(paOrders[i].pszFilename);
     484        }
     485    }
     486}
     487
    458488
    459489#ifndef USE_POSIX_SPAWN
     
    574604
    575605/**
    576  * Cleans up the file operation orders.
    577  *
    578  * This does not restore stuff, just closes handles we've opened for the guest.
    579  *
    580  * @param   cOrders         Number of file operation orders.
    581  * @param   paOrders        The file operation orders.
    582  * @param   fFailed         Set if it's a failure.
    583  */
    584 static void kRedirectCleanupFdOrders(unsigned cOrders, REDIRECTORDERS *paOrders, KBOOL fFailure)
    585 {
    586     unsigned i = cOrders;
    587     while (i-- > 0)
    588     {
    589         if (   paOrders[i].enmOrder == kRedirectOrder_Open
    590             && paOrders[i].fdSource != -1)
    591         {
    592             close(paOrders[i].fdSource);
    593             paOrders[i].fdSource = -1;
    594             if (   fFailure
    595                 && paOrders[i].fRemoveOnFailure
    596                 && paOrders[i].pszFilename)
    597                 remove(paOrders[i].pszFilename);
    598         }
    599     }
    600 }
    601 
    602 
    603 /**
    604606 * Restores the target file descriptors affected by the file operation orders.
    605607 *
     
    763765 * @param   fWatcomBrainDamage  Whether MSC need to do quoting according to
    764766 *                              weird Watcom WCC rules.
    765  * @param   papszEnv            The child environment vector.
     767 * @param   papszEnvVars        The child environment vector.
    766768 * @param   pszCwd              The current working directory of the child.
    767769 * @param   pszSavedCwd         The saved current working directory.  This is
     
    777779 *                              is from the child or from our setup efforts.
    778780 */
    779 static int kRedirectDoSpawn(const char *pszExecutable, int cArgs, char **papszArgs, int fWatcomBrainDamage, char **papszEnv,
     781static int kRedirectDoSpawn(const char *pszExecutable, int cArgs, char **papszArgs, int fWatcomBrainDamage, char **papszEnvVars,
    780782                            const char *pszCwd, const char *pszSavedCwd, unsigned cOrders, REDIRECTORDERS *paOrders,
    781783#ifdef USE_POSIX_SPAWN
     
    863865#if defined(KBUILD_OS_WINDOWS)
    864866                /* Windows is slightly complicated due to handles and sub_proc.c. */
    865                 HANDLE  hProcess = (HANDLE)_spawnvpe(_P_NOWAIT, pszExecutable, papszArgs, papszEnv);
     867                HANDLE  hProcess = (HANDLE)_spawnvpe(_P_NOWAIT, pszExecutable, papszArgs, papszEnvVars);
    866868                kRedirectRestoreFdOrders(cOrders, paOrders, &pWorkingStdErr);
    867869                if ((intptr_t)hProcess != -1)
     
    898900
    899901# elif defined(KBUILD_OS_OS2)
    900                 *pPidSpawned = _spawnve(_P_NOWAIT, pszExecutable, papszArgs, papszEnv);
     902                *pPidSpawned = _spawnve(_P_NOWAIT, pszExecutable, papszArgs, papszEnvVars);
    901903                kRedirectRestoreFdOrders(cOrders, paOrders, &pWorkingStdErr);
    902904                if (*pPidSpawned != -1)
     
    930932# if defined(KBUILD_OS_WINDOWS) || defined(KBUILD_OS_OS2)
    931933                errno  = 0;
    932                 rcExit = (int)_spawnvpe(_P_WAIT, pszExecutable, papszArgs, papszEnv);
     934                rcExit = (int)_spawnvpe(_P_WAIT, pszExecutable, papszArgs, papszEnvVars);
    933935                kRedirectRestoreFdOrders(cOrders, paOrders, &pWorkingStdErr);
    934936                if (rcExit != -1 || errno == 0)
     
    10231025    int             iArg;
    10241026    const char     *pszExecutable      = NULL;
    1025     char          **papszEnv           = NULL;
     1027    char          **papszEnvVars       = NULL;
    10261028    unsigned        cAllocatedEnvVars;
    10271029    unsigned        iEnvVar;
     
    10571059#if defined(KMK)
    10581060    /* We get it from kmk and just count it:  */
    1059     papszEnv = pChild->environment;
    1060     if (!papszEnv)
    1061         pChild->environment = papszEnv = target_environment(pChild->file);
     1061    papszEnvVars = pChild->environment;
     1062    if (!papszEnvVars)
     1063        pChild->environment = papszEnvVars = target_environment(pChild->file);
    10621064    cEnvVars = 0;
    1063     while (papszEnv[cEnvVars] != NULL)
     1065    while (papszEnvVars[cEnvVars] != NULL)
    10641066        cEnvVars++;
    10651067    cAllocatedEnvVars = cEnvVars;
     
    10711073
    10721074    cAllocatedEnvVars = cEnvVars + 4;
    1073     papszEnv = malloc((cAllocatedEnvVars + 1) * sizeof(papszEnv));
    1074     if (!papszEnv)
     1075    papszEnvVars = malloc((cAllocatedEnvVars + 1) * sizeof(papszEnvVars));
     1076    if (!papszEnvVars)
    10751077        return errx(9, "out of memory!");
    10761078
    10771079    iEnvVar = cEnvVars;
    1078     papszEnv[iEnvVar] = NULL;
     1080    papszEnvVars[iEnvVar] = NULL;
    10791081    while (iEnvVar-- > 0)
    10801082    {
    1081         papszEnv[iEnvVar] = strdup(envp[iEnvVar]);
    1082         if (!papszEnv[iEnvVar])
     1083        papszEnvVars[iEnvVar] = strdup(envp[iEnvVar]);
     1084        if (!papszEnvVars[iEnvVar])
    10831085        {
    10841086            while (iEnvVar-- > 0)
    1085                 free(papszEnv[iEnvVar]);
    1086             free(papszEnv);
     1087                free(papszEnvVars[iEnvVar]);
     1088            free(papszEnvVars);
    10871089            return errx(9, "out of memory!");
    10881090        }
     
    12451247                    if (pchEqual[1] != '\0')
    12461248                    {
    1247                         rcExit = kBuiltinOptEnvSet(&papszEnv, &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszValue);
     1249                        rcExit = kBuiltinOptEnvSet(&papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszValue);
    12481250#ifdef KMK
    1249                         pChild->environment = papszEnv;
     1251                        pChild->environment = papszEnvVars;
    12501252#endif
    12511253                    }
     
    12561258                        {
    12571259                            pszCopy[pchEqual - pszValue] = '\0';
    1258                             rcExit = kBuiltinOptEnvUnset(papszEnv, &cEnvVars, cVerbosity, pszCopy);
     1260                            rcExit = kBuiltinOptEnvUnset(papszEnvVars, &cEnvVars, cVerbosity, pszCopy);
    12591261                            free(pszCopy);
    12601262                        }
     
    12801282                else
    12811283#endif
    1282                     rcExit = kBuiltinOptEnvUnset(papszEnv, &cEnvVars, cVerbosity, pszValue);
     1284                    rcExit = kBuiltinOptEnvUnset(papszEnvVars, &cEnvVars, cVerbosity, pszValue);
    12831285                continue;
    12841286            }
     
    12911293            {
    12921294                for (iEnvVar = 0; iEnvVar < cEnvVars; iEnvVar++)
    1293                     free(papszEnv[iEnvVar]);
    1294                 papszEnv[0] = NULL;
     1295                    free(papszEnvVars[iEnvVar]);
     1296                papszEnvVars[0] = NULL;
    12951297                cEnvVars = 0;
    12961298                continue;
     
    15771579
    15781580#ifdef USE_POSIX_SPAWN
    1579                     if (fdOpened != fdSource)
     1581                    if (fdOpened != fd)
    15801582                    {
    15811583                        rcExit = posix_spawn_file_actions_adddup2(&FileActions, fdOpened, fd);
     
    16071609         * Do the spawning in a separate function (main is far to large as it is by now).
    16081610         */
    1609         rcExit = kRedirectDoSpawn(pszExecutable, argc - iArg, &argv[iArg], fWatcomBrainDamage, papszEnv, szCwd, pszSavedCwd,
     1611        rcExit = kRedirectDoSpawn(pszExecutable, argc - iArg, &argv[iArg], fWatcomBrainDamage, papszEnvVars, szCwd, pszSavedCwd,
    16101612#ifdef USE_POSIX_SPAWN
    16111613                                  cOrders, aOrders, &FileActions, cVerbosity,
     
    16391641    iEnvVar = cEnvVars;
    16401642    while (iEnvVar-- > 0)
    1641         free(papszEnv[iEnvVar]);
    1642     free(papszEnv);
     1643        free(papszEnvVars[iEnvVar]);
     1644    free(papszEnvVars);
    16431645#endif
    16441646#ifdef KBUILD_OS_OS2
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