Changeset 813 for branches/client-2.1/src
- Timestamp:
- Sep 19, 2013, 6:20:36 PM (12 years ago)
- Location:
- branches/client-2.1/src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/client-2.1/src/ndpsmb.c
r812 r813 42 42 void fsphUnixTimeToDosDate( time_t time, FDATE* fdate, FTIME *ftime) 43 43 { 44 44 struct tm* gmt = localtime( &time); 45 45 #if 0 // as localtime() already does dst we don't need to add something 46 46 if (gmt->tm_isdst>0) { 47 47 debug_printf( "daylight saving in effect %d, timezone %d\n",gmt->tm_isdst, timezone); 48 48 time -= 3600; 49 49 gmt = localtime( &time); 50 50 } 51 51 #endif 52 53 54 55 56 57 52 fdate->day = gmt->tm_mday; 53 fdate->month = gmt->tm_mon+1; 54 fdate->year = gmt->tm_year + 1900 - 1980; 55 ftime->twosecs = gmt->tm_sec/2; 56 ftime->minutes = gmt->tm_min; 57 ftime->hours = gmt->tm_hour; 58 58 } 59 59 60 60 void fsphDosDateToUnixTime( FDATE fdate, FTIME ftime, ULONG* time) 61 61 { 62 63 64 65 66 67 68 69 70 71 72 73 74 62 struct tm gmtime = { 0 }; 63 64 debug_printf( "fsphDosDateToUnixTime time %02d:%02d\n", ftime.hours, ftime.minutes); 65 gmtime.tm_mday = fdate.day; 66 gmtime.tm_mon = fdate.month-1; 67 gmtime.tm_year = fdate.year + 1980 - 1900; 68 gmtime.tm_sec = ftime.twosecs*2; 69 gmtime.tm_min = ftime.minutes; 70 gmtime.tm_hour = ftime.hours; 71 gmtime.tm_isdst = -1; // force libc to check dst saving 72 73 *time = mktime( &gmtime); 74 debug_printf( "fsphDosDateToUnixTime time1 %d %s", *time, ctime( (time_t*)time)); 75 75 #if 0 // as mktime() already does dst we don't need to add something 76 77 78 76 struct tm* gmt; 77 gmt = localtime( (time_t*) time); 78 if (gmt->tm_isdst>0) { 79 79 debug_printf( "fsphDosDateToUnixTime daylight saving in effect %d, timezone %d\n",gmt->tm_isdst, timezone); 80 80 *time += 3600; 81 81 } 82 82 #endif 83 83 debug_printf( "fsphDosDateToUnixTime time2 %d %s", *time, ctime( (time_t*)time)); 84 84 } 85 85 … … 104 104 {ND_PROP_STRING, 0, "USER", "guest"}, 105 105 {ND_PROP_STRING, 0, "PASSWORD", ""}, 106 106 {ND_PROP_STRING, 0, "SPASSWORD", ""}, 107 107 {ND_PROP_STRING, 0, "MASTER", "WORKGROUP"}, 108 108 {ND_PROP_ULONG, 0, "MASTERTYPE", "1"}, 109 110 109 {ND_PROP_ULONG, 0, "CTO", "10"}, 110 {ND_PROP_ULONG, 0, "CLD", "32"}, 111 111 {ND_PROP_ULONG, 0, "EASUPPORT", "1"}, 112 112 {ND_PROP_STRING, 0, NULL, NULL} … … 126 126 /* A mutex to serialize plugin calls because libsmb may not be thread safe. */ 127 127 static NDMUTEX mutex; 128 128 129 129 static int lockInit (void) 130 130 { 131 132 } 133 131 return ph->fsphCreateMutex (&mutex); 132 } 133 134 134 static void lockClose (void) 135 135 { 136 137 } 138 136 ph->fsphCloseMutex (mutex); 137 } 138 139 139 static int lockRequest (void) 140 140 { 141 141 return ph->fsphRequestMutex (mutex, SEM_INDEFINITE_WAIT); 142 142 } 143 143 144 144 static void lockRelease (void) 145 145 { 146 146 ph->fsphReleaseMutex (mutex); 147 147 } 148 148 149 149 #if LIBSMB_THREAD_SAFE==0 150 150 151 #define ENTER() do { 152 153 if (rcLock != NO_ERROR)\154 return rcLock;\151 #define ENTER() do { \ 152 int rcLock = lockRequest(); \ 153 if (rcLock != NO_ERROR) \ 154 return rcLock; \ 155 155 } while (0) 156 156 157 157 #define LEAVE() do { \ 158 lockRelease();\158 lockRelease(); \ 159 159 } while (0) 160 160 … … 181 181 ifL = 1; 182 182 } 183 184 183 lockInit(); 184 debugInit(); 185 185 debuglocal(9,"Working with %s bit fileio NDFS\n", ifL ? "64" : "32"); 186 186 return NO_ERROR; … … 190 190 int APIENTRY NdpPluginFree (void) 191 191 { 192 193 192 debugDelete(); 193 lockClose(); 194 194 return NO_ERROR; 195 195 } … … 218 218 stat->attrFile = (finfo->attr & 0x37); 219 219 220 221 222 220 fsphUnixTimeToDosDate(finfo->mtime, &stat->fdateLastWrite, &stat->ftimeLastWrite); 221 fsphUnixTimeToDosDate(finfo->ctime, &stat->fdateCreation, &stat->ftimeCreation); 222 fsphUnixTimeToDosDate(finfo->atime, &stat->fdateLastAccess, &stat->ftimeLastAccess); 223 223 } 224 224 … … 248 248 stat.attrFile = (finfo->attr & 0x37); 249 249 250 251 252 250 fsphUnixTimeToDosDate(finfo->mtime, &stat.fdateLastWrite, &stat.ftimeLastWrite); 251 fsphUnixTimeToDosDate(finfo->ctime, &stat.fdateCreation, &stat.ftimeCreation); 252 fsphUnixTimeToDosDate(finfo->atime, &stat.fdateLastAccess, &stat.ftimeLastAccess); 253 253 debug_printf( "fname %s\n", finfo->fname); 254 254 debug_printf( "mtime %d %s", finfo->mtime, ctime( (time_t*)&finfo->mtime)); … … 261 261 static unsigned char fromhex (char c) 262 262 { 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 263 if ('0' <= c && c <= '9') 264 { 265 return c - '0'; 266 } 267 268 if ('A' <= c && c <= 'F') 269 { 270 return c - 'A' + 0xA; 271 } 272 273 if ('a' <= c && c <= 'f') 274 { 275 return c - 'a' + 0xA; 276 } 277 278 return 0; 279 279 } 280 280 281 281 static char tohex (unsigned char b) 282 282 { 283 284 285 286 287 288 289 290 283 b &= 0xF; 284 285 if (b <= 9) 286 { 287 return b + '0'; 288 } 289 290 return 'A' + (b - 0xA); 291 291 } 292 292 293 293 static void decryptPassword (const char *pszCrypt, char *pszPlain) 294 294 { 295 296 297 298 299 300 301 302 303 304 295 /* A simple "decryption", character from the hex value. */ 296 const char *s = pszCrypt; 297 char *d = pszPlain; 298 299 while (*s) 300 { 301 *d++ = (char)((fromhex (*s++) << 4) + fromhex (*s++)); 302 } 303 304 *d++ = 0; 305 305 } 306 306 307 307 static void encryptPassword (const char *pszPlain, char *pszCrypt) 308 308 { 309 310 311 312 313 314 315 316 317 318 319 320 309 /* A simple "encryption" encode each character as hex value. */ 310 const char *s = pszPlain; 311 char *d = pszCrypt; 312 313 while (*s) 314 { 315 *d++ = tohex ((*s) >> 4); 316 *d++ = tohex (*s); 317 s++; 318 } 319 320 *d++ = 0; 321 321 } 322 322 … … 338 338 pRes->krb5support = 0; 339 339 #endif 340 340 pRes->pdc = NULL; 341 341 342 342 t = 0, q = NULL; … … 380 380 381 381 t = 0, q = NULL; 382 383 384 385 386 387 388 389 390 391 392 393 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 394 strncpy(pRes->srv.password, p, sizeof(pRes->srv.password) - 1); 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 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 408 ph->fsphSetProperty (properties, "PASSWORD", ""); 409 } 410 410 411 411 t = 0, q = NULL; … … 473 473 474 474 /* 475 476 477 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 */ 478 478 dircache_create(&pRes->pdc, pRes->cachetimeout, pRes->cachedepth); 479 479 … … 580 580 if (newlevel) 581 581 { 582 582 // reconnect to server here, first test new connection 583 583 cli_state* tmp_cli = NULL; 584 584 rc = smbwrp_connect( &tmpRes, &tmp_cli); … … 615 615 rc = smbwrp_connect( pRes, &cli); 616 616 /* changed to real error codes SCS 617 618 617 if (rc) 618 rc = (rc == 7 ? ERROR_BAD_DEV_TYPE : ERROR_ACCESS_DENIED); */ 619 619 switch (rc) { 620 620 case 0: … … 682 682 // nd/ndpm do not use main thread 683 683 if (!rc && _gettid()!=1) 684 684 rc = checkMountResource( pRes); 685 685 if (!rc) 686 686 { … … 812 812 if (rc) 813 813 { 814 815 816 817 818 819 820 821 814 debuglocal(9,"NdpCreateConnection failed rc=%d\n", rc); 815 pfsa->cSectorUnit = 1; 816 pfsa->cUnit = 123456; 817 pfsa->cUnitAvail = 123456; 818 pfsa->cbSector = 2048; 819 rc = (rc == 7 ? ERROR_BAD_DEV_TYPE : ERROR_ACCESS_DENIED); 820 LEAVE(); 821 return rc; 822 822 } 823 823 … … 923 923 * NO_ERROR - path exists and the path information have been successfully retrieved. 924 924 * ERROR_FILE_NOT_FOUND - all but the last component of the path exist and the 925 * 926 * 927 * 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. 928 928 * ERROR_PATH_NOT_FOUND - any of not last path components does not exist, or all 929 * 929 * but the last component exist and is a file: \dir_ok\dir2_ok\file_ok\non_existing. 930 930 * ERROR_REM_NOT_LIST - resource is temporarily unavailable for some reasons. 931 931 * Any other error codes means an internal plugin error, not related to the status … … 997 997 if (rc == ERROR_REM_NOT_LIST) 998 998 { 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 999 // free current cli resources 1000 smbwrp_disconnect( pRes, pConn->cli); 1001 // reconnect 1002 rcCon = smbwrp_connect( pRes, &pConn->cli); 1003 if (rcCon != NO_ERROR) 1004 debuglocal(9,"NdpQueryPathInfo smbwrp_connect rc = %d\n", rcCon); 1005 1006 // try file list again if reconnecting worked 1007 if (rcCon == NO_ERROR) 1008 rc = smbwrp_getattr( &pRes->srv, pConn->cli, &finfo); 1009 1009 } 1010 1010 debuglocal(9,"NdpQueryPathInfo smbwrp_getattr, rc = %d\n", rc); … … 1037 1037 *p = 0; 1038 1038 rc = smbwrp_getattr( &pRes->srv, pConn->cli, &finfo); 1039 1039 debuglocal(9,"NdpQueryPathInfo upper path in <%s>, rc = %d\n", finfo.fname, rc); 1040 1040 if (rc == NO_ERROR) 1041 1041 { 1042 1043 1044 1042 rc = (finfo.attr & FILE_DIRECTORY) !=0 ? 1043 ERROR_FILE_NOT_FOUND: 1044 ERROR_PATH_NOT_FOUND; 1045 1045 } 1046 1047 1048 1046 else if (rc != ERROR_REM_NOT_LIST) 1047 { 1048 rc = ERROR_PATH_NOT_FOUND; 1049 1049 } 1050 1050 } … … 1133 1133 } 1134 1134 debuglocal(9,"NdpFindStart: dir [%s], dir_mask [%s], mask [%s], szPath [%s]\n", 1135 1135 state.dir, state.dir_mask, state.mask, state.fullpath); 1136 1136 rc = smbwrp_filelist( &pRes->srv, pConn->cli, &state); 1137 1137 // we need to handle reconnection also here, because NdpQueryPathInfo … … 1139 1139 if (rc == ERROR_REM_NOT_LIST) 1140 1140 { 1141 1142 1143 1144 1145 1146 1147 1141 // free current cli resources 1142 smbwrp_disconnect( pRes, pConn->cli); 1143 // reconnect 1144 smbwrp_connect( pRes, &pConn->cli); 1145 // try file list again next loop 1146 rc = smbwrp_filelist( &pRes->srv, pConn->cli, &state); 1147 debuglocal(9,"NdpFindStart remote connection lost, rc = %d\n", rc); 1148 1148 } 1149 1149 … … 1167 1167 int APIENTRY NdpDiscardResourceData (HRESOURCE resource, NDDATABUF *pdatabuf) 1168 1168 { 1169 1170 1171 1172 1173 1169 // The plugin do not have to deallocate anything 1170 // because resource data did not contain any pointers 1171 // to plugins data. 1172 // Data stored by fsphSetResourceData will be 1173 // deallocated by NetDrive. 1174 1174 1175 1175 debuglocal(9,"NdpDicardresourceData %d\n", 0); … … 1190 1190 debug_printf("NdpSetPathInfo in [%p]\n", pConn); 1191 1191 1192 1192 // delete the dir cache 1193 1193 dircache_invalidate(szPathName, pRes->pdc, 1); 1194 1194 … … 1306 1306 debuglocal(9,"NdpEAQuery in [%p] <%s> %08x %d\n", pConn, path, pGEAList, pGEAList ? pGEAList->cbList : 0); 1307 1307 1308 1309 1310 1311 1312 1313 1308 char *pchBuffer = (char *)malloc(cbBuffer); 1309 if (!pchBuffer) 1310 { 1311 LEAVE(); 1312 return ERROR_NOT_ENOUGH_MEMORY; 1313 } 1314 1314 1315 1315 do { … … 1342 1342 } 1343 1343 } while (0); 1344 1344 free(pchBuffer); 1345 1345 debuglocal(9,"NdpEAQuery <%s> %d %d %d\n", pfi->pszName, rc, pFEASrc->cbList, pFEAList->cbList); 1346 1346 LEAVE(); … … 1423 1423 return ERROR_EAS_NOT_SUPPORTED; 1424 1424 } 1425 1426 1425 1426 debuglocal(9, "remove me NdpEASize before fsphGetFileInfoData\n"); 1427 1427 rc = ph->fsphGetFileInfoData(pfi, &fdata, 0); 1428 1428 if (rc || !fdata.ulSize || !fdata.pData) … … 1434 1434 ENTER(); 1435 1435 1436 1436 debuglocal(9, "remove me NdpEASize before finfo =\n"); 1437 1437 finfo = (smbwrp_fileinfo *)fdata.pData; 1438 1438 debuglocal(9, "remove me NdpEASize after finfo=\n"); 1439 1439 easize = finfo->easize; 1440 1440 finfo->easize = -1; … … 1450 1450 debuglocal(9,"NdpEASize in [%p] <%s> \n", pConn, path); 1451 1451 1452 1453 1454 1455 1456 1457 1452 char *pchBuffer = (char *)malloc(cbBuffer); 1453 if (!pchBuffer) 1454 { 1455 LEAVE(); 1456 return ERROR_NOT_ENOUGH_MEMORY; 1457 } 1458 1458 1459 1459 do { … … 1482 1482 *pulEASize = pfealist->cbList; 1483 1483 } while (0); 1484 1484 free(pchBuffer); 1485 1485 debuglocal(9,"NdpEASize <%s> %d %d\n", pfi->pszName, *pulEASize, rc); 1486 1486 LEAVE(); … … 1792 1792 int APIENTRY NdpIOCTL (int type, HRESOURCE resource, char *path, int function, void *in, ULONG insize, PULONG poutlen) 1793 1793 { 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1794 if (function == ND_PL_INIT_THREAD) 1795 { 1796 smbwrp_initthread(); 1797 debuglocal(9, "NdpIOCTL init thread\n"); 1798 return NO_ERROR; 1799 } 1800 1801 debuglocal(9,"NdpIOCTL <%s> %d\n", path, function); 1802 1803 if (in && insize > 4096) 1804 { 1805 1805 char out[4096]; 1806 1806 sprintf (out, "SAMBA IOCTL function = %d, parms [%s] insize = %d, *poutlen = %d", function, in, insize, *poutlen); … … 1808 1808 strcpy (in, out); 1809 1809 return NO_ERROR; 1810 1811 1812 1810 } 1811 1812 return ERROR_NOT_SUPPORTED; 1813 1813 } 1814 1814 … … 1863 1863 debuglocal(9,"NdpFileEAQuery in [%p] <%s>/%d pGEAList=%08x\n", pConn, pConn->file.fname, pConn->file.fd, pGEAList); 1864 1864 1865 1866 1867 1865 char *pchBuffer = (char *)malloc(cbBuffer); 1866 if (!pchBuffer) 1867 return ERROR_NOT_ENOUGH_MEMORY; 1868 1868 1869 1869 ENTER(); … … 1903 1903 } 1904 1904 } while (0); 1905 1905 free(pchBuffer); 1906 1906 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); 1907 1907 LEAVE(); … … 1978 1978 debuglocal(9,"NdpFileEASize in [%p] <%s>/%d \n", pConn, pConn->file.fname, pConn->file.fd); 1979 1979 1980 1981 1982 1980 char *pchBuffer = (char *)malloc(cbBuffer); 1981 if (!pchBuffer) 1982 return ERROR_NOT_ENOUGH_MEMORY; 1983 1983 1984 1984 ENTER(); … … 2014 2014 *pulEASize = pFEAList->cbList; 2015 2015 } while (0); 2016 2016 free(pchBuffer); 2017 2017 debuglocal(9,"NdpFileEASize %d %d\n", *pulEASize, rc); 2018 2018 LEAVE(); … … 2031 2031 debug_printf("NdpFileSetInfo in [%p]\n", pConn); 2032 2032 2033 2033 // delete the dir cache 2034 2034 dircache_invalidate(pConn->file.fullname, pRes->pdc, 1); 2035 2035 … … 2044 2044 pConn->file.openattr = attrFile; 2045 2045 fsphDosDateToUnixTime(pfi->stat.fdateLastWrite, pfi->stat.ftimeLastWrite, &(pConn->file.mtime)); 2046 pConn->file.newmtime = 0; 2046 fsphDosDateToUnixTime(pfi->stat.fdateCreation, pfi->stat.ftimeCreation, &(pConn->file.ctime)); 2047 pConn->file.updatetime = 2; 2047 2048 debug_printf("NdpFileSetInfo mtime %d\n", pConn->file.mtime); 2048 2049 } while (0); … … 2181 2182 while (ulReadCompleted < ulRead) 2182 2183 { 2183 2184 ULONG ulActual; 2184 2185 ULONG ulToRead = ulRead - ulReadCompleted; 2185 2186 debuglocal(9,"NdpFileRead completed %d, to read %d\n", ulReadCompleted, ulToRead); … … 2228 2229 debuglocal(9,"NdpFileWrite in [%p]\n", pConn); 2229 2230 2230 2231 2232 2233 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 */ 2234 2235 dircache_invalidate(pConn->file.fullname, pRes->pdc, 1); 2235 2236 -
branches/client-2.1/src/smbwrp.c
r807 r813 620 620 return os2cli_errno(cli); 621 621 } 622 file-> newmtime = 0;622 file->updatetime = 0; 623 623 file->offset = 0; 624 624 return 0; … … 671 671 } 672 672 673 file-> newmtime = 1;673 file->updatetime = 1; 674 674 file->offset += ret; 675 675 *result = ret; … … 693 693 return os2cli_errno(cli); 694 694 } 695 if (file->newmtime) 696 { 697 file->newmtime = 0; 695 if (file->updatetime == 1) 696 { 698 697 file->mtime = time(NULL); 698 if (file->updatetime == 2 && !cli_setattrE(cli, file->fd, file->ctime, 0, file->mtime)) 699 { 700 file->updatetime = 0; 701 debuglocal(4,"Set attrE on close failed %d\n", os2cli_errno(cli)); 702 } 699 703 debuglocal(4,"cli_close new mtime %lu\n", file->mtime); 700 704 } 705 701 706 file->fd = -1; 702 707 file->offset = 0; -
branches/client-2.1/src/smbwrp.h
r806 r813 91 91 int denymode; 92 92 unsigned long mtime; 93 int newmtime; 93 unsigned long ctime; 94 int updatetime; 95 // 0 = time is not updated upon file close 96 // 1 = modified time is updated to current time 97 // 2 = create and modified time are updated according local file 94 98 char fullname[261]; 95 99 char fname[261];
Note:
See TracChangeset
for help on using the changeset viewer.