Ignore:
Timestamp:
Sep 27, 2013, 1:55:10 PM (12 years ago)
Author:
Silvan Scherrer
Message:

Samba Client 2.1: timestamp work and some backport from 2.2 client

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/client-2.1/src/ndpsmb.c

    r816 r817  
    104104        {ND_PROP_STRING, 0, "USER", "guest"},
    105105        {ND_PROP_STRING, 0, "PASSWORD", ""},
    106                 {ND_PROP_STRING, 0, "SPASSWORD",  ""},
     106        {ND_PROP_STRING, 0, "SPASSWORD",  ""},
    107107        {ND_PROP_STRING, 0, "MASTER", "WORKGROUP"},
    108108        {ND_PROP_ULONG, 0, "MASTERTYPE", "1"},
    109                 {ND_PROP_ULONG, 0, "CTO", "10"},
    110                 {ND_PROP_ULONG, 0, "CLD", "32"},
     109        {ND_PROP_ULONG, 0, "CTO", "10"},
     110        {ND_PROP_ULONG, 0, "CLD", "32"},
    111111        {ND_PROP_ULONG, 0, "EASUPPORT", "1"},
    112112        {ND_PROP_STRING, 0, NULL, NULL}
     
    126126/* A mutex to serialize plugin calls because libsmb may not be thread safe. */
    127127static NDMUTEX mutex;
    128                
     128
    129129static int lockInit (void)
    130130{
    131131        return ph->fsphCreateMutex (&mutex);
    132132}
    133                
     133
    134134static void lockClose (void)
    135135{
    136136        ph->fsphCloseMutex (mutex);
    137137}
    138                
     138
    139139static int lockRequest (void)
    140140{
     
    150150
    151151#define ENTER() do {                    \
    152         int rcLock = lockRequest(); \
    153         if (rcLock != NO_ERROR)  \
    154                 return rcLock;            \
     152        int rcLock = lockRequest();     \
     153        if (rcLock != NO_ERROR)         \
     154                return rcLock;          \
    155155} while (0)
    156156
    157 #define LEAVE() do { \
     157#define LEAVE() do {    \
    158158        lockRelease();  \
    159159} while (0)
     
    181181                ifL = 1;
    182182        }
    183                 lockInit();
    184                 debugInit();
     183        lockInit();
     184        debugInit();
    185185        debuglocal(9,"Working with %s bit fileio NDFS\n", ifL ? "64" : "32");
    186186        return NO_ERROR;
     
    190190int APIENTRY NdpPluginFree (void)
    191191{
    192                 debugDelete();
    193                 lockClose();
     192        debugDelete();
     193        lockClose();
    194194        return NO_ERROR;
    195195}
     
    218218        stat->attrFile = (finfo->attr & 0x37);
    219219
    220                 fsphUnixTimeToDosDate(finfo->mtime, &stat->fdateLastWrite, &stat->ftimeLastWrite);
    221                 fsphUnixTimeToDosDate(finfo->ctime, &stat->fdateCreation, &stat->ftimeCreation);
    222                 fsphUnixTimeToDosDate(finfo->atime, &stat->fdateLastAccess, &stat->ftimeLastAccess);
     220        fsphUnixTimeToDosDate(finfo->mtime, &stat->fdateLastWrite, &stat->ftimeLastWrite);
     221        fsphUnixTimeToDosDate(finfo->ctime, &stat->fdateCreation, &stat->ftimeCreation);
     222        fsphUnixTimeToDosDate(finfo->atime, &stat->fdateLastAccess, &stat->ftimeLastAccess);
    223223}
    224224
     
    248248        stat.attrFile = (finfo->attr & 0x37);
    249249
    250                 fsphUnixTimeToDosDate(finfo->mtime, &stat.fdateLastWrite, &stat.ftimeLastWrite);
    251                 fsphUnixTimeToDosDate(finfo->ctime, &stat.fdateCreation, &stat.ftimeCreation);
    252                 fsphUnixTimeToDosDate(finfo->atime, &stat.fdateLastAccess, &stat.ftimeLastAccess);
     250        fsphUnixTimeToDosDate(finfo->mtime, &stat.fdateLastWrite, &stat.ftimeLastWrite);
     251        fsphUnixTimeToDosDate(finfo->ctime, &stat.fdateCreation, &stat.ftimeCreation);
     252        fsphUnixTimeToDosDate(finfo->atime, &stat.fdateLastAccess, &stat.ftimeLastAccess);
    253253        debug_printf( "fname %s\n", finfo->fname);
    254254        debug_printf( "mtime %d %s", finfo->mtime, ctime( (time_t*)&finfo->mtime));
     
    263263        if ('0' <= c && c <= '9')
    264264        {
    265                  return c - '0';
    266         }
    267        
     265                return c - '0';
     266        }
     267
    268268        if ('A' <= c && c <= 'F')
    269269        {
    270                  return c - 'A' + 0xA;
    271         }
    272        
     270                return c - 'A' + 0xA;
     271        }
     272
    273273        if ('a' <= c && c <= 'f')
    274274        {
    275                  return c - 'a' + 0xA;
    276         }
    277        
     275                return c - 'a' + 0xA;
     276        }
     277
    278278        return 0;
    279279}
     
    282282{
    283283        b &= 0xF;
    284        
     284
    285285        if (b <= 9)
    286286        {
    287287                return b + '0';
    288288        }
    289        
     289
    290290        return 'A' + (b - 0xA);
    291291}
     
    296296        const char *s = pszCrypt;
    297297        char *d = pszPlain;
    298        
     298
    299299        while (*s)
    300300        {
    301301                *d++ = (char)((fromhex (*s++) << 4) + fromhex (*s++));
    302302        }
    303        
     303
    304304        *d++ = 0;
    305305}
     
    310310        const char *s = pszPlain;
    311311        char *d = pszCrypt;
    312        
     312
    313313        while (*s)
    314314        {
     
    317317                s++;
    318318        }
    319        
     319
    320320        *d++ = 0;
    321321}
     
    338338        pRes->krb5support = 0;
    339339#endif
    340                 pRes->pdc = NULL;
     340        pRes->pdc = NULL;
    341341
    342342        t = 0, q = NULL;
     
    380380
    381381        t = 0, q = NULL;
    382                 rc = ph->fsphQueryStringProperty (properties, "SPASSWORD", &q, &t);
    383                 if (   rc == NO_ERROR
    384                         && *q != '\0'
    385                         && defaultPassword)
    386                 {
    387                         char p[1024];
    388                         p[0] = 0;
    389                
    390                         decryptPassword (q, p);
    391                
    392                         if (*p)
    393                         {
    394                 strncpy(pRes->srv.password, p, sizeof(pRes->srv.password) - 1);
    395                
    396                                 /* clear the plain password */
    397                                 ph->fsphSetProperty (properties, "PASSWORD", "");
    398                         }
    399                 }
    400                 else
    401                 {
    402                         char c[1024];
    403                         encryptPassword (pRes->srv.password, c);
    404                
    405                         ph->fsphSetProperty (properties, "SPASSWORD", c);
    406                
    407                         // clear the plain password
     382        rc = ph->fsphQueryStringProperty (properties, "SPASSWORD", &q, &t);
     383        if (   rc == NO_ERROR && *q != '\0' && defaultPassword)
     384        {
     385                char p[1024];
     386                p[0] = 0;
     387
     388                decryptPassword (q, p);
     389
     390                if (*p)
     391                {
     392                        strncpy(pRes->srv.password, p, sizeof(pRes->srv.password) - 1);
     393
     394                        /* clear the plain password */
    408395                        ph->fsphSetProperty (properties, "PASSWORD", "");
    409396                }
     397        }
     398        else
     399        {
     400                char c[1024];
     401                encryptPassword (pRes->srv.password, c);
     402
     403                ph->fsphSetProperty (properties, "SPASSWORD", c);
     404
     405                // clear the plain password
     406                ph->fsphSetProperty (properties, "PASSWORD", "");
     407        }
    410408
    411409        t = 0, q = NULL;
     
    473471
    474472        /*
    475                 * Create a directory cache with expiration time and cache listings
    476                 * the above values come from the gui. default: timeout 10; listings: 32
    477                 */
     473        * Create a directory cache with expiration time and cache listings
     474        * the above values come from the gui. default: timeout 10; listings: 32
     475        */
    478476        dircache_create(&pRes->pdc, pRes->cachetimeout, pRes->cachedepth);
    479477
     
    580578                if (newlevel)
    581579                {
    582                                 // reconnect to server here, first test new connection
     580                        // reconnect to server here, first test new connection
    583581                        cli_state* tmp_cli = NULL;
    584582                        rc = smbwrp_connect( &tmpRes, &tmp_cli);
     
    918916/*
    919917 * NdpQueryPathInfo is the most important  function :) netdrive always calls
    920  * the function before every operation to find out the path status: does it exist, is it a file, does a
    921  * parent directory exist, etc.
     918 * the function before every operation to find out the path status:
     919 * does it exist, is it a file, does a parent directory exist, etc.
    922920 * Plugin must return one of the following error codes:
    923  * NO_ERROR - path exists and the path information have been successfully retrieved.
     921 * NO_ERROR - path exists and the path information have been successfully
     922 *      retrieved.
    924923 * ERROR_FILE_NOT_FOUND - all but the last component of the path exist and the
    925  *      path without the last component is a directory. dir1_ok\dir2_ok\does_not_exist.
    926  *      the wildcard can not exist, so the plugin returns FILE_NOT_FOUND, if the parent
    927  *      directory exist.
     924 *      path without the last component is a directory. dir1_ok\dir2_ok\does_not_exist.
     925 *      the wildcard can not exist, so the plugin returns FILE_NOT_FOUND, if the parent
     926 *      directory exist.
    928927 * ERROR_PATH_NOT_FOUND - any of not last path components does not exist, or all
    929  *      but the last component exist and is a file: \dir_ok\dir2_ok\file_ok\non_existing.
     928 *      but the last component exist and is a file: \dir_ok\dir2_ok\file_ok\non_existing.
    930929 * ERROR_REM_NOT_LIST - resource is temporarily unavailable for some reasons.
    931930 * Any other error codes means an internal plugin error, not related to the status
     
    10021001                                        rcCon = smbwrp_connect( pRes, &pConn->cli);
    10031002                                        if (rcCon != NO_ERROR)
    1004                                         debuglocal(9,"NdpQueryPathInfo smbwrp_connect rc = %d\n", rcCon);
     1003                                                debuglocal(9,"NdpQueryPathInfo smbwrp_connect rc = %d\n", rcCon);
    10051004
    10061005                                        // try file list again if reconnecting worked
    10071006                                        if (rcCon == NO_ERROR)
    1008                                         rc = smbwrp_getattr( &pRes->srv, pConn->cli, &finfo);
     1007                                                rc = smbwrp_getattr( &pRes->srv, pConn->cli, &finfo);
    10091008                                }
    10101009                                debuglocal(9,"NdpQueryPathInfo smbwrp_getattr, rc = %d\n", rc);
     
    10371036                                        *p = 0;
    10381037                                        rc = smbwrp_getattr( &pRes->srv, pConn->cli, &finfo);
    1039                                                                                 debuglocal(9,"NdpQueryPathInfo upper path in <%s>, rc = %d\n",  finfo.fname, rc);
     1038                                        debuglocal(9,"NdpQueryPathInfo upper path in <%s>, rc = %d\n",  finfo.fname, rc);
    10401039                                        if (rc == NO_ERROR)
    10411040                                        {       
    10421041                                                rc = (finfo.attr & FILE_DIRECTORY) !=0 ?
    1043                                                                                                 ERROR_FILE_NOT_FOUND:
    1044                                                                                                 ERROR_PATH_NOT_FOUND;
     1042                                                ERROR_FILE_NOT_FOUND:ERROR_PATH_NOT_FOUND;
    10451043                                        }
    1046                                                                                 else if (rc != ERROR_REM_NOT_LIST)
    1047                                                                                 {
    1048                                                                                           rc = ERROR_PATH_NOT_FOUND;
     1044                                        else if (rc != ERROR_REM_NOT_LIST)
     1045                                        {
     1046                                                rc = ERROR_PATH_NOT_FOUND;
    10491047                                        }
    10501048                                }
     
    11331131                }
    11341132                debuglocal(9,"NdpFindStart: dir [%s], dir_mask [%s], mask [%s], szPath [%s]\n",
    1135                                                    state.dir, state.dir_mask, state.mask, state.fullpath);
     1133                        state.dir, state.dir_mask, state.mask, state.fullpath);
    11361134                rc = smbwrp_filelist( &pRes->srv, pConn->cli, &state);
    11371135                // we need to handle reconnection also here, because NdpQueryPathInfo
     
    11901188        debug_printf("NdpSetPathInfo in [%p]\n", pConn);
    11911189
    1192                 // delete the dir cache
     1190        // delete the dir cache
    11931191        dircache_invalidate(szPathName, pRes->pdc, 1);
    11941192
     
    13061304        debuglocal(9,"NdpEAQuery in [%p] <%s> %08x %d\n", pConn, path, pGEAList, pGEAList ? pGEAList->cbList : 0);
    13071305
    1308                 char *pchBuffer = (char *)malloc(cbBuffer);
    1309                 if (!pchBuffer)
    1310                 {
    1311                                 LEAVE();
    1312                                 return ERROR_NOT_ENOUGH_MEMORY;
    1313                 }
     1306        char *pchBuffer = (char *)malloc(cbBuffer);
     1307        if (!pchBuffer)
     1308        {
     1309                LEAVE();
     1310                return ERROR_NOT_ENOUGH_MEMORY;
     1311        }
    13141312
    13151313        do {
     
    13421340                }
    13431341        } while (0);
    1344                 free(pchBuffer);
     1342        free(pchBuffer);
    13451343        debuglocal(9,"NdpEAQuery <%s> %d %d %d\n", pfi->pszName, rc, pFEASrc->cbList, pFEAList->cbList);
    13461344        LEAVE();
     
    14231421                return ERROR_EAS_NOT_SUPPORTED;
    14241422        }
    1425                
    1426                 debuglocal(9, "remove me NdpEASize before fsphGetFileInfoData\n");
     1423
    14271424        rc = ph->fsphGetFileInfoData(pfi, &fdata, 0);
    14281425        if (rc || !fdata.ulSize || !fdata.pData)
     
    14341431        ENTER();
    14351432
    1436                 debuglocal(9, "remove me NdpEASize before finfo =\n");
    14371433        finfo = (smbwrp_fileinfo *)fdata.pData;
    1438                 debuglocal(9, "remove me NdpEASize after finfo=\n");
    14391434        easize = finfo->easize;
    14401435        finfo->easize = -1;
     
    14501445        debuglocal(9,"NdpEASize in [%p] <%s> \n", pConn, path);
    14511446
    1452                 char *pchBuffer = (char *)malloc(cbBuffer);
    1453                 if (!pchBuffer)
    1454                 {
    1455                                 LEAVE();
    1456                                 return ERROR_NOT_ENOUGH_MEMORY;
    1457                 }
     1447        char *pchBuffer = (char *)malloc(cbBuffer);
     1448        if (!pchBuffer)
     1449        {
     1450                LEAVE();
     1451                return ERROR_NOT_ENOUGH_MEMORY;
     1452        }
    14581453
    14591454        do {
     
    14821477                *pulEASize = pfealist->cbList;
    14831478        } while (0);
    1484                 free(pchBuffer);
     1479        free(pchBuffer);
    14851480        debuglocal(9,"NdpEASize <%s> %d %d\n", pfi->pszName, *pulEASize, rc);
    14861481        LEAVE();
     
    17931788{
    17941789        if (function == ND_PL_INIT_THREAD)
    1795            {
    1796                   smbwrp_initthread();
    1797                   debuglocal(9, "NdpIOCTL init thread\n");
    1798                   return NO_ERROR;
    1799            }
     1790        {
     1791                smbwrp_initthread();
     1792                debuglocal(9, "NdpIOCTL init thread\n");
     1793                return NO_ERROR;
     1794        }
    18001795
    18011796        debuglocal(9,"NdpIOCTL <%s> %d\n", path, function);
     
    18031798        if (in && insize > 4096)
    18041799        {
    1805         char out[4096];
    1806         sprintf (out, "SAMBA IOCTL function = %d, parms [%s] insize = %d, *poutlen = %d", function, in, insize, *poutlen);
    1807         *poutlen = strlen(out);
    1808         strcpy (in, out);
    1809         return NO_ERROR;
     1800                char out[4096];
     1801                sprintf (out, "SAMBA IOCTL function = %d, parms [%s] insize = %d, *poutlen = %d", function, in, insize, *poutlen);
     1802                *poutlen = strlen(out);
     1803                strcpy (in, out);
     1804                return NO_ERROR;
    18101805        }
    18111806
     
    18631858        debuglocal(9,"NdpFileEAQuery in [%p] <%s>/%d pGEAList=%08x\n", pConn, pConn->file.fname, pConn->file.fd, pGEAList);
    18641859
    1865                 char *pchBuffer = (char *)malloc(cbBuffer);
    1866                 if (!pchBuffer)
    1867                                 return ERROR_NOT_ENOUGH_MEMORY;
     1860        char *pchBuffer = (char *)malloc(cbBuffer);
     1861        if (!pchBuffer)
     1862                return ERROR_NOT_ENOUGH_MEMORY;
    18681863
    18691864        ENTER();
     
    19031898                }
    19041899        } while (0);
    1905                 free(pchBuffer);
     1900        free(pchBuffer);
    19061901        debuglocal(9,"NdpFileEAQuery out <%s>/%d pFEASrc->cbList=%d pFEAList->cbList=%d rc=%d\n", pConn->file.fname, pConn->file.fd, pFEASrc->cbList, pFEAList->cbList, rc);
    19071902        LEAVE();
     
    19781973        debuglocal(9,"NdpFileEASize in [%p] <%s>/%d \n", pConn, pConn->file.fname, pConn->file.fd);
    19791974
    1980                 char *pchBuffer = (char *)malloc(cbBuffer);
    1981                 if (!pchBuffer)
    1982                                 return ERROR_NOT_ENOUGH_MEMORY;
     1975        char *pchBuffer = (char *)malloc(cbBuffer);
     1976        if (!pchBuffer)
     1977                return ERROR_NOT_ENOUGH_MEMORY;
    19831978
    19841979        ENTER();
     
    20142009                *pulEASize = pFEAList->cbList;
    20152010        } while (0);
    2016                 free(pchBuffer);
     2011        free(pchBuffer);
    20172012        debuglocal(9,"NdpFileEASize %d %d\n", *pulEASize, rc);
    20182013        LEAVE();
     
    20312026        debug_printf("NdpFileSetInfo in [%p]\n", pConn);
    20322027
    2033                 // delete the dir cache
     2028        // delete the dir cache
    20342029        dircache_invalidate(pConn->file.fullname, pRes->pdc, 1);
    20352030
     
    21822177                while (ulReadCompleted < ulRead)
    21832178                {
    2184                                 ULONG ulActual;
     2179                        ULONG ulActual;
    21852180                        ULONG ulToRead = ulRead - ulReadCompleted;
    21862181                        debuglocal(9,"NdpFileRead completed %d, to read %d\n", ulReadCompleted, ulToRead);
     
    22292224        debuglocal(9,"NdpFileWrite in [%p]\n", pConn);
    22302225
    2231                 /* delete the dir cache
    2232                 this was moved from NdpFileClose() becasue if there are a lot files in the tree all are reread
    2233                 the problem when moved to here is, that last accessed time is not refreshed
    2234                 if this is needed, a new function needs to be done to update only one file in the cache */
     2226        /* delete the dir cache
     2227        this was moved from NdpFileClose() becasue if there are a lot files in the tree all are reread
     2228        the problem when moved to here is, that last accessed time is not refreshed
     2229        if this is needed, a new function needs to be done to update only one file in the cache */
    22352230        dircache_invalidate(pConn->file.fullname, pRes->pdc, 1);
    22362231
Note: See TracChangeset for help on using the changeset viewer.