Changeset 170


Ignore:
Timestamp:
Oct 20, 2018, 9:58:56 AM (6 years ago)
Author:
Valery V. Sedletski
Message:

vboxsf.ifs: Shared folders enhancements.

Location:
trunk/src/VBox/Additions/os2/VBoxSF
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/src/VBox/Additions/os2/VBoxSF/Makefile.kmk

    r154 r170  
    2020VBoxSF_INCS         := \
    2121        . \
     22        $(PATH_ROOT)/include \
    2223        $(PATH_ROOT)/src/VBox/Additions/common/VBoxGuestLib \
    2324        $(PATH_ROOT)/src/VBox/Additions/common/VBoxGuest \
  • TabularUnified trunk/src/VBox/Additions/os2/VBoxSF/VBoxSF.cpp

    r161 r170  
    66/*
    77 * Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
     8 * Copyright (c) 2015-2018 Valery V. Sedletski <_valerius-no-spam@mail.ru>
    89 *
    910 * Permission is hereby granted, free of charge, to any person
     
    4041#include <iprt/mem.h>
    4142
    42 VBSFCLIENT g_clientHandle = {0};
     43APIRET APIENTRY parseFileName(const char *pszPath, PCDFSI pcdfsi,
     44                              char *pszParsedPath, int *pcbParsedPath, VBGLSFMAP *map);
     45
     46VBGLSFCLIENT g_clientHandle = {0};
    4347
    4448
     
    6872    PVBOXSFVP pvboxsfvp = (PVBOXSFVP)pvpfsd;
    6973
    70     //__asm__ __volatile__ (".byte 0xcc\n\t");
    71 
    7274    if (! pszDev)
    7375    {
     
    7981    {
    8082        case 0: // Attach
    81             dprintf("*pcbParm=%u, pszParm=%s\n", *pcbParm, pszParm);
    8283            if (pszDev[1] != ':')
    8384            {
     
    9192                goto FS32_ATTACHEXIT;
    9293            }
    93             dprintf("g_clientHandle=%lx\n", g_clientHandle);
    9494            sharename = make_shflstring((char *)pszParm);
    95             rc = vboxCallMapFolder(&g_clientHandle, sharename, &pvboxsfvp->map);
     95            rc = VbglR0SfMapFolder(&g_clientHandle, sharename, &pvboxsfvp->map);
    9696            strncpy(pvboxsfvp->szLabel, (char *)pszParm, 12);
    9797            pvboxsfvp->szLabel[11] = '\0';
    98             dprintf("pvboxsfvp->map=%lx\n", pvboxsfvp->map);
    9998            free_shflstring(sharename);
    10099            if (RT_FAILURE(rc))
    101100            {
    102                 dprintf("vboxCallMapFolder rc=%d", rc);
     101                dprintf("VbglR0SfMapFolder rc=%d", rc);
    103102                rc = ERROR_VOLUME_NOT_MOUNTED;
    104103                goto FS32_ATTACHEXIT;
     
    117116
    118117        case 2: // Query
    119             dprintf("pvboxsfvp->szLabel=%s\n", pvboxsfvp->szLabel);
    120             dprintf("pvboxsfvp->map=%lx\n", pvboxsfvp->map);
    121118            len = MIN(strlen(pvboxsfvp->szLabel) + 1, 12);
    122119            if (*pcbParm >= sizeof(pvboxsfvp->szLabel) && pszParm)
     
    156153    APIRET  rc = NO_ERROR;
    157154    int32_t rv = 0;
    158     VBSFMAP map;
     155    VBGLSFMAP map;
    159156    PVPFSI pvpfsi = NULL;
    160157    PVPFSD pvpfsd = NULL;
     
    174171    dprintf("map=%lx\n", map);
    175172
    176     rv = vboxCallFSInfo(&g_clientHandle, &map, 0,
     173    rv = VbglR0SfFsInfo(&g_clientHandle, &map, 0,
    177174        (SHFL_INFO_GET | SHFL_INFO_VOLUME), &bytes, (PSHFLDIRINFO)&volume_info);
    178175
    179176    if (RT_FAILURE(rv))
    180177    {
    181         dprintf("VBOXSF: vboxCallFSInfo failed (%d)\n", rv);
     178        dprintf("VBOXSF: VbglR0SfFsInfo failed (%d)\n", rv);
    182179        return vbox_err_to_os2_err(rv);
    183180    }
     
    315312{
    316313    APIRET hrc = NO_ERROR;
    317     SHFLCREATEPARMS params;
    318     PVPFSI pvpfsi = NULL;
    319     PVPFSD pvpfsd = NULL;
    320     PVBOXSFVP pvboxsfvp;
    321     PSHFLSTRING path;
    322     char *pwsz;
    323     char *pszFullDir;
     314    SHFLCREATEPARMS params = {0};
     315    PSHFLSTRING path = NULL;
     316    char *pszFullName = NULL;
     317    int cbFullName;
     318    VBGLSFMAP map;
     319    char *pwsz = NULL;
    324320    int rc;
    325321
     
    331327            dprintf("chdir to: %s\n", pszDir);
    332328
    333             FSH32_GETVOLPARM(pcdfsi->cdi_hVPB, &pvpfsi, &pvpfsd);
    334 
    335             pvboxsfvp = (PVBOXSFVP)pvpfsd;
    336 
    337             pszFullDir = (char *)RTMemAlloc(CCHMAXPATHCOMP);
    338 
    339             if ( (pszDir[0] == '\\' || pszDir[1] == ':') )
    340             {
    341                 // absolute path
    342                 strcpy(pszFullDir, (char *)pszDir);
    343                 dprintf("1\n");
    344             }
    345             else
    346             {
    347                 // relative path
    348                 strcpy(pszFullDir, pcdfsi->cdi_curdir);
    349 
    350                 if (pszFullDir[strlen(pszFullDir) - 1] != '\\')
    351                     strcat(pszFullDir, "\\");
    352 
    353                 strcat(pszFullDir, (char *)pszDir);
    354                 dprintf("2\n");
    355             }
    356 
    357             pszFullDir += 3;
    358             //if (iCurDirEnd != 0xffff)
    359             //{
    360             //    pszFullDir += iCurDirEnd - 3;
    361             //}
    362 
    363             dprintf("pszFullDir=%s\n", pszFullDir);
    364             pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP);
    365             vboxsfStrToUtf8(pwsz, (char *)pszFullDir);
     329            pszFullName = (char *)RTMemAlloc(CCHMAXPATHCOMP + 1);
     330
     331            if (! pszFullName)
     332            {
     333                hrc = ERROR_NOT_ENOUGH_MEMORY;
     334                goto FS32_CHDIREXIT;
     335            }
     336
     337            cbFullName = CCHMAXPATHCOMP + 1;
     338
     339            hrc = parseFileName((char *)pszDir, pcdfsi, pszFullName, &cbFullName, &map);
     340
     341            if (hrc)
     342            {
     343                dprintf("Filename parse error!\n");
     344                goto FS32_CHDIREXIT;
     345            }
     346
     347            dprintf("pszFullName=%s\n", pszFullName);
     348            pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP + 2);
     349            vboxsfStrToUtf8(pwsz, (char *)pszFullName);
    366350
    367351            path = make_shflstring((char *)pwsz);
    368             rc = vboxCallCreate(&g_clientHandle, &pvboxsfvp->map, path, &params);
    369             free_shflstring(path);
    370             RTMemFree(pwsz);
    371             RTMemFree(pszFullDir);
     352
     353            params.Handle = SHFL_HANDLE_NIL;
     354            params.CreateFlags = SHFL_CF_DIRECTORY | SHFL_CF_ACT_OPEN_IF_EXISTS | SHFL_CF_ACT_FAIL_IF_NEW | SHFL_CF_ACCESS_READ;
     355           
     356            rc = VbglR0SfCreate(&g_clientHandle, &map, path, &params);
    372357
    373358            if (RT_SUCCESS(rc))
     
    379364
    380365                pcdfsd->cwd->handle = params.Handle;
    381                 pcdfsd->cwd->map = pvboxsfvp->map;
     366                pcdfsd->cwd->map = map;
    382367                dprintf("success\n");
    383368            }
     
    391376
    392377        case CD_FREE: /* deallocate working directory */
    393             vboxCallClose(&g_clientHandle, &pcdfsd->cwd->map, pcdfsd->cwd->handle);
     378            VbglR0SfClose(&g_clientHandle, &pcdfsd->cwd->map, pcdfsd->cwd->handle);
    394379            RTMemFree(pcdfsd->cwd);
    395380            hrc = NO_ERROR;
     
    401386
    402387FS32_CHDIREXIT:
     388    if (path)
     389        RTMemFree(path);
     390    if (pwsz)
     391        RTMemFree(pwsz);
     392    if (pszFullName)
     393        RTMemFree(pszFullName);
     394
    403395    dprintf(" => %d\n", hrc);
    404396    return hrc;
     
    410402           PBYTE pEABuf, ULONG flag)
    411403{
    412     SHFLCREATEPARMS params;
     404    SHFLCREATEPARMS params = {0};
    413405    APIRET hrc = NO_ERROR;
    414     PVPFSI pvpfsi;
    415     PVPFSD pvpfsd;
     406    char *pszFullName = NULL;
     407    int cbFullName;
    416408    PVBOXSFVP pvboxsfvp;
    417     PSHFLSTRING path;
    418     char *pwsz;
     409    PSHFLSTRING path = NULL;
     410    char *pwsz = NULL;
     411    VBGLSFMAP map;
    419412    int rc;
    420413
     
    424417    params.Info.cbObject = 0;
    425418    params.CreateFlags = SHFL_CF_DIRECTORY | SHFL_CF_ACT_CREATE_IF_NEW |
    426         SHFL_CF_ACT_FAIL_IF_EXISTS | SHFL_CF_ACCESS_READ;
    427 
    428     FSH32_GETVOLPARM(pcdfsi->cdi_hVPB, &pvpfsi, &pvpfsd);
    429 
    430     pvboxsfvp = (PVBOXSFVP)pvpfsd;
    431 
    432     pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP);
    433     vboxsfStrToUtf8(pwsz, (char *)pszName);
     419        SHFL_CF_ACT_FAIL_IF_EXISTS | SHFL_CF_ACCESS_READWRITE; //SHFL_CF_ACCESS_READ;
     420
     421    pszFullName = (char *)RTMemAlloc(CCHMAXPATHCOMP + 1);
     422
     423    if (! pszFullName)
     424    {
     425        hrc = ERROR_NOT_ENOUGH_MEMORY;
     426        goto FS32_MKDIREXIT;
     427    }
     428
     429    cbFullName = CCHMAXPATHCOMP + 1;
     430
     431    hrc = parseFileName((char *)pszName, pcdfsi, pszFullName, &cbFullName, &map);
     432
     433    if (hrc)
     434    {
     435        dprintf("Filename parse error!\n");
     436        goto FS32_MKDIREXIT;
     437    }
     438
     439    pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP + 2);
     440    vboxsfStrToUtf8(pwsz, (char *)pszFullName);
     441    dprintf("path=%s\n", pwsz);
    434442
    435443    path = make_shflstring((char *)pwsz);
    436     rc = vboxCallCreate(&g_clientHandle, &pvboxsfvp->map, path, &params);
    437     RTMemFree(path);
    438     RTMemFree(pwsz);
     444    rc = VbglR0SfCreate(&g_clientHandle, &map, path, &params);
    439445
    440446    /** @todo r=ramshankar: we should perhaps also check rc here and change
     
    442448    if (params.Handle == SHFL_HANDLE_NIL)
    443449    {
     450        dprintf("fail\n");
    444451        hrc = vbox_err_to_os2_err(rc);
    445452        goto FS32_MKDIREXIT;
    446453    }
    447454
    448     vboxCallClose(&g_clientHandle, &pvboxsfvp->map, params.Handle);
     455    VbglR0SfClose(&g_clientHandle, &map, params.Handle);
    449456    hrc = NO_ERROR;
    450457
    451458FS32_MKDIREXIT:
     459    if (pszFullName)
     460        RTMemFree(pszFullName);
     461    if (path)
     462        RTMemFree(path);
     463    if (pwsz)
     464        RTMemFree(pwsz);
     465
    452466    dprintf(" => %d\n", hrc);
    453467    return hrc;
     
    459473{
    460474    APIRET hrc = NO_ERROR;
    461     PVPFSI pvpfsi;
    462     PVPFSD pvpfsd;
    463     PVBOXSFVP pvboxsfvp;
    464     PSHFLSTRING path;
    465     char *pwsz;
     475    PSHFLSTRING path = NULL;
     476    char *pszFullName = NULL;
     477    int cbFullName;
     478    VBGLSFMAP map;
     479    char *pwsz = NULL;
    466480    int rc;
    467481
    468482    dprintf("VBOXSF: FS32_RMDIR(%s)\n", pszName);
    469483
    470     FSH32_GETVOLPARM(pcdfsi->cdi_hVPB, &pvpfsi, &pvpfsd);
    471 
    472     pvboxsfvp = (PVBOXSFVP)pvpfsd;
    473 
    474     pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP);
    475     vboxsfStrToUtf8(pwsz, (char *)pszName);
     484    pszFullName = (char *)RTMemAlloc(CCHMAXPATHCOMP + 1);
     485
     486    if (! pszFullName)
     487    {
     488        hrc = ERROR_NOT_ENOUGH_MEMORY;
     489        goto FS32_RMDIREXIT;
     490    }
     491
     492    cbFullName = CCHMAXPATHCOMP + 1;
     493
     494    hrc = parseFileName((char *)pszName, pcdfsi, pszFullName, &cbFullName, &map);
     495
     496    if (hrc)
     497    {
     498        dprintf("Filename parse error!\n");
     499        goto FS32_RMDIREXIT;
     500    }
     501
     502    pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP + 2);
     503    vboxsfStrToUtf8(pwsz, (char *)pszFullName);
    476504
    477505    path = make_shflstring((char *)pwsz);
    478     rc = vboxCallRemove(&g_clientHandle, &pvboxsfvp->map, path, SHFL_REMOVE_DIR);
    479     RTMemFree(path);
    480     RTMemFree(pwsz);
     506    rc = VbglR0SfRemove(&g_clientHandle, &map, path, SHFL_REMOVE_DIR);
    481507
    482508    hrc = vbox_err_to_os2_err(rc);
    483509
    484510FS32_RMDIREXIT:
     511    if (pszFullName)
     512        RTMemFree(pszFullName);
     513    if (path)
     514        RTMemFree(path);
     515    if (pwsz)
     516        RTMemFree(pwsz);
     517
    485518    dprintf(" => %d\n", hrc);
    486519    return hrc;
     
    502535{
    503536    APIRET hrc = NO_ERROR;
    504     PVPFSI pvpfsi;
    505     PVPFSD pvpfsd;
    506     PVBOXSFVP pvboxsfvp;
    507     PSHFLSTRING oldpath, newpath;
    508     char *pwszFrom, *pwszTo;
     537    PSHFLSTRING oldpath = NULL, newpath = NULL;
     538    char *pszFullSrc = NULL;
     539    int cbFullSrc;
     540    char *pszFullDst = NULL;
     541    int cbFullDst;
     542    VBGLSFMAP map;
     543    char *pwszSrc = NULL, *pwszDst = NULL;
    509544    int rc;
    510545
    511546    dprintf("VBOXSF: FS32_MOVE(%s, %s, %lx)\n", pszSrc, pszDst, flag);
    512547
    513     FSH32_GETVOLPARM(pcdfsi->cdi_hVPB, &pvpfsi, &pvpfsd);
    514 
    515     pvboxsfvp = (PVBOXSFVP)pvpfsd;
    516 
    517     pwszFrom = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP);
    518     pwszTo = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP);
    519     vboxsfStrToUtf8(pwszFrom, (char *)pszSrc);
    520     vboxsfStrToUtf8(pwszTo, (char *)pszDst);
    521 
    522     oldpath = make_shflstring((char *)pwszFrom);
    523     newpath = make_shflstring((char *)pwszTo);
    524 
    525     rc = vboxCallRename(&g_clientHandle, &pvboxsfvp->map, oldpath, newpath, SHFL_RENAME_FILE | SHFL_RENAME_REPLACE_IF_EXISTS);
    526     RTMemFree(oldpath);
    527     RTMemFree(newpath);
    528     RTMemFree(pwszFrom);
    529     RTMemFree(pwszTo);
     548    pszFullSrc = (char *)RTMemAlloc(CCHMAXPATHCOMP + 1);
     549
     550    if (! pszFullSrc)
     551    {
     552        hrc = ERROR_NOT_ENOUGH_MEMORY;
     553        goto FS32_MOVEEXIT;
     554    }
     555
     556    cbFullSrc = CCHMAXPATHCOMP + 1;
     557
     558    hrc = parseFileName((char *)pszSrc, pcdfsi, pszFullSrc, &cbFullSrc, &map);
     559
     560    if (hrc)
     561    {
     562        dprintf("Filename parse error!\n");
     563        goto FS32_MOVEEXIT;
     564    }
     565
     566    pszFullDst = (char *)RTMemAlloc(CCHMAXPATHCOMP + 1);
     567
     568    if (! pszFullDst)
     569    {
     570        hrc = ERROR_NOT_ENOUGH_MEMORY;
     571        goto FS32_MOVEEXIT;
     572    }
     573
     574    cbFullDst = CCHMAXPATHCOMP + 1;
     575
     576    hrc = parseFileName((char *)pszDst, pcdfsi, pszFullDst, &cbFullDst, &map);
     577
     578    if (hrc)
     579    {
     580        dprintf("Filename parse error!\n");
     581        goto FS32_MOVEEXIT;
     582    }
     583
     584    pwszSrc = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP + 2);
     585    pwszDst = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP + 2);
     586
     587    vboxsfStrToUtf8(pwszSrc, (char *)pszFullSrc);
     588    vboxsfStrToUtf8(pwszDst, (char *)pszFullDst);
     589
     590    oldpath = make_shflstring((char *)pwszSrc);
     591    newpath = make_shflstring((char *)pwszDst);
     592
     593    rc = VbglR0SfRename(&g_clientHandle, &map, oldpath, newpath, SHFL_RENAME_FILE | SHFL_RENAME_REPLACE_IF_EXISTS);
    530594
    531595    hrc = vbox_err_to_os2_err(rc);
    532596
    533597FS32_MOVEEXIT:
     598    if (oldpath)
     599        RTMemFree(oldpath);
     600    if (newpath)
     601        RTMemFree(newpath);
     602    if (pwszSrc)
     603        RTMemFree(pwszSrc);
     604    if (pwszDst)
     605        RTMemFree(pwszDst);
     606    if (pszFullSrc)
     607        RTMemFree(pszFullSrc);
     608    if (pszFullDst)
     609        RTMemFree(pszFullDst);
     610
    534611    dprintf(" => %d\n", hrc);
    535612    return hrc;
     
    541618{
    542619    APIRET hrc = NO_ERROR;
    543     PVPFSI pvpfsi;
    544     PVPFSD pvpfsd;
    545     PVBOXSFVP pvboxsfvp;
    546     PSHFLSTRING path;
    547     char *pwsz;
     620    PSHFLSTRING path = NULL;
     621    char *pwsz = NULL;
     622    char *pszFullName = NULL;
     623    int cbFullName;
     624    VBGLSFMAP map;
    548625    int rc;
    549626
    550627    dprintf("VBOXSF: FS32_DELETE(%s)\n", pszFile);
    551628
    552     FSH32_GETVOLPARM(pcdfsi->cdi_hVPB, &pvpfsi, &pvpfsd);
    553 
    554     pvboxsfvp = (PVBOXSFVP)pvpfsd;
    555 
    556     pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP);
    557     vboxsfStrToUtf8(pwsz, (char *)pszFile);
     629    pszFullName = (char *)RTMemAlloc(CCHMAXPATHCOMP + 1);
     630
     631    if (! pszFullName)
     632    {
     633        hrc = ERROR_NOT_ENOUGH_MEMORY;
     634        goto FS32_DELETEEXIT;
     635    }
     636
     637    cbFullName = CCHMAXPATHCOMP + 1;
     638
     639    hrc = parseFileName((char *)pszFile, pcdfsi, pszFullName, &cbFullName, &map);
     640
     641    if (hrc)
     642    {
     643        dprintf("Filename parse error!\n");
     644        goto FS32_DELETEEXIT;
     645    }
     646
     647    pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP + 2);
     648    vboxsfStrToUtf8(pwsz, (char *)pszFullName);
    558649
    559650    path = make_shflstring((char *)pwsz);
    560     rc = vboxCallRemove(&g_clientHandle, &pvboxsfvp->map, path, SHFL_REMOVE_FILE);
    561     RTMemFree(path);
    562     RTMemFree(pwsz);
     651    rc = VbglR0SfRemove(&g_clientHandle, &map, path, SHFL_REMOVE_FILE);
    563652
    564653    hrc = vbox_err_to_os2_err(rc);
    565654
    566655FS32_DELETEEXIT:
     656    if (pszFullName)
     657        RTMemFree(pszFullName);
     658    if (path)
     659        RTMemFree(path);
     660    if (pwsz)
     661        RTMemFree(pwsz);
     662
    567663    dprintf(" => %d\n", hrc);
    568664    return hrc;
     
    573669FS32_FILEATTRIBUTE(ULONG flag, PCDFSI pcdfsi, PVBOXSFCD pcdfsd, PCSZ pszName, USHORT iCurDirEnd, PUSHORT pAttr)
    574670{
    575     SHFLCREATEPARMS params;
     671    SHFLCREATEPARMS params = {0};
    576672    APIRET hrc = NO_ERROR;
    577     PVPFSI pvpfsi;
    578     PVPFSD pvpfsd;
    579     PVBOXSFVP pvboxsfvp;
    580673    PSHFLDIRINFO file = NULL;
    581674    uint32_t len = sizeof(SHFLDIRINFO);
    582     uint32_t num_files = 0;
    583     uint32_t index = 0;
    584     char *str, *p, *lastslash;
    585     char *pszDirName;
    586     PSHFLSTRING path, path2;
    587     char *pwsz;
     675    PSHFLSTRING path = NULL;
     676    char *pwsz = NULL;
     677    char *pszFullName = NULL;
     678    int cbFullName;
     679    VBGLSFMAP map;
    588680    int rc;
    589681
    590682    dprintf("VBOXSF: FS32_FILEATTRIBUTE(%lx, %s)\n", flag, pszName);
    591683
    592     FSH32_GETVOLPARM(pcdfsi->cdi_hVPB, &pvpfsi, &pvpfsd);
    593 
    594     pvboxsfvp = (PVBOXSFVP)pvpfsd;
    595 
    596684    switch (flag)
    597685    {
    598686        case 0: // retrieve
    599             pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP);
    600             vboxsfStrToUtf8(pwsz, (char *)pszName);
    601 
    602             path = make_shflstring((char *)pwsz);
    603 
    604             str = (char *)RTMemAlloc(strlen((char *)pszName) + 1);
    605 
    606             if (! str)
    607             {
    608                 dprintf("Not enough memory 2\n");
     687            file = (PSHFLDIRINFO)RTMemAlloc(len);
     688
     689            if (! file)
     690            {
     691                dprintf("Not enough memory 1\n");
    609692                hrc = ERROR_NOT_ENOUGH_MEMORY;
    610693                goto FS32_FILEATTRIBUTEEXIT;
    611694            }
    612695
    613             strcpy(str, (char *)pszName);
    614 
    615             lastslash = p = str;
    616 
    617             // get last backslash
    618             do {
    619                 lastslash = p;
    620                 p = strchr(p + 1, '\\');
    621             } while (p && p < str + strlen(str));
    622 
    623             // cut off file part from directory part
    624             str[lastslash - str + 1] = '\0';
    625             pszDirName = str + 1;
    626 
    627             dprintf("pszDirName=%s\n", pszDirName);
    628 
    629             pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP);
    630             vboxsfStrToUtf8(pwsz, (char *)pszDirName);
     696            pszFullName = (char *)RTMemAlloc(CCHMAXPATHCOMP + 1);
     697
     698            if (! pszFullName)
     699            {
     700                hrc = ERROR_NOT_ENOUGH_MEMORY;
     701                goto FS32_FILEATTRIBUTEEXIT;
     702            }
     703
     704            cbFullName = CCHMAXPATHCOMP + 1;
     705
     706            hrc = parseFileName((char *)pszName, pcdfsi, pszFullName, &cbFullName, &map);
     707
     708            if (hrc)
     709            {
     710                dprintf("Filename parse error!\n");
     711                goto FS32_FILEATTRIBUTEEXIT;
     712            }
     713
     714            pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP + 2);
     715            vboxsfStrToUtf8(pwsz, (char *)pszFullName);
    631716
    632717            path = make_shflstring((char *)pwsz);
    633             rc = vboxCallCreate(&g_clientHandle, &pvboxsfvp->map, path, &params);
    634             free_shflstring(path);
    635             RTMemFree(pwsz);
    636             RTMemFree(str);
     718
     719            params.Handle = SHFL_HANDLE_NIL;
     720            params.CreateFlags = SHFL_CF_LOOKUP | SHFL_CF_ACT_FAIL_IF_NEW;
     721
     722            rc = VbglR0SfCreate(&g_clientHandle, &map, path, &params);
    637723
    638724            if (!RT_SUCCESS(rc))
    639725            {
    640                 dprintf("vboxCallCreate returned %d\n", rc);
    641                 free_shflstring(path);
     726                dprintf("VbglR0SfCreate returned %d\n", rc);
    642727                hrc = vbox_err_to_os2_err(rc);
    643728                goto FS32_FILEATTRIBUTEEXIT;
     
    645730
    646731            dprintf("path=%s\n", pszName);
    647             dprintf("pvboxsfvp->map=%x\n", pvboxsfvp->map);
     732            dprintf("map=%x\n", map);
    648733            dprintf("params.Handle=%x\n", params.Handle);
    649734            dprintf("len=%x\n", len);
    650             dprintf("num_files=%x\n", num_files);
    651 
    652             //path = make_shflstring(str);
    653 
    654             rc = vboxCallFSInfo(&g_clientHandle, &pvboxsfvp->map, params.Handle,
     735
     736            rc = VbglR0SfFsInfo(&g_clientHandle, &map, params.Handle,
    655737                                SHFL_INFO_GET | SHFL_INFO_FILE, &len, file);
    656738
     
    659741            if (RT_FAILURE(rc))
    660742            {
    661                 dprintf("vboxCallFSInfo failed: %d\n", rc);
     743                dprintf("VbglR0SfFsInfo failed: %d\n", rc);
    662744                goto FS32_FILEATTRIBUTEEXIT;
    663745            }
    664746
    665             vboxCallClose(&g_clientHandle, &pvboxsfvp->map, params.Handle);
     747            VbglR0SfClose(&g_clientHandle, &map, params.Handle);
    666748
    667749            *pAttr = VBoxToOS2Attr(file->Info.Attr.fMode);
     
    673755
    674756FS32_FILEATTRIBUTEEXIT:
     757    if (file)
     758        RTMemFree(file);
     759    if (path)
     760        RTMemFree(path);
     761    if (pwsz)
     762        RTMemFree(pwsz);
     763    if (pszFullName)
     764        RTMemFree(pszFullName);
     765
    675766    dprintf(" => %d\n", hrc);
    676767    return hrc;
     
    685776    SHFLCREATEPARMS params = {0};
    686777    USHORT usNeededSize;
    687     PVPFSI pvpfsi;
    688     PVPFSD pvpfsd;
    689     PVBOXSFVP pvboxsfvp;
    690778    PSHFLDIRINFO file = NULL;
    691779    uint32_t len = sizeof(SHFLDIRINFO);
    692     uint32_t num_files = 0;
    693     uint32_t index = 0;
    694     char *str, *p, *lastslash;
    695     char *pszDirName;
    696     PSHFLSTRING path, path2;
    697     char *pwsz, pwsz2;
     780    PSHFLSTRING path = NULL;
     781    char *pwsz = NULL;
     782    char *pszFullName = NULL;
     783    int cbFullName;
     784    VBGLSFMAP map;
    698785    int rc;
    699786
    700787    dprintf("VBOXSF: FS32_PATHINFO(%x, %s, %x)\n", flag, pszName, level);
    701788
    702     FSH32_GETVOLPARM(pcdfsi->cdi_hVPB, &pvpfsi, &pvpfsd);
    703 
    704     pvboxsfvp = (PVBOXSFVP)pvpfsd;
    705 
    706     str = (char *)RTMemAlloc(strlen((char *)pszName) + 1);
    707 
    708     if (! str)
    709     {
    710         dprintf("Not enough memory 2\n");
     789    pszFullName = (char *)RTMemAlloc(CCHMAXPATHCOMP + 1);
     790
     791    if (! pszFullName)
     792    {
    711793        hrc = ERROR_NOT_ENOUGH_MEMORY;
    712794        goto FS32_PATHINFOEXIT;
    713795    }
    714796
    715     strcpy(str, (char *)pszName);
    716 
    717     lastslash = p = str;
    718 
    719     // get last backslash
    720     do {
    721         lastslash = p;
    722         p = strchr(p + 1, '\\');
    723     } while (p && p < str + strlen(str));
    724 
    725     // cut off file part from directory part
    726     str[lastslash - str + 1] = '\0';
    727     pszDirName = str + 1;
    728 
    729     dprintf("pszDirName=%s\n", pszDirName);
    730 
    731     pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP);
    732     vboxsfStrToUtf8(pwsz, (char *)pszDirName);
     797    cbFullName = CCHMAXPATHCOMP + 1;
     798
     799    hrc = parseFileName((char *)pszName, pcdfsi, pszFullName, &cbFullName, &map);
     800
     801    if (hrc)
     802    {
     803        dprintf("Filename parse error!\n");
     804        goto FS32_PATHINFOEXIT;
     805    }
     806
     807    pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP + 2);
     808    vboxsfStrToUtf8(pwsz, (char *)pszFullName);
    733809
    734810    path = make_shflstring((char *)pwsz);
    735     rc = vboxCallCreate(&g_clientHandle, &pvboxsfvp->map, path, &params);
    736     RTMemFree(pwsz);
    737     RTMemFree(str);
    738 
    739     if (!RT_SUCCESS(rc))
    740     {
    741         dprintf("vboxCallCreate returned %d\n", rc);
    742         free_shflstring(path);
     811
     812    params.Handle = SHFL_HANDLE_NIL;
     813    params.CreateFlags = SHFL_CF_ACT_FAIL_IF_NEW; // SHFL_CF_LOOKUP
     814
     815    rc = VbglR0SfCreate(&g_clientHandle, &map, path, &params);
     816
     817    if (! RT_SUCCESS(rc))
     818    {
     819        dprintf("VbglR0SfCreate returned %d\n", rc);
    743820        hrc = vbox_err_to_os2_err(rc);
    744821        goto FS32_PATHINFOEXIT;
     
    746823
    747824    dprintf("path=%s\n", pszName);
    748     dprintf("pvboxsfvp->map=%x\n", pvboxsfvp->map);
     825    dprintf("map=%x\n", map);
    749826    dprintf("params.Handle=%x\n", params.Handle);
    750827    dprintf("len=%x\n", len);
    751     dprintf("num_files=%x\n", num_files);
    752 
    753     //path = make_shflstring(str);
    754828
    755829    switch (flag)
     
    803877                dprintf("file=%x\n", file);
    804878
    805                 rc = vboxCallFSInfo(&g_clientHandle, &pvboxsfvp->map, params.Handle,
     879                rc = VbglR0SfFsInfo(&g_clientHandle, &map, params.Handle,
    806880                                    SHFL_INFO_GET | SHFL_INFO_FILE, &len, file);
    807881
     
    810884                if (RT_FAILURE(rc))
    811885                {
    812                     dprintf("vboxCallFSInfo failed: %d\n", rc);
     886                    dprintf("VbglR0SfFsInfo failed: %d\n", rc);
    813887                    goto FS32_PATHINFOEXIT;
    814888                }
     
    9951069                            EAOP filestatus;
    9961070                            KernCopyIn(&filestatus, pData, sizeof(EAOP));
    997                             PFEALIST pFEA = filestatus.fpFEAList;
     1071                            PFEALIST pFEA = (PFEALIST)KernSelToFlat((ULONG)filestatus.fpFEAList);
    9981072                            // @todo: get empty EAs
    9991073                            memset(pFEA, 0, (USHORT)pFEA->cbList);
    10001074                            pFEA->cbList = sizeof(pFEA->cbList);
    1001                             KernCopyOut(pData, &filestatus, sizeof(FILESTATUS4L));
     1075                            KernCopyOut(pData, &filestatus, sizeof(EAOP));
    10021076                            break;
    10031077                        }
    10041078
    1005                     case 4:
     1079                    case 4: // FIL_QUERYALLEAS
    10061080                        {
    10071081                            EAOP filestatus;
    10081082                            KernCopyIn(&filestatus, pData, sizeof(EAOP));
    1009                             PFEALIST pFEA = filestatus.fpFEAList;
     1083                            PFEALIST pFEA = (PFEALIST)KernSelToFlat((ULONG)filestatus.fpFEAList);
    10101084                            memset(pFEA, 0, (USHORT)pFEA->cbList);
    10111085                            pFEA->cbList = sizeof(pFEA->cbList);
    1012                             KernCopyOut(pData, &filestatus, sizeof(FILESTATUS4L));
     1086                            KernCopyOut(pData, &filestatus, sizeof(EAOP));
    10131087                            break;
    10141088                        }
     
    11671241                }
    11681242
    1169                 rc = vboxCallFSInfo(&g_clientHandle, &pvboxsfvp->map, params.Handle,
     1243                rc = VbglR0SfFsInfo(&g_clientHandle, &map, params.Handle,
    11701244                                    SHFL_INFO_SET | SHFL_INFO_FILE, &len, file);
    11711245
    11721246                if (RT_FAILURE(rc))
    11731247                {
    1174                     dprintf("vboxCallFSInfo failed: %d\n", rc);
     1248                    dprintf("VbglR0SfFsInfo failed: %d\n", rc);
    11751249                    hrc = vbox_err_to_os2_err(rc);
    11761250                    goto FS32_PATHINFOEXIT;
     
    11841258
    11851259FS32_PATHINFOEXIT:
     1260    if (pwsz)
     1261        RTMemFree(pwsz);
     1262    if (path)
     1263        RTMemFree(path);
    11861264    if (file)
    11871265        RTMemFree(file);
     1266    if (pszFullName)
     1267        RTMemFree(pszFullName);
    11881268
    11891269    if (params.Handle)
    1190         vboxCallClose(&g_clientHandle, &pvboxsfvp->map, params.Handle);
     1270        VbglR0SfClose(&g_clientHandle, &map, params.Handle);
    11911271
    11921272    dprintf(" => %d\n", hrc);
  • TabularUnified trunk/src/VBox/Additions/os2/VBoxSF/VBoxSFA.asm

    r161 r170  
    66;
    77; Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
     8; Copyright (c) 2015-2018 Valery V. Sedletski <_valerius-no-spam@mail.ru>
    89;
    910; Permission is hereby granted, free of charge, to any person
  • TabularUnified trunk/src/VBox/Additions/os2/VBoxSF/VBoxSFAttach.cpp

    r154 r170  
     1/** $Id: VBoxSF.cpp 161 2018-04-10 00:36:59Z valerius $ */
     2/** @file
     3 * VBoxSF - OS/2 Shared Folders, the FS and FSD level IFS EPs
     4 */
     5
     6/*
     7 * Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
     8 * Copyright (c) 2015-2018 Valery V. Sedletski <_valerius-no-spam@mail.ru>
     9 *
     10 * Permission is hereby granted, free of charge, to any person
     11 * obtaining a copy of this software and associated documentation
     12 * files (the "Software"), to deal in the Software without
     13 * restriction, including without limitation the rights to use,
     14 * copy, modify, merge, publish, distribute, sublicense, and/or sell
     15 * copies of the Software, and to permit persons to whom the
     16 * Software is furnished to do so, subject to the following
     17 * conditions:
     18 *
     19 * The above copyright notice and this permission notice shall be
     20 * included in all copies or substantial portions of the Software.
     21 *
     22 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     23 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
     24 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     25 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
     26 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
     27 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     28 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     29 * OTHER DEALINGS IN THE SOFTWARE.
     30 */
     31
    132#define  OS2EMX_PLAIN_CHAR
    233#define  INCL_DOSFILEMGR
  • TabularUnified trunk/src/VBox/Additions/os2/VBoxSF/VBoxSFFile.cpp

    r161 r170  
    66/*
    77 * Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
     8 * Copyright (c) 2015-2018 Valery V. Sedletski <_valerius-no-spam@mail.ru>
    89 *
    910 * Permission is hereby granted, free of charge, to any person
     
    4041#include <iprt/assert.h>
    4142
    42 extern VBSFCLIENT g_clientHandle;
     43extern VBGLSFCLIENT g_clientHandle;
     44
     45uint32_t VBoxToOS2Attr(uint32_t fMode);
    4346
    4447/**
     
    5053 */
    5154APIRET APIENTRY parseFileName(const char *pszPath, PCDFSI pcdfsi,
    52                               char *pszParsedPath, int *pcbParsedPath, VBSFMAP *map)
     55                              char *pszParsedPath, int *pcbParsedPath, VBGLSFMAP *map)
    5356{
    5457    PVPFSI pvpfsi;
     
    114117                PUSHORT pusAction, USHORT usAttr, PBYTE pcEABuf, PUSHORT pfgenflag)
    115118{
    116     SHFLCREATEPARMS params;
     119    SHFLCREATEPARMS params = {0};
    117120    APIRET hrc = NO_ERROR;
    118121    char *pszFullName;
    119122    int cbFullName;
    120     VBSFMAP map;
     123    VBGLSFMAP map;
    121124    char *pwsz;
    122125    PSHFLSTRING path;
     
    124127    PVPFSD pvpfsd;
    125128    PVBOXSFVP pvboxsfvp;
     129    RTTIME time;
     130    FDATE d;
     131    FTIME t;
    126132    int rc;
    127133
     
    131137    params.Handle = SHFL_HANDLE_NIL;
    132138
    133     pszFullName = (char *)RTMemAlloc(CCHMAXPATHCOMP);
    134     cbFullName = CCHMAXPATHCOMP;
     139    pszFullName = (char *)RTMemAlloc(CCHMAXPATHCOMP + 1);
     140
     141    if (! pszFullName)
     142    {
     143        hrc = ERROR_NOT_ENOUGH_MEMORY;
     144        goto FS32_OPENCREATEEXIT;
     145    }
     146
     147    cbFullName = CCHMAXPATHCOMP + 1;
    135148
    136149    hrc = parseFileName((char *)pszName, pcdfsi, pszFullName, &cbFullName, &map);
     
    199212        params.CreateFlags &= ~SHFL_CF_ACCESS_ATTR_WRITE;
    200213
    201     pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP);
     214    pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP + 2);
    202215    vboxsfStrToUtf8(pwsz, (char *)pszFullName);
    203216
    204217    path = make_shflstring((char *)pwsz);
    205     rc = vboxCallCreate(&g_clientHandle, &map, path, &params);
     218    rc = VbglR0SfCreate(&g_clientHandle, &map, path, &params);
    206219    RTMemFree(pwsz);
    207220    RTMemFree(pszFullName);
     
    209222    if (!RT_SUCCESS(rc))
    210223    {
    211         dprintf("vboxCallCreate returned %d\n", rc);
     224        dprintf("VbglR0SfCreate returned %d\n", rc);
    212225        free_shflstring(path);
    213226        hrc = vbox_err_to_os2_err(rc);
     
    228241    psffsd->filebuf->handle = params.Handle;
    229242    psffsd->filebuf->path = path;
     243
     244    psffsi->sfi_positionl = 0;
     245    psffsi->sfi_position = 0;
     246
     247    psffsi->sfi_sizel = params.Info.cbObject;
     248    psffsi->sfi_size = (LONG)params.Info.cbObject;
     249
     250    /* Creation time   */
     251    RTTimeExplode(&time, &params.Info.BirthTime);
     252
     253    t.hours = time.u8Hour;
     254    t.minutes = time.u8Minute;
     255    t.twosecs = time.u8Second / 2;
     256    d.year = time.i32Year - 1980;
     257    d.month = time.u8Month;
     258    d.day = time.u8MonthDay;
     259    psffsi->sfi_ctime = *(PUSHORT)&t;
     260    psffsi->sfi_cdate = *(PUSHORT)&d;
     261
     262    /* Last access time   */
     263    RTTimeExplode(&time, &params.Info.AccessTime);
     264
     265    t.hours = time.u8Hour;
     266    t.minutes = time.u8Minute;
     267    t.twosecs = time.u8Second / 2;
     268    d.year = time.i32Year - 1980;
     269    d.month = time.u8Month;
     270    d.day = time.u8MonthDay;
     271    psffsi->sfi_atime = *(PUSHORT)&t;
     272    psffsi->sfi_adate = *(PUSHORT)&d;
     273
     274    /* Last write time   */
     275    RTTimeExplode(&time, &params.Info.ModificationTime);
     276
     277    t.hours = time.u8Hour;
     278    t.minutes = time.u8Minute;
     279    t.twosecs = time.u8Second / 2;
     280    d.year = time.i32Year - 1980;
     281    d.month = time.u8Month;
     282    d.day = time.u8MonthDay;
     283    psffsi->sfi_mtime = *(PUSHORT)&t;
     284    psffsi->sfi_mdate = *(PUSHORT)&d;
     285
     286    // @todo omit ST_SCREAT | ST_PCREAT if not creating the file
     287    psffsi->sfi_tstamp = ST_SCREAT | ST_PCREAT | ST_SREAD | ST_PREAD | ST_SWRITE | ST_PWRITE;
     288
     289    psffsi->sfi_DOSattr = VBoxToOS2Attr(params.Info.Attr.fMode);
    230290
    231291FS32_OPENCREATEEXIT:
     
    257317    pvboxsfvp = (PVBOXSFVP)pvpfsd;
    258318
    259     rc = vboxCallClose(&g_clientHandle, &pvboxsfvp->map, filebuf->handle);
     319    rc = VbglR0SfClose(&g_clientHandle, &pvboxsfvp->map, filebuf->handle);
    260320    hrc = vbox_err_to_os2_err(rc);
    261321    free_shflstring(filebuf->path);
     
    329389{
    330390    APIRET hrc = NO_ERROR;
    331     SHFLCREATEPARMS params;
     391    SHFLCREATEPARMS params = {0};
    332392    USHORT usNeededSize;
    333     PSHFLSTRING path;
    334393    PVPFSI pvpfsi;
    335394    PVPFSD pvpfsd;
     
    337396    PSHFLDIRINFO file = NULL;
    338397    uint32_t len = sizeof(SHFLDIRINFO);
    339     uint32_t num_files = 0;
    340     uint32_t index = 0;
    341     char *str, *p, *lastslash;
    342     char *pszDirName;
    343     char *pwsz;
    344398    int rc;
    345399
     
    398452                }
    399453
    400                 dprintf("file=%x\n", file);
    401 
    402                 str = (char *)RTMemAlloc(psffsd->filebuf->path->u16Length);
    403 
    404                 if (! str)
     454                dprintf("pvboxsfvp->map=%x\n", pvboxsfvp->map);
     455                dprintf("psffsd->filebuf->handle=%x\n", psffsd->filebuf->handle);
     456
     457                rc = VbglR0SfFsInfo(&g_clientHandle, &pvboxsfvp->map, psffsd->filebuf->handle,
     458                                    SHFL_INFO_GET | SHFL_INFO_FILE, &len, file);
     459
     460                hrc = vbox_err_to_os2_err(rc);
     461
     462                if (RT_FAILURE(rc))
    405463                {
    406                     dprintf("Not enough memory 2\n");
    407                     hrc = ERROR_NOT_ENOUGH_MEMORY;
     464                    dprintf("VbglR0SfFsInfo failed: %d\n", rc);
    408465                    goto FS32_FILEINFOEXIT;
    409466                }
    410 
    411                 strcpy(str, "\\");
    412                 strcat(str, (char *)psffsd->filebuf->path->String.utf8);
    413 
    414                 lastslash = p = str;
    415 
    416                 // get last backslash
    417                 do {
    418                     lastslash = p;
    419                     p = strchr(p + 1, '\\');
    420                 } while (p && p < str + strlen(str));
    421 
    422                 // cut off file part from directory part
    423                 str[lastslash - str + 1] = '\0';
    424                 pszDirName = str + 1;
    425 
    426                 dprintf("pszDirName=%s\n", pszDirName);
    427 
    428                 pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP);
    429                 vboxsfStrToUtf8(pwsz, (char *)pszDirName);
    430 
    431                 path = make_shflstring((char *)pwsz);
    432                 rc = vboxCallCreate(&g_clientHandle, &pvboxsfvp->map, path, &params);
    433                 RTMemFree(pwsz);
    434                 RTMemFree(str);
    435 
    436                 if (!RT_SUCCESS(rc))
    437                 {
    438                     dprintf("vboxCallCreate returned %d\n", rc);
    439                     free_shflstring(path);
    440                     hrc = vbox_err_to_os2_err(rc);
    441                     goto FS32_FILEINFOEXIT;
    442                 }
    443 
    444                 dprintf("path=%s\n", psffsd->filebuf->path->String.utf8);
    445                 dprintf("pvboxsfvp->map=%x\n", pvboxsfvp->map);
    446                 dprintf("params.Handle=%x\n", params.Handle);
    447                 dprintf("len=%x\n", len);
    448                 dprintf("num_files=%x\n", num_files);
    449 
    450                 rc = vboxCallFSInfo(&g_clientHandle, &pvboxsfvp->map, params.Handle,
    451                                     SHFL_INFO_GET | SHFL_INFO_FILE, &len, file);
    452 
    453                 hrc = vbox_err_to_os2_err(rc);
    454 
    455                 if (RT_FAILURE(rc))
    456                 {
    457                     dprintf("vboxCallFSInfo failed: %d\n", rc);
    458                     goto FS32_FILEINFOEXIT;
    459                 }
    460 
    461                 vboxCallClose(&g_clientHandle, &pvboxsfvp->map, params.Handle);
    462467
    463468                if (level == FIL_STANDARD    || level == FIL_STANDARDL ||
     
    681686                            EAOP filestatus;
    682687                            KernCopyIn(&filestatus, pData, sizeof(EAOP));
    683                             PFEALIST pFEA = filestatus.fpFEAList;
     688                            PFEALIST pFEA = (PFEALIST)KernSelToFlat((ULONG)filestatus.fpFEAList);
    684689                            // @todo: get empty EAs
    685690                            memset(pFEA, 0, (USHORT)pFEA->cbList);
    686691                            pFEA->cbList = sizeof(pFEA->cbList);
    687                             KernCopyOut(pData, &filestatus, sizeof(FILESTATUS4L));
     692                            KernCopyOut(pData, &filestatus, sizeof(EAOP));
    688693                            break;
    689694                        }
    690695
    691                     case 4:
     696                    case 4: // FIL_QUERYALLEAS
    692697                        {
    693698                            EAOP filestatus;
    694699                            KernCopyIn(&filestatus, pData, sizeof(EAOP));
    695                             PFEALIST pFEA = filestatus.fpFEAList;
     700                            PFEALIST pFEA = (PFEALIST)KernSelToFlat((ULONG)filestatus.fpFEAList);
    696701                            memset(pFEA, 0, (USHORT)pFEA->cbList);
    697702                            pFEA->cbList = sizeof(pFEA->cbList);
    698                             KernCopyOut(pData, &filestatus, sizeof(FILESTATUS4L));
     703                            KernCopyOut(pData, &filestatus, sizeof(EAOP));
    699704                            break;
    700705                        }
     
    922927                }
    923928
    924                 rc = vboxCallFSInfo(&g_clientHandle, &pvboxsfvp->map, psffsd->filebuf->handle,
     929                rc = VbglR0SfFsInfo(&g_clientHandle, &pvboxsfvp->map, psffsd->filebuf->handle,
    925930                                    SHFL_INFO_SET | SHFL_INFO_FILE, &len, file);
    926931
    927932                if (RT_FAILURE(rc))
    928933                {
    929                     dprintf("vboxCallFSInfo failed: %d\n", rc);
     934                    dprintf("VbglR0SfFsInfo failed: %d\n", rc);
    930935                    hrc = vbox_err_to_os2_err(rc);
    931936                    goto FS32_FILEINFOEXIT;
     
    939944
    940945FS32_FILEINFOEXIT:
    941     dprintf("file=%x\n", file);
    942     //__asm__ __volatile__ (".byte 0xcc\n\t");
    943946    if (file)
    944947        RTMemFree(file);
     948
    945949    dprintf(" => %d\n", hrc);
    946950    return hrc;
    947951}
    948952
     953int chsize(PVBOXSFVP pvboxsfvp, PVBOXSFFSD psffsd, ULONG size)
     954{
     955    PSHFLFSOBJINFO pObjInfo = NULL;
     956    uint32_t cbBuf = sizeof(SHFLFSOBJINFO);
     957    int rc;
     958
     959    pObjInfo = (PSHFLFSOBJINFO)RTMemAlloc(cbBuf);
     960
     961    if (! pObjInfo)
     962    {
     963        return VERR_NO_MEMORY;
     964    }
     965
     966    memset(pObjInfo, 0, cbBuf);
     967    pObjInfo->cbObject = size;
     968
     969    rc = VbglR0SfFsInfo(&g_clientHandle, &pvboxsfvp->map, psffsd->filebuf->handle,
     970                        SHFL_INFO_SET | SHFL_INFO_SIZE, &cbBuf, (PSHFLDIRINFO)pObjInfo);
     971
     972    if (pObjInfo)
     973        RTMemFree(pObjInfo);
     974
     975    return rc;
     976}
    949977
    950978DECLASM(int)
     
    955983    PVPFSD pvpfsd;
    956984    PVBOXSFVP pvboxsfvp;
    957     PSHFLFSOBJINFO pObjInfo = NULL;
    958985    PSHFLSTRING path;
    959     uint32_t cbBuf = sizeof(SHFLFSOBJINFO);
    960986    int rc;
    961987
     
    966992    pvboxsfvp = (PVBOXSFVP)pvpfsd;
    967993
    968     pObjInfo = (PSHFLFSOBJINFO)RTMemAlloc(cbBuf);
    969     if (!pObjInfo)
    970     {
    971         hrc = ERROR_NOT_ENOUGH_MEMORY;
    972         goto FS32_NEWSIZELEXIT;
    973     }
    974 
    975     memset(pObjInfo, 0, cbBuf);
    976     pObjInfo->cbObject = cbFile;
    977 
    978     rc = vboxCallFSInfo(&g_clientHandle, &pvboxsfvp->map, psffsd->filebuf->handle,
    979                         SHFL_INFO_SET | SHFL_INFO_SIZE, &cbBuf, (PSHFLDIRINFO)pObjInfo);
     994    rc = chsize(pvboxsfvp, psffsd, cbFile);
    980995
    981996    hrc = vbox_err_to_os2_err(rc);
     
    983998FS32_NEWSIZELEXIT:
    984999    dprintf(" => %d\n", hrc);
    985 
    986     if (pObjInfo)
    987         RTMemFree(pObjInfo);
    9881000
    9891001    return hrc;
     
    9991011    PVBOXSFVP pvboxsfvp;
    10001012    uint8_t *pBuf;
     1013    ULONG cb = *pcb;
    10011014    int rc;
    10021015
     
    10091022    pBuf = (uint8_t *)RTMemAlloc(*pcb);
    10101023
    1011     rc = vboxCallRead(&g_clientHandle, &pvboxsfvp->map, psffsd->filebuf->handle,
     1024    if (psffsi->sfi_positionl > psffsi->sfi_sizel)
     1025    {
     1026        *pcb = 0;
     1027    }
     1028    else if (*pcb > psffsi->sfi_sizel - psffsi->sfi_positionl)
     1029    {
     1030        *pcb = psffsi->sfi_sizel - psffsi->sfi_positionl;
     1031    }
     1032
     1033    memset(pBuf, 0, cb);
     1034
     1035    rc = VbglR0SfRead(&g_clientHandle, &pvboxsfvp->map, psffsd->filebuf->handle,
    10121036                      psffsi->sfi_positionl, (uint32_t *)pcb, pBuf, false);
    10131037
     
    10191043    }
    10201044
     1045    psffsi->sfi_tstamp |= (ST_SREAD | ST_PREAD);
     1046
    10211047    hrc = vbox_err_to_os2_err(rc);
    1022     RTMemFree(pBuf);
    10231048
    10241049FS32_READEXIT:
     1050    if (pBuf)
     1051        RTMemFree(pBuf);
     1052
    10251053    dprintf(" => %d\n", hrc);
    10261054    return hrc;
     
    10351063    PVPFSD pvpfsd;
    10361064    PVBOXSFVP pvboxsfvp;
     1065    uint32_t cbNewPos;
    10371066    uint8_t *pBuf;
    10381067    int rc;
     
    10451074
    10461075    pBuf = (uint8_t *)RTMemAlloc(*pcb);
     1076
     1077    if (! pBuf)
     1078    {
     1079        hrc = ERROR_NOT_ENOUGH_MEMORY;
     1080        goto FS32_WRITEEXIT;
     1081    }
     1082
    10471083    KernCopyIn(pBuf, (char *)pvData, *pcb);
    10481084
    1049     rc = vboxCallWrite(&g_clientHandle, &pvboxsfvp->map, psffsd->filebuf->handle,
     1085    cbNewPos = psffsi->sfi_positionl + *pcb;
     1086
     1087    if (cbNewPos > psffsi->sfi_sizel)
     1088    {
     1089        rc = chsize(pvboxsfvp, psffsd, cbNewPos);
     1090
     1091        if (rc)
     1092        {
     1093            hrc = vbox_err_to_os2_err(rc);
     1094            goto FS32_WRITEEXIT;
     1095        }
     1096
     1097        psffsi->sfi_sizel = cbNewPos;
     1098        psffsi->sfi_size  = cbNewPos;
     1099    }
     1100
     1101    rc = VbglR0SfWrite(&g_clientHandle, &pvboxsfvp->map, psffsd->filebuf->handle,
    10501102                       psffsi->sfi_positionl, (uint32_t *)pcb, pBuf, false);
    10511103
     
    10541106        psffsi->sfi_positionl += *pcb;
    10551107        psffsi->sfi_position  += *pcb;
     1108        psffsi->sfi_tstamp |= (ST_SWRITE | ST_PWRITE);
    10561109    }
    10571110
    10581111    hrc = vbox_err_to_os2_err(rc);
    1059     RTMemFree(pBuf);
    10601112
    10611113FS32_WRITEEXIT:
     1114    if (pBuf)
     1115        RTMemFree(pBuf);
     1116
    10621117    dprintf(" => %d\n", hrc);
    10631118    return hrc;
  • TabularUnified trunk/src/VBox/Additions/os2/VBoxSF/VBoxSFFind.cpp

    r161 r170  
    66/*
    77 * Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
     8 * Copyright (c) 2015-2018 Valery V. Sedletski <_valerius-no-spam@mail.ru>
    89 *
    910 * Permission is hereby granted, free of charge, to any person
     
    4041#include <iprt/assert.h>
    4142
    42 extern VBSFCLIENT g_clientHandle;
     43extern VBGLSFCLIENT g_clientHandle;
    4344
    4445
     
    9596    *pcMatch = 0;
    9697
    97     dprintf("usEntriesWanted=%u\n", usEntriesWanted);
    98 
    9998    switch (level)
    10099    {
     
    159158        }
    160159
    161         rc = vboxCallDirInfo(&g_clientHandle, &pFindBuf->map, pFindBuf->handle, pFindBuf->path, 0, pFindBuf->index,
     160        rc = VbglR0SfDirInfo(&g_clientHandle, &pFindBuf->map, pFindBuf->handle, pFindBuf->path, 0, pFindBuf->index,
    162161                             &pFindBuf->len, pFindBuf->buf, &pFindBuf->num_files);
    163162
    164163        if (rc != 0 && rc != VERR_NO_MORE_FILES)
    165164        {
    166             dprintf("vboxCallDirInfo failed: %d\n", rc);
     165            dprintf("VbglR0SfDirInfo failed: %d\n", rc);
    167166            RTMemFree(pFindBuf->buf);
    168167            hrc = vbox_err_to_os2_err(rc);
     
    177176            goto FILLFINDBUFEXIT;
    178177        }
    179 
    180         dprintf("num_files=%lu\n", pFindBuf->num_files);
    181178    }
    182179
     
    226223                    char *pszFileName = (char *)file->name.String.utf8;
    227224                    RTTIME time;
    228                     dprintf("FIL_STANDARD\n");
    229225                    memset(&findbuf, 0, sizeof(findbuf));
    230226                    /* File name */
     
    232228                        CCHMAXPATHCOMP, file->name.u16Length);
    233229                    findbuf.cchName = strlen(findbuf.achName);
    234                     dprintf("findbuf.achName=%s\n", findbuf.achName);
    235                     dprintf("findbuf.cchName=%u\n", findbuf.cchName);
    236230                    /* File attributes */
    237231                    findbuf.attrFile = VBoxToOS2Attr(file->Info.Attr.fMode);
     
    283277                    char *pszFileName = (char *)file->name.String.utf8;
    284278                    RTTIME time;
    285                     dprintf("FIL_STANDARDL\n");
    286279                    memset(&findbuf, 0, sizeof(findbuf));
    287280                    /* File name */
     
    289282                        CCHMAXPATHCOMP, file->name.u16Length);
    290283                    findbuf.cchName = strlen(findbuf.achName);
    291                     dprintf("findbuf.achName=%s\n", findbuf.achName);
    292                     dprintf("findbuf.cchName=%u\n", findbuf.cchName);
    293284                    /* File attributes */
    294285                    findbuf.attrFile = VBoxToOS2Attr(file->Info.Attr.fMode);
     
    340331                    char *pszFileName = (char *)file->name.String.utf8;
    341332                    RTTIME time;
    342                     dprintf("FIL_QUERYEASIZE\n");
    343333                    memset(&findbuf, 0, sizeof(findbuf));
    344334                    /* File name */
     
    346336                        CCHMAXPATHCOMP, file->name.u16Length);
    347337                    findbuf.cchName = strlen(findbuf.achName);
    348                     dprintf("findbuf.achName=%s\n", findbuf.achName);
    349                     dprintf("findbuf.cchName=%u\n", findbuf.cchName);
    350338                    /* File attributes */
    351339                    findbuf.attrFile = VBoxToOS2Attr(file->Info.Attr.fMode);
     
    390378                    findbuf.cbList = file->Info.Attr.u.EASize.cb;
    391379                    KernCopyOut(pbData, &findbuf, cbSize);
    392                     dprintf("cbList=%lu\n", findbuf.cbList);
    393380                    break;
    394381                }
     
    398385                    FILEFNDBUF4L findbuf;
    399386                    RTTIME time;
    400                     dprintf("FIL_QUERYEASIZEL\n");
    401387                    char *pszFileName = (char *)file->name.String.utf8;
    402388                    memset(&findbuf, 0, sizeof(findbuf));
     
    405391                        CCHMAXPATHCOMP, file->name.u16Length);
    406392                    findbuf.cchName = strlen(findbuf.achName);
    407                     dprintf("findbuf.achName=%s\n", findbuf.achName);
    408                     dprintf("findbuf.cchName=%u\n", findbuf.cchName);
    409393                    /* File attributes */
    410394                    findbuf.attrFile = VBoxToOS2Attr(file->Info.Attr.fMode);
     
    449433                    findbuf.cbList = file->Info.Attr.u.EASize.cb;
    450434                    KernCopyOut(pbData, &findbuf, cbSize);
    451                     dprintf("cbList=%lu\n", findbuf.cbList);
    452435                    break;
    453436                }
     
    456439                {
    457440                    FILEFNDBUF3 findbuf;
    458                     dprintf("FIL_QUERYEASFROMLIST\n");
    459441                    char *pszFileName = (char *)file->name.String.utf8;
    460442                    RTTIME time;
     
    464446                        CCHMAXPATHCOMP, file->name.u16Length);
    465447                    findbuf.cchName = strlen(findbuf.achName);
    466                     dprintf("findbuf.achName=%s\n", findbuf.achName);
    467                     dprintf("findbuf.cchName=%u\n", findbuf.cchName);
    468448                    /* File attributes */
    469449                    findbuf.attrFile = VBoxToOS2Attr(file->Info.Attr.fMode);
     
    513493                {
    514494                    FILEFNDBUF3L findbuf;
    515                     dprintf("FIL_QUERYEASFROMLISTL\n");
    516495                    char *pszFileName = (char *)file->name.String.utf8;
    517496                    RTTIME time;
     
    521500                        CCHMAXPATHCOMP, file->name.u16Length);
    522501                    findbuf.cchName = strlen(findbuf.achName);
    523                     dprintf("findbuf.achName=%s\n", findbuf.achName);
    524                     dprintf("findbuf.cchName=%u\n", findbuf.cchName);
    525502                    /* File attributes */
    526503                    findbuf.attrFile = VBoxToOS2Attr(file->Info.Attr.fMode);
     
    574551
    575552        (*pcMatch)++;
    576         dprintf("*pcMatch=%u\n", *pcMatch);
    577553
    578554        pbData += cbSize;
     
    594570               USHORT level, USHORT flags)
    595571{
    596     SHFLCREATEPARMS params;
     572    SHFLCREATEPARMS params = {0};
    597573    PFINDBUF pFindBuf;
    598574    PSHFLSTRING path;
     
    663639    dprintf("str=%s\n", str);
    664640
    665     pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP);
     641    pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP + 2);
    666642    vboxsfStrToUtf8(pwsz, str);
    667643
    668644    path = make_shflstring(pwsz);
    669     rc = vboxCallCreate(&g_clientHandle, &pvboxsfvp->map, path, &params);
     645    rc = VbglR0SfCreate(&g_clientHandle, &pvboxsfvp->map, path, &params);
    670646    free_shflstring(path);
    671647    RTMemFree(pwsz);
     
    693669            dprintf("wildcard: %s\n", str);
    694670
    695             pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP);
     671            pwsz = (char *)RTMemAlloc(2 * CCHMAXPATHCOMP + 2);
    696672            vboxsfStrToUtf8(pwsz, str);
    697673
     
    708684    else
    709685    {
    710         dprintf("VBOXSF: vboxCallCreate: %d\n", rc);
     686        dprintf("VBOXSF: VbglR0SfCreate: %d\n", rc);
    711687        hrc = vbox_err_to_os2_err(rc);
    712688        goto FS32_FINDFIRSTEXIT;
     
    750726    dprintf("FS32_FINDCLOSE\n");
    751727
    752     vboxCallClose(&g_clientHandle, &pFindBuf->map, pFindBuf->handle);
     728    VbglR0SfClose(&g_clientHandle, &pFindBuf->map, pFindBuf->handle);
    753729    free_shflstring(pFindBuf->path);
    754730    RTMemFree(pFindBuf);
  • TabularUnified trunk/src/VBox/Additions/os2/VBoxSF/VBoxSFInit.cpp

    r154 r170  
    66/*
    77 * Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
     8 * Copyright (c) 2015-2018 Valery V. Sedletski <_valerius-no-spam@mail.ru>
    89 *
    910 * Permission is hereby granted, free of charge, to any person
     
    5253/* from sys0.asm and the linker/end.lib. */
    5354extern char _text, _etext, _data, _end;
    54 extern VBSFCLIENT g_clientHandle;
     55extern VBGLSFCLIENT g_clientHandle;
    5556RT_C_DECLS_END
    5657
     
    6566 * The caller will do the necessary AttachDD and calling of the 16 bit
    6667 * IDC to initialize the g_VBoxGuestIDC global. Perhaps we should move
    67  * this bit to VbglInit? It's just that it's so much simpler to do it
     68 * this bit to VbglInitClient? It's just that it's so much simpler to do it
    6869 * while we're on the way here...
    6970 *
    7071 */
    71 DECLASM(void)
    72 VBoxSFR0Init(void)
     72DECLASM(void) VBoxSFR0Init(void)
    7373{
    7474    APIRET rc;
     
    8484        &&  VALID_PTR(g_VBoxGuestIDC.pfnServiceEP))
    8585    {
     86#if 0 // ???
     87        int rc = RTR0Init(0);
     88        if (RT_SUCCESS(rc))
     89        {
     90            rc = VbglInitClient();
     91            if (RT_SUCCESS(rc))
     92            {
     93#endif // ???
    8694#ifndef DONT_LOCK_SEGMENTS
    8795        /*
     
    99107#endif
    100108        /* Initialize VBox subsystem. */
    101         rc = vboxInit();
     109        rc = VbglR0SfInit();
    102110        if (RT_FAILURE(rc))
    103111        {
     
    107115        /* Connect the HGCM client */
    108116        RT_ZERO(g_clientHandle);
    109         rc = vboxConnect(&g_clientHandle);
     117        rc = VbglR0SfConnect(&g_clientHandle);
    110118        if (RT_FAILURE(rc))
    111119        {
    112120            dprintf("VBOXSF: %s: ERROR while connecting to host (%Rrc)!\n", __FUNCTION__, rc);
    113             vboxUninit();
     121            VbglR0SfTerm();
    114122        }
    115123
    116         rc = vboxCallSetUtf8(&g_clientHandle);
     124        rc = VbglR0SfSetUtf8(&g_clientHandle);
    117125        if (RT_FAILURE(rc))
    118126        {
    119             dprintf("VBOXSF: vboxCallSetUtf8 failed. rc=%d\n", rc);
     127            dprintf("VBOXSF: VbglR0SfSetUtf8 failed. rc=%d\n", rc);
    120128        }
    121129
  • TabularUnified trunk/src/VBox/Additions/os2/VBoxSF/VBoxSFInternal.h

    r161 r170  
    66/*
    77 * Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
     8 * Copyright (c) 2015-2018 Valery V. Sedletski <_valerius-no-spam@mail.ru>
    89 *
    910 * Permission is hereby granted, free of charge, to any person
     
    4243#undef RT_MAX
    4344
    44 #include <VBoxGuestR0LibSharedFolders.h>
     45#include <VBox/VBoxGuestLibSharedFolders.h>
    4546
    4647#include <iprt/types.h>
     
    128129{
    129130    SHFLHANDLE handle;
    130     VBSFMAP map;
     131    VBGLSFMAP map;
    131132} CWD, *PCWD;
    132133
     
    145146{
    146147    uint32_t u32Dummy;
    147     VBSFMAP  map;
     148    VBGLSFMAP  map;
    148149    char szLabel[12];
    149150} VBOXSFVP;
     
    195196    uint32_t bAttr;
    196197    uint32_t bMustAttr;
    197     VBSFMAP  map;
     198    VBGLSFMAP  map;
    198199} FINDBUF, *PFINDBUF;
    199200
     
    222223APIRET APIENTRY vboxsfStrToUtf8(char *dst, char *src);
    223224APIRET APIENTRY parseFileName(const char *pszPath, PCDFSI pcdfsi,
    224                               char *pszParsedPath, int *cbParsedPath, VBSFMAP *map);
     225                              char *pszParsedPath, int *cbParsedPath, VBGLSFMAP *map);
    225226
    226227RT_C_DECLS_BEGIN
     
    242243
    243244#endif
    244 
  • TabularUnified trunk/src/VBox/Additions/os2/VBoxSF/VBoxSFStr.cpp

    r154 r170  
    66/*
    77 * Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
     8 * Copyright (c) 2015-2018 Valery V. Sedletski <_valerius-no-spam@mail.ru>
    89 *
    910 * Permission is hereby granted, free of charge, to any person
Note: See TracChangeset for help on using the changeset viewer.