VirtualBox

Changeset 3163 in kBuild for trunk/src


Ignore:
Timestamp:
Mar 20, 2018 3:28:01 AM (7 years ago)
Author:
bird
Message:

kmk_redirect: cleanup

File:
1 edited

Legend:

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

    r3162 r3163  
    105105# define ONLY_TARGET_STANDARD_HANDLES
    106106#endif
    107 
    108 
    109 
    110 #if defined(_MSC_VER)
    111 
    112 
    113 /** Used by safeCloseFd. */
    114 static void __cdecl ignore_invalid_parameter(const wchar_t *a, const wchar_t *b, const wchar_t *c, unsigned d, uintptr_t e)
    115 {
    116 }
    117 
    118 #endif /* _MSC_VER */
    119 
    120 #if 0 /* unused */
    121 /**
    122  * Safely works around MS CRT's pedantic close() function.
    123  *
    124  * @param   fd      The file handle.
    125  */
    126 static void safeCloseFd(int fd)
    127 {
    128 #ifdef _MSC_VER
    129     _invalid_parameter_handler pfnOld = _get_invalid_parameter_handler();
    130     _set_invalid_parameter_handler(ignore_invalid_parameter);
    131     close(fd);
    132     _set_invalid_parameter_handler(pfnOld);
    133 #else
    134     close(fd);
    135 #endif
    136 }
    137 #endif /* unused */
    138107
    139108
     
    231200#ifdef _MSC_VER
    232201
     202/** Used by mscGetOsHandle. */
     203static void __cdecl ignore_invalid_parameter(const wchar_t *a, const wchar_t *b, const wchar_t *c, unsigned d, uintptr_t e)
     204{
     205}
     206
    233207/**
    234208 * Safe way of getting the OS handle of a file descriptor without triggering
     
    375349static KBOOL kRedirectHasConflict(int fd, unsigned cOrders, REDIRECTORDERS *paOrders)
    376350{
     351#ifdef ONLY_TARGET_STANDARD_HANDLES
     352    if (fd >= 3)
     353        return K_TRUE;
     354#else
    377355    while (cOrders-- > 0)
    378356        if (paOrders[cOrders].fdTarget == fd)
    379357            return K_TRUE;
     358#endif
    380359    return K_FALSE;
    381360}
     
    434413    if (!kRedirectHasConflict(fdOpened, cOrders, paOrders))
    435414    {
     415#ifndef KBUILD_OS_WINDOWS
    436416        if (fdOpened != fdTarget)
    437417            return fdOpened;
    438 #ifndef _MSC_VER /* Stupid, stupid MSVCRT!  No friggin way of making a handle inheritable (or not). */
    439418# ifndef USE_FD_CLOEXEC
    440419        if (fcntl(fdOpened, F_SETFD, 0) != -1)
    441420# endif
     421#endif
    442422            return fdOpened;
    443 #endif
    444423    }
    445424
     
    454433        if (fdOpened >= 0)
    455434        {
     435            if (!kRedirectHasConflict(fdOpened, cOrders, paOrders))
     436            {
    456437#ifndef KBUILD_OS_WINDOWS
    457             if (   !kRedirectHasConflict(fdOpened, cOrders, paOrders)
    458 # ifdef _MSC_VER
    459                 && fdOpened != fdTarget
    460 # endif
    461                 )
    462 #endif
    463             {
    464 #ifndef _MSC_VER
    465438# ifdef USE_FD_CLOEXEC
    466439                if (   fdOpened == fdTarget
     
    550523     * First, check if there's actually handle here that needs saving.
    551524     */
    552 # ifdef KBUILD_OS_WINDOWS
    553     HANDLE hToSave = mscGetOsHandle(fdToSave);
    554     if (hToSave != INVALID_HANDLE_VALUE)
    555     {
    556         pToSave->fSaved = _setmode(fdToSave, _O_BINARY);
    557         if (pToSave->fSaved != _O_BINARY)
    558             _setmode(fdToSave, pToSave->fSaved);
    559         if (!mscIsNativeHandleInheritable(hToSave))
    560             pToSave->fSaved |= _O_NOINHERIT;
    561     }
    562     if (hToSave != INVALID_HANDLE_VALUE)
    563 # else
    564525    pToSave->fSaved = fcntl(pToSave->fdTarget, F_GETFD, 0);
    565526    if (pToSave->fSaved != -1)
    566 # endif
    567527    {
    568528        /*
    569529         * Try up to 32 times to get a duplicate descriptor that doesn't conflict.
    570530         */
    571 # ifdef KBUILD_OS_WINDOWS
    572         HANDLE hCurProc = GetCurrentProcess();
    573 # endif
    574531        int aFdTries[32];
    575532        int cTries = 0;
     
    578535            /* Duplicate the handle (windows makes this complicated). */
    579536            int fdDup;
    580 # ifdef KBUILD_OS_WINDOWS
    581             HANDLE hDup = INVALID_HANDLE_VALUE;
    582             if (!DuplicateHandle(hCurProc, hToSave, hCurProc, &hDup, 0 /* DesiredAccess */,
    583                                 FALSE /*fInherit*/, DUPLICATE_SAME_ACCESS))
    584             {
    585                 fprintf(*ppWorkingStdErr, "%s: DuplicateHandle(%#x) failed: %u\n", g_progname, hToSave, GetLastError());
    586                 break;
    587             }
    588             fdDup = _open_osfhandle((intptr_t)hDup, pToSave->fSaved | _O_NOINHERIT);
    589             if (fdDup == -1)
    590             {
    591                 fprintf(*ppWorkingStdErr, "%s: _open_osfhandle(%#x) failed: %u\n", g_progname, hDup, strerror(errno));
    592                 CloseHandle(hDup);
    593                 break;
    594             }
    595 # else
    596537            fdDup = dup(fdToSave);
    597538            if (fdDup == -1)
     
    600541                break;
    601542            }
    602 #endif
    603543            /* Is the duplicate usable? */
    604544            if (!kRedirectHasConflict(fdDup, cOrders, paOrders))
     
    662602            KBOOL fRestoreStdErr = *ppWorkingStdErr != stderr
    663603                                 && paOrders[i].fdSaved == fileno(*ppWorkingStdErr);
    664 
    665 #ifdef KBUILD_OS_WINDOWS
    666             if (mscDup3(paOrders[i].fdSaved, paOrders[i].fdTarget, paOrders[i].fSaved, *ppWorkingStdErr) != -1)
    667 #else
    668604            if (dup2(paOrders[i].fdSaved, paOrders[i].fdTarget) != -1)
    669 #endif
    670605            {
    671606                close(paOrders[i].fdSaved);
     
    678613                }
    679614            }
    680 #ifndef KBUILD_OS_WINDOWS
    681615            else
    682616                fprintf(*ppWorkingStdErr, "%s: dup2(%d,%d) failed: %s\n",
    683617                        g_progname, paOrders[i].fdSaved, paOrders[i].fdTarget, strerror(errno));
    684 #endif
    685         }
    686 
    687 #ifndef KBUILD_OS_WINDOWS
     618        }
     619
    688620        if (paOrders[i].fSaved != -1)
    689621        {
     
    694626                        g_progname, paOrders[i].fdTarget, paOrders[i].fSaved & FD_CLOEXEC ? "FD_CLOEXEC" : "0", strerror(errno));
    695627        }
    696 #endif
    697628    }
    698629    errno = iSavedErrno;
     
    728659                    if (paOrders[j].fdTarget == fdTarget)
    729660                        break;
    730 # ifdef _MSC_VER
    731                 if (j >= cOrders && !mscIsInheritable(fdTarget))
    732                     rcExit = 0;
    733 # else
    734661                if (j >= cOrders)
    735662                {
     
    751678                        fprintf(*ppWorkingStdErr, "%s: fcntl(%d,F_GETFD,0) failed: %s\n", g_progname, fdTarget, strerror(errno));
    752679                }
    753 # endif
    754680                else
    755681                    rcExit = kRedirectSaveHandle(&paOrders[i], cOrders, paOrders, ppWorkingStdErr);
     
    794720
    795721#endif /* !USE_POSIX_SPAWN */
    796 
    797722#ifdef KBUILD_OS_WINDOWS
    798723
     
    11211046    return rc;
    11221047}
     1048
    11231049#endif /* KBUILD_OS_WINDOWS */
    11241050
     
    12251151             */
    12261152            FILE *pWorkingStdErr = NULL;
    1227 #  if defined(CONFIG_NEW_WIN_CHILDREN) && defined(KMK)
    1228             if (cOrders > 0)
    1229                 MkWinChildExclusiveAcquire();
    1230 #  endif
    12311153            rcExit = kRedirectExecFdOrders(cOrders, paOrders, &pWorkingStdErr);
    12321154            if (rcExit == 0)
     
    12371159                 * We're spawning from within kmk.
    12381160                 */
    1239 # if defined(KBUILD_OS_WINDOWS)
     1161# ifdef KBUILD_OS_WINDOWS
    12401162                /* Windows is slightly complicated due to handles and winchildren.c. */
    1241 #  if 1
    12421163                HANDLE hProcess = INVALID_HANDLE_VALUE;
    12431164                rcExit = kRedirectCreateProcessWindows(pszExecutable, cArgs, papszArgs, papszEnvVars, pszCwd,
    12441165                                                       cOrders, paOrders, &hProcess);
    12451166                if (rcExit == 0)
    1246 #  else
    1247                 HANDLE  hProcess = (HANDLE)_spawnvpe(_P_NOWAIT, pszExecutable, papszArgs, papszEnvVars);
    1248                 kRedirectRestoreFdOrders(cOrders, paOrders, &pWorkingStdErr);
    1249 #  ifdef CONFIG_NEW_WIN_CHILDREN
    1250                 if (cOrders > 0)
    1251                     MkWinChildExclusiveRelease();
    1252 #  endif
    1253                 if ((intptr_t)hProcess != -1)
    1254 # endif
    12551167                {
    12561168#  ifndef CONFIG_NEW_WIN_CHILDREN
     
    12891201                    }
    12901202                }
    1291 #  if 0
    1292                 else
    1293                     rcExit = err(10, "_spawnvpe(%s) failed", pszExecutable);
    1294 #  endif
    12951203
    12961204# elif defined(KBUILD_OS_OS2)
     
    13431251                }
    13441252
    1345 #elif defined(KBUILD_OS_WINDOWS) || defined(KBUILD_OS_OS2)
     1253#elif defined(KBUILD_OS_OS2)
    13461254                errno  = 0;
    1347 #  if defined(KBUILD_OS_WINDOWS)
    1348                 rcExit = (int)_spawnvpe(_P_WAIT, pszExecutable, papszArgs, papszEnvVars);
    1349 #  else
    13501255                rcExit = (int)_spawnvpe(P_WAIT, pszExecutable, papszArgs, papszEnvVars);
    1351 #  endif
    13521256                kRedirectRestoreFdOrders(cOrders, paOrders, &pWorkingStdErr);
    13531257                if (rcExit != -1 || errno == 0)
     
    13931297                else
    13941298                    rcExit = errx(10, "posix_spawnp(%s) failed: %s", pszExecutable, strerror(rcExit));
    1395 
    13961299# endif
    13971300#endif /* !KMK */
    13981301            }
    1399 #if defined(CONFIG_NEW_WIN_CHILDREN) && defined(KBUILD_OS_WINDOWS) && defined(KMK) && 0
    1400             else if (cOrders > 0)
    1401                 MkWinChildExclusiveRelease();
    1402 #endif
    1403 
    1404         }
    1405 
     1302        }
     1303
     1304#ifndef KBUILD_OS_WINDOWS
    14061305        /*
    14071306         * Restore the current directory.
     
    14121311                warn("Failed to restore directory to '%s'", pszSavedCwd);
    14131312        }
     1313#endif
    14141314    }
    14151315#ifdef _MSC_VER
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