VirtualBox

Ignore:
Timestamp:
Jun 28, 2019 3:51:27 PM (6 years ago)
Author:
vboxsync
Message:

ValKit/TXS: Implemented CHMOD, added PUT2FILE w/ mode mask, added ${CWD}, ${TXSDIR} and ${env.xxxx} variables. bugref:9151

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ValidationKit/utils/TestExecServ/TestExecService.cpp

    r76553 r79416  
    177177/** The default CD/DVD-ROM path. */
    178178static char                 g_szDefCdRomPath[RTPATH_MAX];
     179/** The directory containing the TXS executable. */
     180static char                 g_szTxsDir[RTPATH_MAX];
     181/** The current working directory for TXS (doesn't change). */
     182static char                 g_szCwd[RTPATH_MAX];
    179183/** The operating system short name. */
    180184static char                 g_szOsShortName[16];
     
    549553    while ((pszDollar = strchr(pszDollar, '$')) != NULL)
    550554    {
     555        /** @todo employ $$ as escape sequence here. */
    551556        if (pszDollar[1] == '{')
    552557        {
    553             const char *pszEnd = strchr(&pszDollar[2], '}');
     558            char *pszEnd = strchr(&pszDollar[2], '}');
    554559            if (pszEnd)
    555560            {
     
    574579                else IF_VARIABLE_DO(pszDollar, "${EXESUFF}", g_szExeSuff)
    575580                else IF_VARIABLE_DO(pszDollar, "${SCRIPTSUFF}", g_szScriptSuff)
     581                else IF_VARIABLE_DO(pszDollar, "${TXSDIR}",  g_szTxsDir)
     582                else IF_VARIABLE_DO(pszDollar, "${CWD}",     g_szCwd)
     583                else if (   cchVar >= sizeof("${env.") + 1
     584                         && memcmp(pszDollar, RT_STR_TUPLE("${env.")) == 0)
     585                {
     586                    const char *pszEnvVar = pszDollar + 6;
     587                    size_t      cchValue  = 0;
     588                    char        szValue[RTPATH_MAX];
     589                    *pszEnd = '\0';
     590                    rc = RTEnvGetEx(RTENV_DEFAULT, pszEnvVar, szValue, sizeof(szValue), &cchValue);
     591                    if (RT_SUCCESS(rc))
     592                    {
     593                        *pszEnd = '}';
     594                        rc = txsReplaceStringVariable(&pszNew, &cchNew, offDollar, cchVar, szValue, cchValue);
     595                        offDollar += cchValue;
     596                    }
     597                    else
     598                    {
     599                        if (rc == VERR_ENV_VAR_NOT_FOUND)
     600                            *prcSend = txsReplyFailure(pPktHdr, "UNKN VAR", "Environment variable '%s' encountered in '%s'",
     601                                                       pszEnvVar, pszSrc);
     602                        else
     603                            *prcSend = txsReplyFailure(pPktHdr, "FAILDENV",
     604                                                       "RTEnvGetEx(,'%s',,,) failed with %Rrc (opcode '%.8s')",
     605                                                       pszEnvVar, rc, pPktHdr->achOpcode);
     606                        RTStrFree(pszNew);
     607                        *ppszNew = NULL;
     608                        return false;
     609                    }
     610                }
    576611                else
    577612                {
     
    743778    return rc;
    744779}
     780
     781///**
     782// * Expands the variables in the string and sends it back to the host.
     783// *
     784// * @returns IPRT status code from send.
     785// * @param   pPktHdr             The expand string packet.
     786// */
     787//static int txsDoExpandString(PCTXSPKTHDR pPktHdr)
     788//{
     789//    int rc;
     790//    char *pszIn;
     791//    if (!txsIsStringPktValid(pPktHdr, "string", &pszIn, &rc))
     792//        return rc;
     793//
     794//    txsReplyRc
     795//
     796//}
    745797
    746798/**
     
    874926 * @returns IPRT status code from send.
    875927 * @param   pPktHdr             The put file packet.
    876  */
    877 static int txsDoPutFile(PCTXSPKTHDR pPktHdr)
     928 * @param   fHasMode            Set if the packet starts with a mode field.
     929 */
     930static int txsDoPutFile(PCTXSPKTHDR pPktHdr, bool fHasMode)
    878931{
    879932    int rc;
    880     char *pszPath;
    881     if (!txsIsStringPktValid(pPktHdr, "file", &pszPath, &rc))
    882         return rc;
     933    RTFMODE fMode = 0;
     934    char   *pszPath;
     935    if (!fHasMode)
     936    {
     937        if (!txsIsStringPktValid(pPktHdr, "file", &pszPath, &rc))
     938            return rc;
     939    }
     940    else
     941    {
     942        /* After the packet header follows a mode mask and the remainder of
     943           the packet is the zero terminated file name. */
     944        size_t const cbMin = sizeof(TXSPKTHDR) + sizeof(RTFMODE) + 2;
     945        if (pPktHdr->cb < cbMin)
     946            return txsReplyBadMinSize(pPktHdr, cbMin);
     947        if (!txsIsStringValid(pPktHdr, "file", (const char *)(pPktHdr + 1) + sizeof(RTFMODE), &pszPath, NULL, &rc))
     948            return rc;
     949        fMode = *(RTFMODE const *)(pPktHdr + 1);
     950        fMode <<= RTFILE_O_CREATE_MODE_SHIFT;
     951        fMode &= RTFILE_O_CREATE_MODE_MASK;
     952    }
    883953
    884954    RTFILE hFile;
    885     rc = RTFileOpen(&hFile, pszPath, RTFILE_O_WRITE | RTFILE_O_DENY_WRITE | RTFILE_O_CREATE_REPLACE);
     955    rc = RTFileOpen(&hFile, pszPath, RTFILE_O_WRITE | RTFILE_O_DENY_WRITE | RTFILE_O_CREATE_REPLACE | fMode);
    886956    if (RT_SUCCESS(rc))
    887957    {
     
    890960        if (RT_SUCCESS(rc))
    891961        {
     962            if (fMode)
     963                RTFileSetMode(hFile, fMode);
     964
    892965            /*
    893966             * Read client command packets and process them.
     
    11481221static int txsDoChMod(PCTXSPKTHDR pPktHdr)
    11491222{
    1150     return txsReplyNotImplemented(pPktHdr);
     1223    /* After the packet header follows a mode mask and the remainder of
     1224       the packet is the zero terminated file name. */
     1225    size_t const cbMin = sizeof(TXSPKTHDR) + sizeof(RTFMODE) + 2;
     1226    if (pPktHdr->cb < cbMin)
     1227        return txsReplyBadMinSize(pPktHdr, cbMin);
     1228
     1229    int rc;
     1230    char *pszPath;
     1231    if (!txsIsStringValid(pPktHdr, "path", (const char *)(pPktHdr + 1) + sizeof(RTFMODE), &pszPath, NULL, &rc))
     1232        return rc;
     1233
     1234    RTFMODE fMode = *(RTFMODE const *)(pPktHdr + 1);
     1235
     1236    rc = RTPathSetMode(pszPath, fMode);
     1237
     1238    rc = txsReplyRC(pPktHdr, rc, "RTPathSetMode(\"%s\", %o)", pszPath, fMode);
     1239    RTStrFree(pszPath);
     1240    return rc;
    11511241}
    11521242
     
    11841274        return rc;
    11851275
    1186     rc = VERR_NOT_IMPLEMENTED; /// @todo RTSymlinkDelete(pszPath);
     1276    rc = RTSymlinkDelete(pszPath, 0);
    11871277
    11881278    rc = txsReplyRC(pPktHdr, rc, "RTSymlinkDelete(\"%s\")", pszPath);
     
    28352925            rc = txsDoList(pPktHdr);
    28362926        else if (txsIsSameOpcode(pPktHdr, "PUT FILE"))
    2837             rc = txsDoPutFile(pPktHdr);
     2927            rc = txsDoPutFile(pPktHdr, false /*fHasMode*/);
     2928        else if (txsIsSameOpcode(pPktHdr, "PUT2FILE"))
     2929            rc = txsDoPutFile(pPktHdr, true /*fHasMode*/);
    28382930        else if (txsIsSameOpcode(pPktHdr, "GET FILE"))
    28392931            rc = txsDoGetFile(pPktHdr);
     
    28412933            rc = txsDoUnpackFile(pPktHdr);
    28422934        /* Misc: */
     2935        //else if (txsIsSameOpcode(pPktHdr, "EXP STR "))
     2936        //    rc = txsDoExpandString(pPktHdr);
    28432937        else
    28442938            rc = txsReplyUnknown(pPktHdr);
     
    31793273#endif
    31803274
     3275    int rc = RTPathGetCurrent(g_szCwd, sizeof(g_szCwd));
     3276    if (RT_FAILURE(rc))
     3277        RTMsgError("RTPathGetCurrent failed: %Rrc\n", rc);
     3278    g_szCwd[sizeof(g_szCwd) - 1] = '\0';
     3279
     3280    if (!RTProcGetExecutablePath(g_szTxsDir, sizeof(g_szTxsDir)))
     3281        RTMsgError("RTProcGetExecutablePath failed!\n");
     3282    g_szTxsDir[sizeof(g_szTxsDir) - 1] = '\0';
     3283    RTPathStripFilename(g_szTxsDir);
     3284    RTPathStripTrailingSlash(g_szTxsDir);
     3285
    31813286    /*
    31823287     * The CD/DVD-ROM location.
     
    31983303     * Temporary directory.
    31993304     */
    3200     int rc = RTPathTemp(g_szDefScratchPath, sizeof(g_szDefScratchPath));
     3305    rc = RTPathTemp(g_szDefScratchPath, sizeof(g_szDefScratchPath));
    32013306    if (RT_SUCCESS(rc))
    32023307#if defined(RT_OS_OS2) || defined(RT_OS_WINDOWS) || defined(RT_OS_DOS)
Note: See TracChangeset for help on using the changeset viewer.

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