Changeset 145
- Timestamp:
- Aug 16, 2008, 12:11:48 PM (17 years ago)
- Location:
- branches/client-1.5/src
- Files:
-
- 2 added
- 9 deleted
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/client-1.5/src/makefile
r23 r145 2 2 # gcc 3.3.5 is required! 3 3 # 4 # for release build: 5 # make 6 # 7 # for debug build: 8 # make DEBUG=1 9 # 4 10 5 VERSION = 1. 0.156 BUILD = 1511 VERSION = 1.4.9 12 BUILD = alpha1 7 13 8 SAMBA = .. 9 TOOLKIT = E:\dev\toolkit45214 SAMBA = ../../samba-3.0/source 15 TOOLKIT = f:\dev\toolkit452 10 16 11 17 INCLUDES = -I.\h -I.\rc \ … … 16 22 -I$(SAMBA)/tdb/include 17 23 18 CFLAGS = -g -Zomf -O3 -march=pentium -mcpu=pentium4 24 ifdef DEBUG 25 CFLAGS = -g -Zomf -O0 -march=pentium -mcpu=pentium4 -DDEBUG_PRINTF 26 LDFLAGS = -g -Zomf -Zno-fork -Zsym -Zmap -Zbin-files 27 else 28 CFLAGS = -s -Zomf -O3 -march=pentium -mcpu=pentium4 19 29 LDFLAGS = -s -Zomf -Zno-fork -Zsym -Zmap -Zbin-files 30 endif 20 31 21 32 CC = gcc 22 LIBS = $(SAMBA)/bin/libsmbclient.a -lsocket -lsyslog33 LIBS = $(SAMBA)/bin/libsmbclient.a -lsocket 23 34 24 NDPSMB_OBJS = ndpsmb.o 25 SMBCD_OBJS = smbcd.o smbwrp.o 35 NDPSMB_OBJS = ndpsmb.o debug.o smbwrp.o 26 36 37 ifdef DEBUG 38 NDPSMB_OBJS += printf.o 39 endif 27 40 28 all: ndpsmb.dll ndpsmb.hlp smbcd.exe41 all: ndpsmb.dll ndpsmb.hlp 29 42 30 43 .c.o: … … 32 45 33 46 ndpsmb.dll: $(NDPSMB_OBJS) ndpsmb.def rc\rc.res makefile 34 $(CC) -Zdll $(LDFLAGS) -o $@ $(NDPSMB_OBJS) rc\rc.res ndpsmb.def 35 36 smbcd.exe: $(SMBCD_OBJS) rc\rc.res makefile 37 $(CC) -Zexe $(LDFLAGS) -o $@ $(LIBS) $(SMBCD_OBJS) rc\rc.res 47 $(CC) -Zdll $(LDFLAGS) -o $@ $(NDPSMB_OBJS) $(LIBS) rc\rc.res ndpsmb.def 38 48 39 49 rc\description.rc: makefile 40 call BldLevelInf -V$(VERSION) -N"Netlabs.org" -D"NDPSMB - SMBFS NetDrive External Plugin " -Len rc\description.rc50 call BldLevelInf -V$(VERSION) -N"Netlabs.org" -D"NDPSMB - SMBFS NetDrive External Plugin $(BUILD)" -Len rc\description.rc 41 51 42 52 rc\rc.res: .\rc\rc.rc .\rc\rc.dlg .\rc\rc.h .\H\ndpl_rc.h rc\description.rc … … 52 62 53 63 clean: 54 rm *.obj64 rm -f *.obj *.o 55 65 rm *.map 56 66 rm *.dll 57 67 rm *.hlp 68 -
branches/client-1.5/src/ndpsmb.c
r131 r145 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stdarg.h> 4 #include <time.h> 5 1 6 #define NDPL_LARGEFILES 2 7 #define INCL_LONGLONG 3 8 #include <ndextpl2.h> 4 9 #include <smbwrp.h> 5 #include <smbcd.h>6 #include <stdio.h>7 #include <stdlib.h>8 #include <stdarg.h>9 #include <time.h>10 11 12 #define NULL ((void *)0)13 10 14 11 #ifndef DEBUG_PRINTF … … 16 13 #endif 17 14 15 #define log debug_printf 16 17 #if 0 18 18 void log(const char *fmt, ...) 19 19 { … … 42 42 } 43 43 } 44 #endif 44 45 45 46 // ------------------------------------------------------------- … … 253 254 } 254 255 255 typedef struct _Resource256 {257 /* NetDrive information */258 NDPROPERTYHANDLE properties; /* access handle for the properties */259 int rootlevel;260 unsigned long memlen;261 unsigned long objany;262 smbwrp_server srv;263 char logfile[CCHMAXPATH + 1];264 char loglevel;265 int easupport;266 } Resource;267 268 typedef struct _Connection269 {270 Resource *pRes;271 HPIPE pipe;272 char * mem;273 int clientpid;274 int rc;275 smbwrp_server srv;276 smbwrp_file file;277 } Connection;278 279 int openpipe(Resource * pRes, HPIPE * ppipe)280 {281 HPIPE pipe = 0;282 unsigned long rc = 0, action;283 284 if (!pRes)285 {286 return ERROR_INVALID_PARAMETER;287 }288 289 rc = DosOpen(PIPENAME, &pipe, &action, 0, 0, OPEN_ACTION_OPEN_IF_EXISTS, OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE, NULL);290 log("DosOpen1 rc %d\n", rc);291 if (rc)292 {293 unsigned long sid = 0, pid = 0;294 STARTDATA sd;295 char params[CCHMAXPATH * 2] = {0};296 297 MemSet(&sd, 0, sizeof(sd));298 sd.Length = sizeof(sd);299 sd.Related = SSF_RELATED_INDEPENDENT;300 sd.FgBg = SSF_FGBG_BACK;301 sd.PgmName = EXECNAME;302 if (pRes->loglevel)303 {304 char level[2];305 level[0] = pRes->loglevel + '0';306 level[1] = 0;307 StrNCat(params, " -d ", sizeof(params) - 1);308 StrNCat(params, level, sizeof(params) - 1);309 }310 if (*pRes->logfile)311 {312 StrNCat(params, " -l ", sizeof(params) - 1);313 StrNCat(params, pRes->logfile, sizeof(params) - 1);314 }315 log("params <%s>\n", params);316 sd.PgmInputs = *params ? params : NULL;317 sd.SessionType = SSF_TYPE_WINDOWABLEVIO;318 rc = DosStartSession(&sd, &sid, &pid);319 log("smbcd startsession pid %d sid %d rc %d\n", pid, sid, rc);320 if (rc == ERROR_SMG_INVALID_CALL)321 {322 // ndfs started ndctl detached, so we have to use dosexecpgm323 char failed[CCHMAXPATH + 1] = {0};324 RESULTCODES res = {0};325 char * p = params;326 StrCpy(p, EXECNAME);327 p += StrLen(p) + 1;328 if (*pRes->logfile)329 {330 StrCpy(p, "-l ");331 StrNCat(p, pRes->logfile, sizeof(params) - (p - (char *)params));332 p += StrLen(p) + 1;333 if (pRes->loglevel)334 {335 char level[2];336 level[0] = pRes->loglevel + '0';337 level[1] = 0;338 StrCpy(p, "-d ");339 StrNCat(p, level, sizeof(params) - (p - (char *)params));340 p += StrLen(p) + 1;341 }342 }343 else344 {345 StrCpy(p, "-q");346 p += StrLen(p) + 1;347 }348 *p = 0;349 rc = DosExecPgm(failed, sizeof(failed), EXEC_BACKGROUND, params, NULL, &res, EXECNAME);350 log("smbcd DosExecPgm codeTerminate %d codeResult %d rc %d\n", res.codeTerminate, res.codeResult, rc);351 }352 if (!rc)353 {354 DosSleep(500);355 rc = DosOpen(PIPENAME, &pipe, &action, 0, 0, OPEN_ACTION_OPEN_IF_EXISTS, OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE, NULL);356 log("DosOpen2 rc %d\n", rc);357 }358 }359 if (!rc)360 {361 if (ppipe)362 {363 *ppipe = pipe;364 }365 else366 {367 DosClose(pipe);368 }369 }370 return rc;371 }372 373 256 374 257 void getfindinfo(Connection * pConn, FILEFINDBUF3 * stat, smbwrp_fileinfo * finfo) … … 385 268 if (!*name) 386 269 { 387 name = pConn-> srv.share_name;270 name = pConn->pRes->srv.share_name; 388 271 } 389 272 StrNCpy(stat->achName, name, CCHMAXPATHCOMP - 1); … … 413 296 if (!*name) 414 297 { 415 name = pConn-> srv.share_name;298 name = pConn->pRes->srv.share_name; 416 299 } 417 300 if (mask && (!ph->fsphAttrMatch(ulAttribute, finfo->attr & 0x37) || !ph->fsphWildMatch(mask, name, ND_IGNORE_CASE))) … … 500 383 * [filename][;name=filename] 501 384 */ 502 int initResource (Resource *pRes )385 int initResource (Resource *pRes, NDPROPERTYHANDLE properties) 503 386 { 504 387 int rc = NO_ERROR; 505 388 unsigned long t; 506 389 const unsigned char * q = NULL; 507 HPIPE pipe;508 390 int defaultPassword = 1; 509 391 510 pRes->memlen = 1 << 18;511 392 pRes->rootlevel = 0; 512 393 *pRes->logfile = 0; 513 394 pRes->loglevel = 0; 514 395 pRes->easupport = 1; 396 #ifdef HAVE_KRB5_H 397 pRes->krb5support = 1; 398 #else 399 pRes->krb5support = 0; 400 #endif 515 401 516 402 t = 0, q = NULL; 517 rc = ph->fsphQueryStringProperty (p Res->properties, "WORKGROUP", &q, &t);403 rc = ph->fsphQueryStringProperty (properties, "WORKGROUP", &q, &t); 518 404 if (!rc && t && *q) 519 405 { … … 523 409 524 410 t = 0, q = NULL; 525 rc = ph->fsphQueryStringProperty (p Res->properties, "SERVER", &q, &t);411 rc = ph->fsphQueryStringProperty (properties, "SERVER", &q, &t); 526 412 if (!rc && t && *q) 527 413 { … … 531 417 532 418 t = 0, q = NULL; 533 rc = ph->fsphQueryStringProperty (p Res->properties, "SHARE", &q, &t);419 rc = ph->fsphQueryStringProperty (properties, "SHARE", &q, &t); 534 420 if (!rc && t && *q) 535 421 { … … 539 425 540 426 t = 0, q = NULL; 541 rc = ph->fsphQueryStringProperty (p Res->properties, "USER", &q, &t);427 rc = ph->fsphQueryStringProperty (properties, "USER", &q, &t); 542 428 if (!rc && t && *q) 543 429 { … … 546 432 547 433 t = 0, q = NULL; 548 rc = ph->fsphQueryStringProperty (p Res->properties, "PASSWORD", &q, &t);434 rc = ph->fsphQueryStringProperty (properties, "PASSWORD", &q, &t); 549 435 if (!rc && t && *q) 550 436 { … … 554 440 555 441 t = 0, q = NULL; 556 rc = ph->fsphQueryStringProperty (p Res->properties, "SPASSWORD", &q, &t);442 rc = ph->fsphQueryStringProperty (properties, "SPASSWORD", &q, &t); 557 443 if ( rc == NO_ERROR 558 444 && *q != '\0' … … 569 455 570 456 /* clear the plain password */ 571 ph->fsphSetProperty (p Res->properties, "PASSWORD", "");457 ph->fsphSetProperty (properties, "PASSWORD", ""); 572 458 } 573 459 } … … 577 463 encryptPassword (pRes->srv.password, c); 578 464 579 ph->fsphSetProperty (p Res->properties, "SPASSWORD", c);465 ph->fsphSetProperty (properties, "SPASSWORD", c); 580 466 581 467 // clear the plain password 582 ph->fsphSetProperty (p Res->properties, "PASSWORD", "");468 ph->fsphSetProperty (properties, "PASSWORD", ""); 583 469 } 584 470 585 471 t = 0, q = NULL; 586 rc = ph->fsphQueryStringProperty (p Res->properties, "MASTER", &q, &t);472 rc = ph->fsphQueryStringProperty (properties, "MASTER", &q, &t); 587 473 if (!rc && t && *q) 588 474 { … … 591 477 592 478 t = 0, q = NULL; 593 rc = ph->fsphQueryStringProperty (p Res->properties, "LOGFILE", &q, &t);479 rc = ph->fsphQueryStringProperty (properties, "LOGFILE", &q, &t); 594 480 if (!rc && t && *q) 595 481 { … … 598 484 599 485 t = 0; 600 rc = ph->fsphQueryUlongProperty (p Res->properties, "LOGLEVEL", &t);486 rc = ph->fsphQueryUlongProperty (properties, "LOGLEVEL", &t); 601 487 if (!rc) 602 488 { … … 610 496 611 497 t = 0; 612 rc = ph->fsphQueryUlongProperty (p Res->properties, "MASTERTYPE", &t);498 rc = ph->fsphQueryUlongProperty (properties, "MASTERTYPE", &t); 613 499 if (!rc) 614 500 { … … 624 510 625 511 t = 0; 626 rc = ph->fsphQueryUlongProperty (p Res->properties, "EASUPPORT", &t);512 rc = ph->fsphQueryUlongProperty (properties, "EASUPPORT", &t); 627 513 if (!rc) 628 514 { … … 637 523 } 638 524 525 #if 0 639 526 t = 0; 640 rc = ph->fsphQueryUlongProperty (p Res->properties, "MEMLEN", &t);527 rc = ph->fsphQueryUlongProperty (properties, "MEMLEN", &t); 641 528 if (!rc) 642 529 { … … 650 537 } 651 538 } 652 653 return rc; 654 } 655 656 int checkconnection(Connection * pConn) 657 { 658 int rc = NO_ERROR; 659 unsigned long action; 660 smb_request req = {0}; 661 smb_response resp = {0}; 662 char* mem; 663 664 if (!pConn) 665 { 666 return ERROR_INVALID_PARAMETER; 667 } 668 log("checkconnection pconnrc %d pipe %d\n", pConn->rc, pConn->pipe); 669 // YD this code need probably to be removed (reworked), since DosQueryNPHState, 670 // DosQueryNPipeInfo, DosPeekNPipe, DosResetBuffer, are all returning 671 // NO_ERROR even if the other pipe end is closed (smbcd crash). 672 // 673 // YD TODO probably checkconnection() call can be removed since we 674 // detect broken pipes inside _DosTransactNPipe 675 if (!pConn->rc) 676 { 677 unsigned long state = 0; 678 rc = DosQueryNPHState(pConn->pipe, &state); 679 log("DosQueryNPHstate(pConn->pipe) = %d (%08x)\n", pConn->rc, pConn->pipe, rc, state); 680 if (!rc) 681 { 682 return pConn->rc; 683 } 684 } 685 // there were error on pipe, reopen it and restore connection 686 if (pConn->pipe) 687 { 688 DosClose(pConn->pipe); 689 pConn->pipe = 0; 690 } 691 rc = openpipe(pConn->pRes, &pConn->pipe); 692 if (rc) 693 { 694 log("checkconnection openpipe %d\n", rc); 695 pConn->pipe = 0; 696 DosSleep(1000); 697 return ERROR_PIPE_NOT_CONNECTED; 698 } 699 700 // if we are reconnecting pipe because of a broken pipe, we 701 // need to save shared memory content to allow operation retry 702 mem = malloc( pConn->pRes->memlen); 703 if (mem) 704 memcpy( mem, pConn->mem, pConn->pRes->memlen); 705 706 // reinit connection 707 do { 708 req.request = SMBREQ_INIT; 709 req.param = (char *)0xFFFFFFFF; 710 pConn->rc = DosTransactNPipe(pConn->pipe, &req, sizeof(req), &resp, sizeof(resp), &action); 711 if (pConn->rc || action < sizeof(resp) || resp.rc) 712 { 713 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 714 break; 715 } 716 pConn->clientpid = resp.value & 0xFFFF; 717 // client daemon pid changed 718 pConn->rc = DosGiveSharedMem(pConn->mem, pConn->clientpid, PAG_READ | PAG_WRITE); 719 if (pConn->rc) 720 { 721 rc = pConn->rc; 722 break; 723 } 724 MemCpy(pConn->mem, &pConn->srv, sizeof(pConn->srv)); 725 726 req.request = SMBREQ_CONNECT; 727 req.param = pConn->mem; 728 req.paramlen = sizeof(pConn->srv); 729 req.length = req.paramlen; 730 731 pConn->rc = DosTransactNPipe(pConn->pipe, &req, sizeof(req), &resp, sizeof(resp), &action); 732 if (pConn->rc || action < sizeof(resp) || resp.rc) 733 { 734 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 735 break; 736 } 737 MemCpy(&pConn->srv, pConn->mem, sizeof(pConn->srv)); 738 739 rc = NO_ERROR; 740 } while (0); 741 742 // if we are reconnecting pipe because of a broken pipe, we 743 // need to restore shared memory content to allow operation retry 744 if (mem) { 745 memcpy( pConn->mem, mem, pConn->pRes->memlen); 746 free( mem); 747 } 748 749 if (pConn->rc && pConn->pipe) 750 { 751 DosClose(pConn->pipe); 752 pConn->pipe = 0; 753 } 754 return rc; 755 } 756 757 /* 758 * YD Since DosQueryNPHState, 759 * DosQueryNPipeInfo, DosPeekNPipe, DosResetBuffer, are all returning 760 * NO_ERROR even if the other pipe end is closed (smbcd crash), 761 * we can detect broken pipes only when writing/reading from the pipe. 762 */ 763 ULONG APIENTRY _DosTransactNPipe(Connection *pConn, PVOID pOutbuf, ULONG ulOutbufLength, 764 PVOID pInbuf, ULONG ulInbufLength, PULONG pulBytesRead) 765 { 766 APIRET rc; 767 768 // try first 769 rc = DosTransactNPipe(pConn->pipe, pOutbuf, ulOutbufLength, pInbuf, ulInbufLength, pulBytesRead); 770 if (rc != ERROR_BROKEN_PIPE) 771 return rc; 772 // client daemon closed, force open connection again 773 pConn->rc = rc; 774 checkconnection( pConn); 775 // issue command again 776 rc = DosTransactNPipe(pConn->pipe, pOutbuf, ulOutbufLength, pInbuf, ulInbufLength, pulBytesRead); 539 #endif 540 777 541 return rc; 778 542 } … … 810 574 return NO_ERROR; 811 575 } 576 812 577 rootlevel = pRes->rootlevel; 813 578 if (*path == '\\') path++; 579 #if 0 // FIXME 814 580 if (rootlevel < 3) 815 581 { … … 902 668 } 903 669 } 670 #endif 904 671 StrCpy(result, "\\"); 905 672 StrNCat(result, path, CCHMAXPATH); 906 return rc; 907 } 908 909 int APIENTRY NdpFreeResource (HRESOURCE resource) 910 { 911 Resource *pRes = (Resource *)resource; 912 MemSet(&pRes->srv, 0, sizeof(pRes->srv)); 913 DosFreeMem(pRes); 914 log("NdpFreeResource %d\n", NO_ERROR); 915 return NO_ERROR; 916 } 673 674 return rc; 675 } 676 917 677 918 678 // ------------------------------------------------------------- … … 923 683 int rc; 924 684 unsigned long action; 925 smb_request req = {0};926 smb_response resp = {0};927 Connection Conn = {0};685 //smbwrp_server srv; 686 cli_state* cli; 687 smbwrp_file file; 928 688 929 689 debug_printf("checkMountResource in tid#%d\n", _gettid()); 930 931 // open the pipe 932 Conn.pRes = pRes; 933 Conn.file.fd = -1; 934 debug_printf("checkMountResource open pipe\n"); 935 rc = openpipe(pRes, &Conn.pipe); 690 rc = smbwrp_connect( pRes, &cli); 936 691 if (rc) 937 { 938 debug_printf("checkMountResource open pipe failed rc=%d\n", rc); 939 return rc; 940 } 941 942 // init, get client pid 943 debug_printf("checkMountResource send INIT for '%s'\n", pRes->srv.share_name); 944 req.request = SMBREQ_INIT; 945 req.param = (char *)0xFFFFFFFF; 946 rc = _DosTransactNPipe(&Conn, &req, sizeof(req), &resp, sizeof(resp), &action); 947 if (rc || action < sizeof(resp) || resp.rc) 948 { 949 debug_printf("checkMountResource INIT failed rc=%d\n", rc); 950 // close pipe 951 DosClose( Conn.pipe); 952 return rc; 953 } 954 Conn.clientpid = resp.value & 0xFFFF; 955 956 // allocate shared memory 957 rc = DosAllocSharedMem((PPVOID)&Conn.mem, NULL, pRes->memlen, PAG_COMMIT | PAG_READ | PAG_WRITE | OBJ_GIVEABLE | pRes->objany); 958 if (rc) 959 { 960 debug_printf("checkMountResource DosAllocSharedMem failed rc=%d\n", rc); 961 // close pipe 962 DosClose( Conn.pipe); 963 return rc; 964 } 965 rc = DosGiveSharedMem( Conn.mem, Conn.clientpid, PAG_READ | PAG_WRITE); 966 if (!rc) 967 { 968 // open connection with samba server, just to check share type 969 debug_printf("checkMountResource send CONNECT\n"); 970 MemCpy( Conn.mem, &pRes->srv, sizeof(pRes->srv)); 971 req.request = SMBREQ_CONNECT; 972 req.param = Conn.mem; 973 req.paramlen = sizeof( Conn.srv); 974 req.length = req.paramlen; 975 rc = _DosTransactNPipe( &Conn, &req, sizeof(req), &resp, sizeof(resp), &action); 976 if (rc || action < sizeof(resp) || resp.rc) 977 { 978 debug_printf("checkMountResource SMBREQ_CONNECT failed rc=%d, resp.rc=%d\n", rc, resp.rc); 979 rc = (rc == NO_ERROR ? resp.rc : rc); 980 } 981 // no more data, close connection 982 req.request = SMBREQ_DISCONNECT; 983 req.param = Conn.mem; 984 req.length = 0; 985 req.paramlen = 0; 986 _DosTransactNPipe( &Conn, &req, sizeof(req), &resp, sizeof(resp), &action); 987 } 988 989 // free memory 990 DosFreeMem( Conn.mem); 991 // close pipe 992 DosClose( Conn.pipe); 692 rc = (rc == 7 ? ERROR_BAD_DEV_TYPE : ERROR_ACCESS_DENIED); 693 smbwrp_disconnect( pRes, cli); 993 694 994 695 return rc; … … 1003 704 log("NdpMountResource in\n"); 1004 705 706 // init code 707 smbwrp_init(); 708 1005 709 /* since samba plugin support only 1 type of resources we do not need */ 1006 710 /* to check what the found type really is */ 1007 rc = DosAllocMem((void **)&pRes, sizeof(Resource), PAG_COMMIT | PAG_READ | PAG_WRITE | objany); 1008 if (rc == ERROR_INVALID_PARAMETER) 1009 { 1010 objany = 0; 1011 rc = DosAllocMem((void **)&pRes, sizeof(Resource), PAG_COMMIT | PAG_READ | PAG_WRITE); 1012 } 1013 if (!rc && pRes == NULL) 711 pRes = malloc( sizeof(Resource)); 712 if (pRes == NULL) 1014 713 { 1015 714 rc = ERROR_NOT_ENOUGH_MEMORY; 1016 } 1017 if (!rc)715 } 716 else 1018 717 { 1019 718 MemSet(pRes, 0, sizeof(Resource)); 1020 pRes->properties = properties; 1021 pRes->objany = objany; 719 //pRes->objany = objany; 1022 720 // parse init string 1023 rc = initResource (pRes );721 rc = initResource (pRes, properties); 1024 722 // try to connect to resource (check type) only if thread!=1, so ndctl startup 1025 723 // is not slowed down by network connections. … … 1035 733 else 1036 734 { 1037 NdpFreeResource((HRESOURCE)pRes);735 free(pRes); 1038 736 } 1039 737 } … … 1044 742 // ------------------------------------------------------------- 1045 743 1046 int APIENTRY NdpCreateConnection (HRESOURCE resource, HCONNECTION *pconn) 1047 { 1048 int rc; 1049 Resource * pRes = (Resource *)resource; 1050 unsigned long action; 1051 smb_request req = {0}; 1052 smb_response resp = {0}; 1053 Connection *pConn = NULL; 1054 1055 log("NdpCreateConnection in\n"); 1056 1057 rc = DosAllocMem((void **)&pConn, sizeof(Connection), PAG_COMMIT | PAG_READ | PAG_WRITE | pRes->objany); 1058 if (!rc && pConn == NULL) 1059 { 1060 rc = ERROR_NOT_ENOUGH_MEMORY; 1061 } 1062 if (rc) 1063 { 1064 log("NdpCreateConnection ERROR_NOT_ENOUGH_MEMORY %d\n", rc); 1065 return rc; 1066 } 1067 MemSet(pConn, 0, sizeof(Connection)); 1068 pConn->pRes = pRes; 1069 pConn->file.fd = -1; 1070 1071 do { 1072 log("NdpCreateConnection open pipe\n"); 1073 rc = openpipe(pRes, &pConn->pipe); 1074 if (rc) 1075 { 1076 pConn->pipe = 0; 1077 break; 1078 } 1079 1080 log("NdpCreateConnection send INIT\n"); 1081 req.request = SMBREQ_INIT; 1082 req.param = (char *)0xFFFFFFFF; 1083 rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 1084 if (rc || action < sizeof(resp) || resp.rc) 1085 { 1086 return rc ? rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 1087 } 1088 pConn->clientpid = resp.value & 0xFFFF; 1089 1090 rc = DosAllocSharedMem((PPVOID)&pConn->mem, NULL, pRes->memlen, PAG_COMMIT | PAG_READ | PAG_WRITE | OBJ_GIVEABLE | pRes->objany); 1091 if (rc) 1092 { 1093 break; 1094 } 1095 rc = DosGiveSharedMem(pConn->mem, pConn->clientpid, PAG_READ | PAG_WRITE); 1096 if (rc) 1097 { 1098 break; 1099 } 1100 1101 log("NdpCreateConnection send CONNECT\n"); 1102 MemCpy(pConn->mem, &pRes->srv, sizeof(pRes->srv)); 1103 req.request = SMBREQ_CONNECT; 1104 req.param = pConn->mem; 1105 req.paramlen = sizeof(pConn->srv); 1106 req.length = req.paramlen; 1107 1108 rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 1109 if (rc || action < sizeof(resp) || resp.rc) 1110 { 1111 rc = rc ? rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 1112 } 1113 else 1114 { 1115 MemCpy(&pConn->srv, pConn->mem, sizeof(pConn->srv)); 1116 } 1117 } while (0); 1118 if (rc) 1119 { 1120 if (pConn->mem) 1121 { 1122 DosFreeMem(pConn->mem); 1123 } 1124 if (pConn->pipe) 1125 { 1126 DosClose(pConn->pipe); 1127 } 1128 MemSet(pConn, 0, sizeof(*pConn)); 1129 DosFreeMem(pConn); 1130 pConn = NULL; 1131 } 1132 1133 *pconn = (HCONNECTION)pConn; 1134 log("NdpCreateConnection %d %d\n", rc, resp.rc); 1135 return rc; 744 int APIENTRY NdpFreeResource (HRESOURCE resource) 745 { 746 Resource *pRes = (Resource *)resource; 747 MemSet(&pRes->srv, 0, sizeof(pRes->srv)); 748 free(pRes); 749 log("NdpFreeResource %d\n", NO_ERROR); 750 return NO_ERROR; 1136 751 } 1137 752 1138 753 // ------------------------------------------------------------- 1139 1140 int APIENTRY NdpFreeConnection (HCONNECTION conn)1141 {1142 Connection *pConn = (Connection *)conn;1143 Resource *pRes = pConn->pRes;1144 1145 log("NdpFreeConnection in\n");1146 if (pConn->mem)1147 {1148 smb_request req = {0};1149 smb_response resp = {0};1150 unsigned long action;1151 if (pConn->file.fd >= 0)1152 {1153 MemCpy(pConn->mem, &pConn->file, sizeof(pConn->file));1154 req.request = SMBREQ_CLOSE;1155 req.param = pConn->mem;1156 req.length = sizeof(pConn->file);1157 req.paramlen = sizeof(pConn->file);1158 1159 _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action);1160 pConn->file.fd = -1;1161 }1162 1163 req.request = SMBREQ_DISCONNECT;1164 req.param = pConn->mem;1165 req.length = 0;1166 req.paramlen = 0;1167 1168 _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action);1169 1170 DosFreeMem(pConn->mem);1171 DosClose(pConn->pipe);1172 MemSet(pConn, 0, sizeof(*pConn));1173 }1174 1175 DosFreeMem(pConn);1176 log("NdpFreeConnection %d\n", NO_ERROR);1177 return NO_ERROR;1178 }1179 754 1180 755 int APIENTRY NdpRsrcCompare (HRESOURCE resource, HRESOURCE resource2) … … 1185 760 1186 761 log("NdpRsrcCompare in\n"); 1187 1188 762 if (ph->fsphStrICmp(pRes->srv.server_name, pRes2->srv.server_name) == 0 1189 763 && ph->fsphStrICmp(pRes->srv.share_name, pRes2->srv.share_name) == 0 … … 1258 832 int APIENTRY NdpRsrcQueryFSAllocate (HRESOURCE resource, NDFSALLOCATE *pfsa) 1259 833 { 834 Resource *pRes = (Resource *)resource; 1260 835 int rc = NO_ERROR, rc1; 1261 1262 Connection *pConn = 0;1263 smb_request req = {0};1264 smb_response resp = {0};1265 836 unsigned long action = 0; 837 smbwrp_file file; 838 cli_state* cli; 839 FSALLOCATE fsa; 1266 840 1267 841 log("NdpRsrcQueryFSAllocate %08x\n", pfsa); … … 1272 846 } 1273 847 1274 1275 rc = NdpCreateConnection (resource, (HCONNECTION *)&pConn);848 debug_printf("checkMountResource in tid#%d\n", _gettid()); 849 rc = smbwrp_connect( pRes, &cli); 1276 850 if (rc) 1277 851 { 1278 log("NdpCreateConnection failed rc=%d\n", rc); 852 log("NdpCreateConnection failed rc=%d\n", rc); 853 pfsa->cSectorUnit = 1; 854 pfsa->cUnit = 123456; 855 pfsa->cUnitAvail = 123456; 856 pfsa->cbSector = 2048; 857 return rc; 858 } 859 860 rc = smbwrp_dskattr( cli, &fsa); 861 if (rc) 862 { 1279 863 pfsa->cSectorUnit = 1; 1280 864 pfsa->cUnit = 123456; 1281 865 pfsa->cUnitAvail = 123456; 1282 866 pfsa->cbSector = 2048; 867 //rc = rc ? rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 868 } 869 else 870 { 871 pfsa->cSectorUnit = fsa.cSectorUnit; 872 pfsa->cUnit = fsa.cUnit; 873 pfsa->cUnitAvail = fsa.cUnitAvail; 874 pfsa->cbSector = fsa.cbSector; 875 } 876 877 smbwrp_disconnect( pRes, cli); 878 879 log("NdpRsrcQueryFSAllocate %d/%d (cUnit = %d/cUnitAvail = %d/cbSector = %d)\n", rc, rc1, pfsa->cUnit, pfsa->cUnitAvail, pfsa->cbSector); 880 return rc; 881 } 882 883 // ------------------------------------------------------------- 884 885 int APIENTRY NdpCreateConnection (HRESOURCE resource, HCONNECTION *pconn) 886 { 887 int rc = 0; 888 Resource * pRes = (Resource *)resource; 889 unsigned long action; 890 Connection *pConn = NULL; 891 892 log("NdpCreateConnection in\n"); 893 894 pConn = malloc( sizeof(Connection)); 895 if (pConn == NULL) 896 { 897 rc = ERROR_NOT_ENOUGH_MEMORY; 898 } 899 if (rc) 900 { 901 log("NdpCreateConnection ERROR_NOT_ENOUGH_MEMORY %d\n", rc); 1283 902 return rc; 1284 903 } 1285 1286 MemSet(pConn->mem, 0, sizeof(FSALLOCATE)); 1287 req.request = SMBREQ_DSKATTR; 1288 req.param = pConn->mem; 1289 req.paramlen = sizeof(FSALLOCATE); 1290 req.length = req.paramlen; 1291 1292 rc = DosTransactNPipe( pConn->pipe, &req, sizeof(req), &resp, sizeof(resp), &action); 1293 if (rc || action < sizeof(resp) || resp.rc) 1294 { 1295 pfsa->cSectorUnit = 1; 1296 pfsa->cUnit = 123456; 1297 pfsa->cUnitAvail = 123456; 1298 pfsa->cbSector = 2048; 1299 rc = rc ? rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 1300 } 1301 else 1302 { 1303 FSALLOCATE * fsa = (FSALLOCATE *)pConn->mem; 1304 pfsa->cSectorUnit = fsa->cSectorUnit; 1305 pfsa->cUnit = fsa->cUnit; 1306 pfsa->cUnitAvail = fsa->cUnitAvail; 1307 pfsa->cbSector = fsa->cbSector; 1308 } 1309 1310 rc1 = NdpFreeConnection((HCONNECTION)pConn); 1311 1312 log("NdpRsrcQueryFSAllocate %d/%d/%d (cUnit = %d/cUnitAvail = %d/cbSector = %d)\n", rc, resp.rc, rc1, pfsa->cUnit, pfsa->cUnitAvail, pfsa->cbSector); 1313 return rc; 1314 } 1315 1316 int APIENTRY NdpFindStart (HCONNECTION conn, void *plist, NDFILEINFOL *pfiparent, char *szPath, ULONG ulAttribute) 1317 { 1318 Connection *pConn = (Connection *)conn; 1319 Resource *pRes = pConn->pRes; 1320 int rc = NO_ERROR, count = 0; 1321 unsigned long action; 1322 smb_request req = {0}; 1323 smb_response resp = {0}; 1324 char *mask = "*"; 1325 char dir[CCHMAXPATH+1] = {0}; 1326 char path[CCHMAXPATH+1] = {0}; 1327 char fullname[CCHMAXPATH+1] = {0}; 1328 smbwrp_fileinfo * data; 1329 NDPATHELEMENT *pel = ph->fsphNameElem(0); 1330 1331 debug_printf("NdpFindStart in\n"); 1332 do 1333 { 1334 rc = checkconnection(pConn); 1335 if (rc) 1336 { 1337 break; 1338 } 1339 1340 StrNCpy(dir, szPath, sizeof(dir) - 1); 1341 if (pel) 1342 { 1343 mask = pel->name; 1344 dir[StrLen(szPath) - pel->length] = 0; 1345 } 1346 action = StrLen(dir) - 1; 1347 if (dir[action] == '\\') 1348 { 1349 dir[action] = 0; 1350 } 1351 rc = pathparser(pRes, pConn, dir, path); 1352 if (rc) 1353 { 1354 break; 1355 } 1356 action = StrLen(path) - 1; 1357 if (path[action] != '\\') 1358 { 1359 StrNCat(path, "\\", sizeof(path) - 1); 1360 } 1361 StrCpy(dir, path); 1362 StrNCat(path, mask, sizeof(path) - 1); 1363 1364 MemCpy(pConn->mem, &pConn->srv, sizeof(pConn->srv)); 1365 StrCpy(pConn->mem + sizeof(pConn->srv), path); 1366 req.request = SMBREQ_FILELIST; 1367 req.param = pConn->mem; 1368 req.paramlen = sizeof(pConn->srv) + CCHMAXPATH + 1; 1369 req.length = pRes->memlen; 1370 data = (smbwrp_fileinfo *)(pConn->mem + sizeof(pConn->srv) + CCHMAXPATH + 1); 1371 1372 do { 1373 int i; 1374 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 1375 if (pConn->rc || action < sizeof(resp) 1376 || (resp.rc && resp.rc != ERROR_MORE_DATA)) 1377 { 1378 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 1379 break; 1380 } 1381 log("NdpFindStart %d %d %d\n", pConn->rc, resp.rc, resp.length / sizeof(smbwrp_fileinfo)); 1382 if (ifL) 1383 { 1384 for (i = 0; i < resp.length / sizeof(smbwrp_fileinfo); i++) 1385 { 1386 smbwrp_fileinfo * finfo = data + i; 1387 log("NdpFindStart found <%s> %d\n", finfo->fname, finfo->easize); 1388 StrCpy(fullname, dir); 1389 StrCat(fullname, finfo->fname); 1390 StrCpy(finfo->fname, fullname); 1391 count += getfindinfoL(pConn, plist, finfo, ulAttribute, mask); 1392 } 1393 } 1394 else 1395 { 1396 FILEFINDBUF3 buf = {0}; 1397 for (i = 0; i < resp.length / sizeof(smbwrp_fileinfo); i++) 1398 { 1399 smbwrp_fileinfo * finfo = data + i; 1400 getfindinfo(pConn, &buf, finfo); 1401 1402 if (ph->fsphAttrMatch(ulAttribute, buf.attrFile) 1403 && ph->fsphWildMatch(mask, buf.achName, ND_IGNORE_CASE)) 1404 { 1405 StrCpy(fullname, dir); 1406 StrCat(fullname, finfo->fname); 1407 StrCpy(finfo->fname, fullname); 1408 ph->fsphAddFileFind32(plist, &buf, finfo, sizeof(*finfo), 0); 1409 count++; 1410 } 1411 } 1412 } 1413 } while (resp.rc == ERROR_MORE_DATA); 1414 } while (0); 1415 1416 log("NdpFindStart <%s> (%s) cnt %d %d %d\n", szPath, path, count, rc, pConn->rc); 1417 return rc; 1418 } 904 MemSet(pConn, 0, sizeof(Connection)); 905 pConn->pRes = pRes; 906 pConn->file.fd = -1; 907 908 log("NdpCreateConnection send CONNECT\n"); 909 rc = smbwrp_connect( pRes, &pConn->cli); 910 if (rc) 911 { 912 free(pConn); 913 pConn = NULL; 914 } 915 916 *pconn = (HCONNECTION)pConn; 917 log("NdpCreateConnection %d %d\n", rc, resp.rc); 918 return rc; 919 } 920 921 // ------------------------------------------------------------- 922 923 int APIENTRY NdpFreeConnection (HCONNECTION conn) 924 { 925 Connection *pConn = (Connection *)conn; 926 Resource *pRes = pConn->pRes; 927 int rc; 928 929 log("NdpFreeConnection in\n"); 930 if (pConn->file.fd >= 0) 931 { 932 rc = smbwrp_close( pConn->cli, &pConn->file); 933 pConn->file.fd = -1; 934 } 935 936 smbwrp_disconnect( pRes, pConn->cli); 937 938 free(pConn); 939 log("NdpFreeConnection %d\n", NO_ERROR); 940 return NO_ERROR; 941 } 942 943 // ------------------------------------------------------------- 1419 944 1420 945 int APIENTRY NdpQueryPathInfo (HCONNECTION conn, void *plist, char *szPath) … … 1422 947 Connection *pConn = (Connection *)conn; 1423 948 Resource *pRes = pConn->pRes; 1424 int rc = 0; 1425 unsigned long action; 1426 smb_request req = {0}; 1427 smb_response resp = {0}; 1428 smbwrp_fileinfo * finfo = (smbwrp_fileinfo *)pConn->mem; 949 smbwrp_fileinfo finfo; 950 int rc = 0; 951 unsigned long action; 1429 952 char path[CCHMAXPATH+1] = {0}; 1430 953 int retry = 0; … … 1432 955 do 1433 956 { 1434 debug_printf("NdpQueryInfo in <%s>, retry = %d\n", szPath, retry);957 log("NdpQueryPathInfo in <%s>, retry = %d\n", szPath, retry); 1435 958 1436 959 do { … … 1442 965 } 1443 966 1444 rc = checkconnection(pConn);1445 if (rc)1446 {1447 break;1448 }1449 1450 967 rc = pathparser(pRes, pConn, szPath, path); 968 log("NdpQueryPathInfo pathparser for <%s> rc=%d\n", path, rc); 1451 969 switch (rc) 1452 970 { … … 1468 986 break; 1469 987 } 1470 StrNCpy(finfo->fname, path, sizeof(finfo->fname) - 1); 1471 req.request = SMBREQ_GETINFO; 1472 req.param = pConn->mem; 1473 req.paramlen = sizeof(*finfo); 1474 req.length = req.paramlen; 1475 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 1476 if (pConn->rc || action < sizeof(resp) || resp.rc) 1477 { 1478 switch (resp.rc) 988 StrNCpy(finfo.fname, path, sizeof(finfo.fname) - 1); 989 log("NdpQueryPathInfo smbwrp_getattr for <%s>\n", path); 990 rc = smbwrp_getattr( &pRes->srv, pConn->cli, &finfo); 991 if (rc) 992 { 993 switch (rc) 1479 994 { 1480 995 case NO_ERROR : … … 1486 1001 default : 1487 1002 { 1488 r esp.rc = ERROR_PATH_NOT_FOUND;1003 rc = ERROR_PATH_NOT_FOUND; 1489 1004 } 1490 1005 } 1491 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER);1006 rc =rc ? rc : ERROR_INVALID_PARAMETER; 1492 1007 } 1493 1008 else 1494 1009 { 1495 finfo->easize = -1; 1496 if (ifL) 1497 { 1498 getfindinfoL(pConn, plist, finfo, 0, NULL); 1499 } 1500 else 1501 { 1502 int trc; 1503 FILEFINDBUF3 buf = {0}; 1504 getfindinfo(pConn, &buf, finfo); 1505 trc = ph->fsphAddFileFind32(plist, &buf, finfo, sizeof(*finfo), 0); 1506 log("NdpQueryInfo got info <%s> attr %08x size %d namelen %d date %lu %lu. Plist 0x%08x rc = %d\n", buf.achName, buf.attrFile, buf.cbFile, buf.cchName, buf.fdateLastWrite, buf.ftimeLastWrite, plist, trc); 1507 } 1010 finfo.easize = -1; 1011 getfindinfoL(pConn, plist, &finfo, 0, NULL); 1508 1012 } 1509 1013 if (rc == ERROR_FILE_NOT_FOUND) 1510 1014 { 1511 1015 // now try the upper path 1512 char * p = ph->fsphStrChr(finfo ->fname, '\\');1513 if (p && p > finfo ->fname)1016 char * p = ph->fsphStrChr(finfo.fname, '\\'); 1017 if (p && p > finfo.fname) 1514 1018 { 1515 1019 *p = 0; 1516 rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action);1517 if ( pConn->rc || action < sizeof(resp) || resp.rc)1020 rc = smbwrp_getattr( &pRes->srv, pConn->cli, &finfo); 1021 if (rc) 1518 1022 { 1519 rc = pConn->rc ? pConn->rc : (resp.rc ? ERROR_PATH_NOT_FOUND : ERROR_INVALID_PARAMETER);1023 rc = rc ? ERROR_PATH_NOT_FOUND : ERROR_INVALID_PARAMETER; 1520 1024 } 1521 1025 } 1522 1026 } 1523 1027 } while (0); 1524 log("NdpQuery Info <%s> (%s) %d %d\n", szPath, path, rc, pConn->rc);1028 log("NdpQueryPathInfo <%s> (%s) %d\n", szPath, path, rc); 1525 1029 retry = rc && !retry; 1030 1526 1031 } while (retry); 1527 1032 1033 return rc; 1034 } 1035 1036 // ------------------------------------------------------------- 1037 1038 int APIENTRY NdpFindStart (HCONNECTION conn, void *plist, NDFILEINFOL *pfiparent, char *szPath, ULONG ulAttribute) 1039 { 1040 Connection *pConn = (Connection *)conn; 1041 Resource *pRes = pConn->pRes; 1042 int rc = NO_ERROR, count = 0; 1043 unsigned long action; 1044 char *mask = "*"; 1045 char dir[CCHMAXPATH+1] = {0}; 1046 char path[CCHMAXPATH+1] = {0}; 1047 smbwrp_fileinfo * data; 1048 NDPATHELEMENT *pel = ph->fsphNameElem(0); 1049 filelist_state state; 1050 char * p; 1051 1052 debug_printf("NdpFindStart in\n"); 1053 1054 StrNCpy(dir, szPath, sizeof(dir) - 1); 1055 if (pel) 1056 { 1057 mask = pel->name; 1058 dir[StrLen(szPath) - pel->length] = 0; 1059 } 1060 action = StrLen(dir) - 1; 1061 if (dir[action] == '\\') 1062 { 1063 dir[action] = 0; 1064 } 1065 rc = pathparser(pRes, pConn, dir, path); 1066 if (rc) 1067 { 1068 return rc; 1069 } 1070 action = StrLen(path) - 1; 1071 if (path[action] != '\\') 1072 { 1073 StrNCat(path, "\\", sizeof(path) - 1); 1074 } 1075 StrCpy(dir, path); 1076 StrNCat(path, mask, sizeof(path) - 1); 1077 1078 // this structure will be used by libsmb callbacks, so we store here all we need 1079 // to fill netdrive structures 1080 state.pConn = pConn; 1081 state.plist = plist; 1082 state.ulAttribute = ulAttribute; 1083 strcpy( state.dir, dir); 1084 strcpy( state.dir_mask, mask); 1085 strcpy( state.mask, path); 1086 p = getlastslash(state.mask); 1087 if (p) 1088 { 1089 *(p + 1) = '*'; 1090 *(p + 2) = 0; 1091 } 1092 else 1093 { 1094 strcpy(state.mask, "\\*"); 1095 } 1096 rc = smbwrp_filelist( &pRes->srv, pConn->cli, &state); 1097 1098 log("NdpFindStart <%s> (%s) cnt %d %d\n", szPath, path, count, rc); 1099 1528 1100 return rc; 1529 1101 } … … 1559 1131 int rc = 0; 1560 1132 unsigned long action; 1561 smb_request req = {0};1562 smb_response resp = {0};1563 smbwrp_fileinfo * finfo = (smbwrp_fileinfo *)pConn->mem;1564 1133 char path[CCHMAXPATH+1] = {0}; 1565 1566 debug_printf("NdpSetPathInfo in\n"); 1134 smbwrp_fileinfo finfo; 1135 1136 debug_printf("NdpSetPathInfo in FIXME\n"); 1137 1567 1138 do { 1568 rc = checkconnection(pConn);1569 if (rc)1570 {1571 break;1572 }1573 1574 1139 rc = pathparser(pRes, pConn, szPathName, path); 1575 1140 if (rc) … … 1578 1143 } 1579 1144 1580 MemSet(finfo, 0, sizeof(*finfo)); 1581 1582 StrNCpy(finfo->fname, path, sizeof(finfo->fname) - 1); 1583 fsphDosDateToUnixTime(pfi->stat.fdateLastWrite, pfi->stat.ftimeLastWrite, &(finfo->mtime)); 1584 if (ifL) 1585 { 1586 finfo->attr = pfi->stat.attrFile & 0x37; 1587 } 1588 else 1589 { 1590 FILESTATUS3 * stat = (FILESTATUS3 *)&(pfi->stat); 1591 finfo->attr = stat->attrFile & 0x37; 1592 } 1593 req.request = SMBREQ_SETINFO; 1594 req.param = pConn->mem; 1595 req.paramlen = sizeof(*finfo); 1596 req.length = req.paramlen; 1597 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 1598 if (pConn->rc || action < sizeof(resp) || resp.rc) 1599 { 1600 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 1601 } 1145 MemSet(&finfo, 0, sizeof(finfo)); 1146 1147 StrNCpy(finfo.fname, path, sizeof(finfo.fname) - 1); 1148 fsphDosDateToUnixTime(pfi->stat.fdateLastWrite, pfi->stat.ftimeLastWrite, &(finfo.mtime)); 1149 finfo.attr = pfi->stat.attrFile & 0x37; 1150 rc = smbwrp_setattr(pConn->cli, &finfo); 1602 1151 } while (0); 1603 log("NdpSetPathInfo <%s> (%s) %d %d\n", szPathName, path, rc, pConn->rc); 1152 log("NdpSetPathInfo <%s> (%s) %d\n", szPathName, path, rc); 1153 1604 1154 return rc; 1605 1155 } … … 1670 1220 int rc = 0; 1671 1221 unsigned long action; 1672 smb_request req = {0};1673 smb_response resp = {0};1674 1222 char * path = NULL; 1675 1223 FEALIST * pFEASrc; 1676 1224 NDDATABUF fdata = {0}; 1677 1225 smbwrp_fileinfo *finfo; 1226 char pBuffer[64*1024]; 1678 1227 1679 1228 if (!pfi || !pfi->pszName || !pFEAList) … … 1696 1245 1697 1246 log("NdpEAQuery in <%s> %08x %d\n", path, pGEAList, pGEAList ? pGEAList->cbList : 0); 1247 1698 1248 do { 1699 rc = checkconnection(pConn); 1249 rc = smbwrp_listea( pConn->cli, path, pBuffer, sizeof( pBuffer)); 1250 pFEASrc = (FEALIST*) pBuffer; 1700 1251 if (rc) 1701 1252 { 1702 break; 1703 } 1704 1705 StrNCpy(pConn->mem, path, CCHMAXPATH); 1706 req.request = SMBREQ_LISTEA; 1707 req.param = pConn->mem; 1708 req.paramlen = CCHMAXPATH + 1; 1709 req.length = pRes->memlen - req.paramlen; 1710 pFEASrc = (FEALIST *)(pConn->mem + req.paramlen); 1711 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 1712 if (pConn->rc || action < sizeof(resp) || resp.rc) 1713 { 1714 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 1253 //rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 1715 1254 switch (rc) 1716 1255 { … … 1733 1272 else 1734 1273 { 1735 rc = buildFEALIST( pFEASrc, pGEAList, pFEAList);1274 rc = buildFEALIST((FEALIST *)pFEASrc, pGEAList, pFEAList); 1736 1275 } 1737 1276 } while (0); 1738 log("NdpEAQuery <%s> %d %d %d %d %d\n", pfi->pszName, rc, pFEASrc->cbList, pFEAList->cbList, pConn->rc, resp.rc); 1277 log("NdpEAQuery <%s> %d %d %d\n", pfi->pszName, rc, pFEASrc->cbList, pFEAList->cbList); 1278 1739 1279 return rc; 1740 1280 } … … 1745 1285 Resource *pRes = pConn->pRes; 1746 1286 int rc = 0; 1747 smb_request req = {0};1748 smb_response resp = {0};1749 1287 char * path; 1750 1288 unsigned long action; … … 1763 1301 } 1764 1302 1765 if (pFEAList->cbList > pRes->memlen)1766 {1767 return ERROR_NOT_ENOUGH_MEMORY;1768 }1769 1770 1303 rc = ph->fsphGetFileInfoData(pfi, &fdata, 0); 1771 1304 if (rc || !fdata.ulSize || !fdata.pData) … … 1778 1311 1779 1312 do { 1780 rc = checkconnection(pConn); 1781 if (rc) 1782 { 1783 break; 1784 } 1785 1786 StrNCpy(pConn->mem, path, CCHMAXPATH); 1787 MemCpy(pConn->mem + CCHMAXPATH + 1, pFEAList, pFEAList->cbList); 1788 req.request = SMBREQ_SETEA; 1789 req.param = pConn->mem; 1790 req.paramlen = pFEAList->cbList + CCHMAXPATH + 1; 1791 req.length = req.paramlen; 1792 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 1793 if (pConn->rc || action < sizeof(resp) || resp.rc) 1794 { 1795 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 1313 // got FEA there 1314 FEA * pfea; 1315 unsigned long done = sizeof(long); 1316 pfea = pFEAList->list; 1317 while (done < pFEAList->cbList) 1318 { 1319 rc = smbwrp_setea(pConn->cli, path, (char*)(pfea + 1), pfea->cbValue ? (char *)(pfea + 1) + pfea->cbName + 1: NULL, pfea->cbValue); 1320 if (rc) 1321 { 1322 break; 1323 } 1324 pfea = (FEA *)((char *)(pfea + 1) + pfea->cbName + 1 + pfea->cbValue); 1325 done += sizeof(FEA) + pfea->cbName + 1 + pfea->cbValue; 1796 1326 } 1797 1327 } while (0); 1798 1328 log("NdpEASet %d\n", rc); 1329 1799 1330 return rc; 1800 1331 } … … 1806 1337 int rc = 0; 1807 1338 unsigned long action; 1808 smb_request req = {0};1809 smb_response resp = {0};1810 1339 char * path = NULL; 1811 1340 FEALIST * pfealist; 1812 1341 NDDATABUF fdata = {0}; 1813 1342 smbwrp_fileinfo *finfo; 1343 char pBuffer[64*1024]; 1814 1344 int easize; 1815 1345 … … 1841 1371 1842 1372 log("NdpEASize in <%s> \n", path); 1373 1843 1374 do { 1844 rc = checkconnection(pConn); 1375 rc = smbwrp_listea(pConn->cli, path, pBuffer, sizeof( pBuffer)); 1376 pfealist = (FEALIST*)pBuffer; 1845 1377 if (rc) 1846 1378 { 1847 break; 1848 } 1849 1850 StrNCpy(pConn->mem, path, CCHMAXPATH); 1851 req.request = SMBREQ_LISTEA; 1852 req.param = pConn->mem; 1853 req.paramlen = CCHMAXPATH + 1; 1854 req.length = pRes->memlen - req.paramlen; 1855 pfealist = (FEALIST *)(pConn->mem + req.paramlen); 1856 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 1857 if (pConn->rc || action < sizeof(resp) || resp.rc) 1858 { 1859 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 1379 //rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 1860 1380 switch (rc) 1861 1381 { … … 1877 1397 *pulEASize = pfealist->cbList; 1878 1398 } while (0); 1879 log("NdpEASize <%s> %d %d %d %d\n", pfi->pszName, *pulEASize, rc, pConn->rc, resp.rc); 1399 log("NdpEASize <%s> %d %d\n", pfi->pszName, *pulEASize, rc); 1400 1880 1401 return rc; 1881 1402 } … … 1885 1406 Connection *pConn = (Connection *)conn; 1886 1407 Resource *pRes = pConn->pRes; 1887 smb_request req = {0};1888 smb_response resp = {0};1889 1408 int rc = 0; 1890 1409 unsigned long action; … … 1892 1411 1893 1412 log("NdpSetCurrentDir in\n"); 1413 1894 1414 do { 1895 rc = checkconnection(pConn);1896 if (rc)1897 {1898 break;1899 }1900 1901 1415 rc = pathparser(pRes, pConn, szPath, path); 1902 1416 if (rc) … … 1905 1419 } 1906 1420 1907 StrNCpy(pConn->mem, path, CCHMAXPATH); 1908 req.request = SMBREQ_CHDIR; 1909 req.param = pConn->mem; 1910 req.paramlen = CCHMAXPATH + 1; 1911 req.length = req.paramlen; 1912 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 1913 if (pConn->rc || action < sizeof(resp) || resp.rc) 1914 { 1915 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 1916 } 1421 rc = smbwrp_chdir(&pRes->srv, pConn->cli, path); 1917 1422 } while (0); 1918 log("NdpSetCurrentDir <%s> (%s) %d %d\n", szPath, path, rc, pConn->rc); 1423 log("NdpSetCurrentDir <%s> (%s) %d\n", szPath, path, rc); 1424 1919 1425 return rc; 1920 1426 } … … 1936 1442 Connection *pConn = (Connection *)conn; 1937 1443 Resource *pRes = pConn->pRes; 1938 smb_request req = {0};1939 smb_response resp = {0};1940 1444 int rc = 0; 1941 1445 unsigned long action; … … 1943 1447 1944 1448 log("NdpForceDelete in\n"); 1449 1945 1450 do { 1946 rc = checkconnection(pConn);1947 if (rc)1948 {1949 break;1950 }1951 1952 1451 rc = pathparser(pRes, pConn, szFile, path); 1953 1452 if (rc) … … 1956 1455 } 1957 1456 1958 StrNCpy(pConn->mem, path, CCHMAXPATH); 1959 req.request = SMBREQ_UNLINK; 1960 req.param = pConn->mem; 1961 req.paramlen = CCHMAXPATH + 1; 1962 req.length = req.paramlen; 1963 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 1964 if (pConn->rc || action < sizeof(resp) || resp.rc) 1965 { 1966 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 1967 } 1457 rc = smbwrp_unlink(pConn->cli, path); 1968 1458 } while (0); 1969 log("NdpForceDelete <%s> (%s) %d %d\n", szFile, path, rc, pConn->rc); 1459 log("NdpForceDelete <%s> (%s) %d\n", szFile, path, rc); 1460 1970 1461 return rc; 1971 1462 } … … 1975 1466 Connection *pConn = (Connection *)conn; 1976 1467 Resource *pRes = pConn->pRes; 1977 smb_request req = {0};1978 smb_response resp = {0};1979 1468 int rc = 0; 1980 1469 unsigned long action; … … 1982 1471 1983 1472 log("NdpCreateDir in\n"); 1473 1984 1474 do { 1985 rc = checkconnection(pConn);1986 if (rc)1987 {1988 break;1989 }1990 1991 1475 rc = pathparser(pRes, pConn, szDirName, path); 1992 1476 if (rc) … … 1995 1479 } 1996 1480 1997 StrNCpy(pConn->mem, path, CCHMAXPATH); 1998 req.request = SMBREQ_MKDIR; 1999 req.param = pConn->mem; 2000 req.paramlen = CCHMAXPATH + 1; 2001 req.length = req.paramlen; 2002 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 2003 if (pConn->rc || action < sizeof(resp) || resp.rc) 2004 { 2005 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 2006 } 1481 rc = smbwrp_mkdir(pConn->cli, path); 2007 1482 } while (0); 2008 log("NdpCreateDir <%s> (%s) %d %d\n", szDirName, path, rc, pConn->rc); 1483 log("NdpCreateDir <%s> (%s) %d\n", szDirName, path, rc); 1484 2009 1485 return rc; 2010 1486 } … … 2014 1490 Connection *pConn = (Connection *)conn; 2015 1491 Resource *pRes = pConn->pRes; 2016 smb_request req = {0};2017 smb_response resp = {0};2018 1492 int rc = 0; 2019 1493 unsigned long action; … … 2021 1495 2022 1496 log("NdpDeleteDir in\n"); 1497 2023 1498 do { 2024 rc = checkconnection(pConn);2025 if (rc)2026 {2027 break;2028 }2029 2030 1499 rc = pathparser(pRes, pConn, szDir, path); 2031 1500 if (rc) … … 2034 1503 } 2035 1504 2036 StrNCpy(pConn->mem, path, CCHMAXPATH); 2037 req.request = SMBREQ_RMDIR; 2038 req.param = pConn->mem; 2039 req.paramlen = CCHMAXPATH + 1; 2040 req.length = req.paramlen; 2041 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 2042 if (pConn->rc || action < sizeof(resp) || resp.rc) 2043 { 2044 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 2045 } 1505 rc = smbwrp_rmdir(pConn->cli, path); 2046 1506 } while (0); 2047 log("NdpDeleteDir <%s> (%s) %d %d\n", szDir, path, rc, pConn->rc); 1507 log("NdpDeleteDir <%s> (%s) %d\n", szDir, path, rc); 1508 2048 1509 return rc; 2049 1510 } … … 2053 1514 Connection *pConn = (Connection *)conn; 2054 1515 Resource *pRes = pConn->pRes; 2055 smb_request req = {0};2056 smb_response resp = {0};2057 1516 int rc = 0; 2058 1517 unsigned long action; … … 2061 1520 char * p = szDst; 2062 1521 2063 log("NdpMove in\n"); 1522 log("NdpMove in from <%s> to <%s>\n", szSrc, szDst); 1523 2064 1524 do 2065 1525 { 2066 rc = checkconnection(pConn);2067 if (rc)2068 {2069 break;2070 }2071 2072 1526 rc = pathparser(pRes, pConn, szSrc, src); 2073 1527 if (rc) … … 2087 1541 p = szDst + l1 - l2 + 1; 2088 1542 } 2089 StrNCpy(pConn->mem, src, CCHMAXPATH); 2090 pConn->mem[CCHMAXPATH + 1] = '\\'; 2091 StrNCpy(pConn->mem + CCHMAXPATH + 2, p, CCHMAXPATH - 1); 2092 req.request = SMBREQ_RENAME; 2093 req.param = pConn->mem; 2094 req.paramlen = 2 * (CCHMAXPATH + 1); 2095 req.length = req.paramlen; 2096 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 2097 if (pConn->rc || action < sizeof(resp) || resp.rc) 2098 { 2099 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 2100 } 1543 //pConn->mem[CCHMAXPATH + 1] = '\\'; 1544 rc = smbwrp_rename(pConn->cli, src, p); 2101 1545 } while (0); 2102 log("NdpMove <%s> -> <%s> (%s) %d %d\n", szSrc, szDst, src, rc, pConn->rc);1546 log("NdpMove <%s> -> <%s> (%s) %d\n", szSrc, szDst, src, rc); 2103 1547 2104 1548 return rc; … … 2125 1569 { 2126 1570 Resource *pRes = pConn->pRes; 2127 smb_request req = {0};2128 smb_response resp = {0};2129 1571 unsigned long action; 2130 1572 int rc = 0; … … 2132 1574 2133 1575 log("smbopen in %d\n", pConn->file.fd); 1576 2134 1577 do { 2135 1578 if (pConn->file.fd > 0) 2136 1579 { 2137 1580 rc = ERROR_TOO_MANY_OPEN_FILES; 2138 break;2139 }2140 2141 rc = checkconnection(pConn);2142 if (rc)2143 {2144 1581 break; 2145 1582 } … … 2164 1601 pConn->file.openattr = ulAttribute & 0x37; 2165 1602 pConn->file.denymode = (ulOpenMode & 0x70) >> 4; 2166 MemCpy(pConn->mem, &pConn->file, sizeof(pConn->file)); 2167 req.request = SMBREQ_OPEN; 2168 req.param = pConn->mem; 2169 req.paramlen = sizeof(pConn->file); 2170 req.length = req.paramlen; 2171 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 2172 if (pConn->rc || action < sizeof(resp) || resp.rc) 2173 { 2174 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 2175 } 2176 else 2177 { 2178 MemCpy(&pConn->file, pConn->mem, sizeof(pConn->file)); 2179 } 1603 rc = smbwrp_open(pConn->cli, &pConn->file); 2180 1604 } while (0); 2181 log("smbopen <%s> (%s) %08x %08x %08x %d %d. file = %d\n", szFileName, path, flags, ulOpenMode, ulAttribute, rc, pConn->rc, pConn->file.fd);1605 log("smbopen <%s> (%s) %08x %08x %08x %d. file = %d\n", szFileName, path, flags, ulOpenMode, ulAttribute, rc, pConn->file.fd); 2182 1606 if (!rc && pFEAList) 2183 1607 { … … 2222 1646 int rc = 0; 2223 1647 unsigned long action; 2224 smb_request req = {0}; 2225 smb_response resp = {0}; 2226 smbwrp_fileinfo * finfo = (smbwrp_fileinfo *)pConn->mem; 1648 1649 smbwrp_fileinfo finfo; 2227 1650 char path[CCHMAXPATH+1] = {0}; 2228 1651 2229 1652 log("NdpSetFileAttribute in\n"); 2230 1653 do { 2231 rc = checkconnection(pConn);2232 if (rc)2233 {2234 break;2235 }2236 2237 1654 rc = pathparser(pRes, pConn, szFileName, path); 2238 1655 if (rc) … … 2241 1658 } 2242 1659 2243 MemSet(finfo, 0, sizeof(*finfo)); 2244 2245 StrNCpy(finfo->fname, path, sizeof(finfo->fname) - 1); 2246 finfo->attr = usAttr & 0x37; 2247 req.request = SMBREQ_SETINFO; 2248 req.param = pConn->mem; 2249 req.paramlen = sizeof(*finfo); 2250 req.length = req.paramlen; 2251 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 2252 if (pConn->rc || action < sizeof(resp) || resp.rc) 2253 { 2254 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 2255 } 1660 MemSet(&finfo, 0, sizeof(finfo)); 1661 StrNCpy(finfo.fname, path, sizeof(finfo.fname) - 1); 1662 finfo.attr = usAttr & 0x37; 1663 rc = smbwrp_setattr(pConn->cli, &finfo); 2256 1664 } while (0); 2257 log("NdpSetFileAttribute <%s> (%s) %04x %d %d\n", szFileName, path, usAttr, rc, pConn->rc); 1665 log("NdpSetFileAttribute <%s> (%s) %04x %d\n", szFileName, path, usAttr, rc); 1666 2258 1667 return rc; 2259 1668 } … … 2287 1696 int rc = 0; 2288 1697 unsigned long action; 2289 smb_request req = {0}; 2290 smb_response resp = {0}; 2291 FILEFINDBUF3 buf; 2292 smbwrp_fileinfo * finfo = (smbwrp_fileinfo *)(pConn->mem + sizeof(pConn->file)); 1698 smbwrp_fileinfo finfo; 2293 1699 2294 1700 debug_printf("NdpFileQueryInfo in\n"); … … 2299 1705 break; 2300 1706 } 2301 if (pConn->rc) 2302 { 2303 rc = ERROR_PIPE_NOT_CONNECTED; 2304 break; 2305 } 2306 2307 MemCpy(pConn->mem, &pConn->file, sizeof(pConn->file)); 2308 StrNCpy(finfo->fname, pConn->file.fname, sizeof(finfo->fname) - 1); 2309 req.request = SMBREQ_FGETINFO; 2310 req.param = pConn->mem; 2311 req.paramlen = sizeof(pConn->file); 2312 req.length = req.paramlen + sizeof(*finfo); 2313 rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 2314 if (pConn->rc || action < sizeof(resp) || resp.rc) 2315 { 2316 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 2317 } 2318 else 2319 { 2320 finfo->easize = -1; 2321 if (ifL) 2322 { 2323 getfindinfoL(pConn, plist, finfo, 0, NULL); 2324 } 2325 else 2326 { 2327 getfindinfo(pConn, &buf, finfo); 2328 ph->fsphAddFileFind32(plist, &buf, finfo, sizeof(*finfo), 0); 2329 } 1707 StrNCpy(finfo.fname, pConn->file.fname, sizeof(finfo.fname) - 1); 1708 rc = smbwrp_fgetattr(pConn->cli, &pConn->file, &finfo); 1709 if (!rc) 1710 { 1711 finfo.easize = -1; 1712 getfindinfoL(pConn, plist, &finfo, 0, NULL); 2330 1713 } 2331 1714 } while (0); 2332 log("NdpFileQueryInfo <%s> %d %d\n", pConn->file.fd < 0 ? "!null!" : pConn->file.fname, rc, pConn->rc);1715 log("NdpFileQueryInfo <%s> %d\n", pConn->file.fd < 0 ? "!null!" : pConn->file.fname, rc); 2333 1716 2334 1717 return rc; … … 2341 1724 int rc = 0; 2342 1725 unsigned long action; 2343 smb_request req = {0}; 2344 smb_response resp = {0}; 1726 char pBuffer[64*1024]; 2345 1727 FEALIST * pFEASrc; 2346 1728 … … 2361 1743 break; 2362 1744 } 2363 if (pConn->rc) 2364 { 2365 rc = ERROR_PIPE_NOT_CONNECTED; 2366 break; 2367 } 2368 2369 MemCpy(pConn->mem, &pConn->file, sizeof(pConn->file)); 2370 req.request = SMBREQ_FLISTEA; 2371 req.param = pConn->mem; 2372 req.paramlen = sizeof(pConn->file); 2373 req.length = pRes->memlen - req.paramlen; 2374 pFEASrc = (FEALIST *)(pConn->mem + req.paramlen); 2375 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 2376 if (pConn->rc || action < sizeof(resp) || resp.rc) 2377 { 2378 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 1745 rc = smbwrp_flistea(pConn->cli, &pConn->file, pBuffer, sizeof( pBuffer)); 1746 pFEASrc = (FEALIST *) pBuffer; 1747 if (rc) 1748 { 1749 //rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 2379 1750 switch (rc) 2380 1751 { … … 2400 1771 } 2401 1772 } while (0); 2402 log("NdpFileEAQuery out <%s>/%d pFEASrc->cbList=%d pFEAList->cbList=%d rc=%d %d %d\n", pConn->file.fname, pConn->file.fd, pFEASrc->cbList, pFEAList->cbList, rc, pConn->rc, resp.rc); 1773 log("NdpFileEAQuery out <%s>/%d pFEASrc->cbList=%d pFEAList->cbList=%d rc=%d\n", pConn->file.fname, pConn->file.fd, pFEASrc->cbList, pFEAList->cbList, rc); 1774 2403 1775 return rc; 2404 1776 } … … 2409 1781 Resource *pRes = pConn->pRes; 2410 1782 int rc = 0; 2411 smb_request req = {0};2412 smb_response resp = {0};2413 1783 unsigned long action; 2414 1784 … … 2423 1793 return ERROR_EAS_NOT_SUPPORTED; 2424 1794 } 2425 if (pFEAList->cbList > pRes->memlen)2426 {2427 return ERROR_NOT_ENOUGH_MEMORY;2428 }2429 1795 2430 1796 do { 1797 // got FEA there 1798 FEA * pfea; 1799 unsigned long done = sizeof(long); 2431 1800 if (pConn->file.fd < 0) 2432 1801 { … … 2434 1803 break; 2435 1804 } 2436 if (pConn->rc) 2437 { 2438 rc = ERROR_PIPE_NOT_CONNECTED; 2439 break; 2440 } 2441 2442 MemCpy(pConn->mem, &pConn->file, sizeof(pConn->file)); 2443 MemCpy(pConn->mem + sizeof(pConn->file), pFEAList, pFEAList->cbList); 2444 req.request = SMBREQ_FSETEA; 2445 req.param = pConn->mem; 2446 req.paramlen = pFEAList->cbList + sizeof(pConn->file); 2447 req.length = req.paramlen; 2448 2449 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 2450 if (pConn->rc || action < sizeof(resp) || resp.rc) 2451 { 2452 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 2453 } 1805 1806 pfea = pFEAList->list; 1807 while (done < pFEAList->cbList) 1808 { 1809 rc = smbwrp_fsetea(pConn->cli, &pConn->file, (char *)(pfea + 1), pfea->cbValue ? (char *)(pfea + 1) + pfea->cbName + 1: NULL, pfea->cbValue); 1810 if (rc) 1811 { 1812 break; 1813 } 1814 pfea = (FEA *)((char *)(pfea + 1) + pfea->cbName + 1 + pfea->cbValue); 1815 done += sizeof(FEA) + pfea->cbName + 1 + pfea->cbValue; 1816 } 1817 2454 1818 } while (0); 2455 1819 log("NdpFileEASet %d\n", rc); 1820 2456 1821 return rc; 2457 1822 } … … 2463 1828 int rc = 0; 2464 1829 unsigned long action; 2465 smb_request req = {0};2466 smb_response resp = {0};2467 1830 char path[CCHMAXPATH+1] = {0}; 2468 FEALIST * pfealist; 1831 FEALIST * pFEAList; 1832 char pBuffer[64*1024]; 2469 1833 2470 1834 if (!pulEASize) … … 2484 1848 break; 2485 1849 } 2486 if (pConn->rc) 2487 { 2488 rc = ERROR_PIPE_NOT_CONNECTED; 2489 break; 2490 } 2491 2492 MemCpy(pConn->mem, &pConn->file, sizeof(pConn->file)); 2493 req.request = SMBREQ_FLISTEA; 2494 req.param = pConn->mem; 2495 req.paramlen = sizeof(pConn->file); 2496 req.length = pRes->memlen - req.paramlen; 2497 pfealist = (FEALIST *)(pConn->mem + req.paramlen); 2498 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 2499 if (pConn->rc || action < sizeof(resp) || resp.rc) 2500 { 2501 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 1850 rc = smbwrp_flistea(pConn->cli, &pConn->file, pBuffer, sizeof(pBuffer)); 1851 pFEAList = (FEALIST*) pBuffer; 1852 if (rc) 1853 { 1854 //rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 2502 1855 switch (rc) 2503 1856 { … … 2505 1858 case ERROR_PATH_NOT_FOUND : 2506 1859 { 2507 p fealist->cbList = sizeof(pfealist->cbList);1860 pFEAList->cbList = sizeof(pFEAList->cbList); 2508 1861 } /* Fall through */ 2509 1862 case ERROR_BUFFER_OVERFLOW : … … 2517 1870 } 2518 1871 } 2519 *pulEASize = p fealist->cbList;1872 *pulEASize = pFEAList->cbList; 2520 1873 } while (0); 2521 log("NdpFileEASize %d %d %d %d\n", *pulEASize, rc, pConn->rc, resp.rc); 1874 log("NdpFileEASize %d %d\n", *pulEASize, rc); 1875 2522 1876 return rc; 2523 1877 } … … 2529 1883 int rc = 0; 2530 1884 unsigned long action, attrFile; 2531 smb_request req = {0};2532 smb_response resp = {0};2533 smbwrp_fileinfo * finfo = (smbwrp_fileinfo *)pConn->mem;2534 1885 2535 1886 debug_printf("NdpFileSetInfo in\n"); … … 2540 1891 break; 2541 1892 } 2542 if (pConn->rc) 2543 { 2544 rc = ERROR_PIPE_NOT_CONNECTED; 2545 break; 2546 } 2547 if (ifL) 2548 { 2549 attrFile = pfi->stat.attrFile; 2550 } 2551 else 2552 { 2553 FILESTATUS3 * stat = (FILESTATUS3 *)&(pfi->stat); 2554 attrFile = stat->attrFile; 2555 } 1893 attrFile = pfi->stat.attrFile; 2556 1894 // deferred setinfo - on closing the file 2557 1895 pConn->file.openattr = attrFile; … … 2559 1897 debug_printf("NdpFileSetInfo mtime %d\n", pConn->file.mtime); 2560 1898 } while (0); 2561 log("NdpFileSetInfo <%s> %08x %d %d\n", pConn->file.fd < 0 ? "!null!" : pConn->file.fname, attrFile, rc, pConn->rc); 1899 log("NdpFileSetInfo <%s> %08x %d\n", pConn->file.fd < 0 ? "!null!" : pConn->file.fname, attrFile, rc); 1900 2562 1901 return NO_ERROR; 2563 1902 } … … 2569 1908 int rc = 0; 2570 1909 unsigned long action; 2571 smb_request req = {0};2572 smb_response resp = {0};2573 1910 2574 1911 log("NdpFileSetFilePtrl in\n"); 1912 2575 1913 do { 2576 1914 if (pConn->file.fd < 0) … … 2579 1917 break; 2580 1918 } 2581 if (pConn->rc) 2582 { 2583 rc = ERROR_PIPE_NOT_CONNECTED; 2584 break; 2585 } 2586 2587 MemCpy(pConn->mem, &pConn->file, sizeof(pConn->file)); 2588 *(unsigned long *)(pConn->mem + sizeof(pConn->file)) = ulMethod; 2589 *(long long *)(pConn->mem + sizeof(pConn->file) + sizeof(long)) = llOffset; 2590 req.request = SMBREQ_LSEEK; 2591 req.param = pConn->mem; 2592 req.paramlen = sizeof(pConn->file) + sizeof(long) + sizeof(long long); 2593 req.length = req.paramlen; 2594 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 2595 if (pConn->rc || action < sizeof(resp) || resp.rc) 2596 { 2597 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 2598 } 2599 else 2600 { 2601 MemCpy(&pConn->file, pConn->mem, sizeof(pConn->file)); 1919 1920 rc = smbwrp_lseek(pConn->cli, &pConn->file, ulMethod, llOffset); 1921 if (!rc) 2602 1922 *pllActual = pConn->file.offset; 2603 } 1923 2604 1924 } while (0); 2605 log("NdpFileSetFilePtrL <%s> %lld %lu %lld %d %d\n", pConn->file.fd < 0 ? "!null!" : pConn->file.fname, llOffset, ulMethod, *pllActual, rc, pConn->rc);1925 log("NdpFileSetFilePtrL <%s> %lld %lu %lld %d\n", pConn->file.fd < 0 ? "!null!" : pConn->file.fname, llOffset, ulMethod, *pllActual, rc); 2606 1926 2607 1927 return rc; … … 2623 1943 int rc = 0; 2624 1944 unsigned long action; 2625 smb_request req = {0};2626 smb_response resp = {0};2627 1945 2628 1946 log("NdpFileClose in %d <%s>\n", pConn->file.fd, pConn->file.fd < 0 ? "!null!" : pConn->file.fname); … … 2634 1952 break; 2635 1953 } 2636 if (pConn->rc) 2637 { 2638 rc = ERROR_PIPE_NOT_CONNECTED; 2639 break; 2640 } 2641 2642 MemCpy(pConn->mem, &pConn->file, sizeof(pConn->file)); 2643 req.request = SMBREQ_CLOSE; 2644 req.param = pConn->mem; 2645 req.length = pRes->memlen; 2646 req.paramlen = sizeof(pConn->file); 2647 req.length = req.paramlen; 2648 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 2649 if (pConn->rc || action < sizeof(resp) || resp.rc) 2650 { 2651 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 2652 } 2653 else 2654 { 2655 MemCpy(&pConn->file, pConn->mem, sizeof(pConn->file)); 2656 } 1954 1955 rc = smbwrp_close(pConn->cli, &pConn->file); 1956 2657 1957 } while (0); 2658 log("NdpFileClose %d %d %d\n", pConn->file.fd, rc, pConn->rc); 1958 log("NdpFileClose %d %d\n", pConn->file.fd, rc); 1959 2659 1960 pConn->file.fd = -1; 2660 1961 return rc; … … 2681 1982 int rc = 0; 2682 1983 unsigned long action; 2683 smb_request req = {0};2684 smb_response resp = {0};2685 1984 2686 1985 log("NdpFileNewSizeL in\n"); 1986 2687 1987 do { 2688 1988 if (pConn->file.fd < 0) … … 2691 1991 break; 2692 1992 } 2693 if (pConn->rc) 2694 { 2695 rc = ERROR_PIPE_NOT_CONNECTED; 2696 break; 2697 } 2698 2699 MemCpy(pConn->mem, &pConn->file, sizeof(pConn->file)); 2700 *(long long *)(pConn->mem + sizeof(pConn->file)) = llLen; 2701 2702 req.request = SMBREQ_NEWSIZE; 2703 req.param = pConn->mem; 2704 req.paramlen = sizeof(pConn->file) + sizeof(long long); 2705 req.length = req.paramlen; 2706 2707 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 2708 if (pConn->rc || action < sizeof(resp) || resp.rc) 2709 { 2710 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 2711 } 2712 else 2713 { 2714 MemCpy(&pConn->file, pConn->mem, sizeof(pConn->file)); 2715 } 1993 1994 rc = smbwrp_setfilesize(pConn->cli, &pConn->file, llLen); 1995 2716 1996 } while (0); 2717 log("NdpFileNewSizeL <%s> %lld %d %d\n", pConn->file.fd < 0 ? "!null!" : pConn->file.fname, llLen, rc, pConn->rc); 1997 log("NdpFileNewSizeL <%s> %lld %d\n", pConn->file.fd < 0 ? "!null!" : pConn->file.fname, llLen, rc); 1998 2718 1999 return rc; 2719 2000 } … … 2727 2008 unsigned long onedone; 2728 2009 unsigned long action; 2729 smb_request req = {0};2730 smb_response resp = {0};2731 2010 2732 2011 log("NdpFileRead in\n"); 2733 // log("NdpFileRead <%s> %lu\n", pConn->file.fd < 0 ? "!null!" : pConn->file.fname, ulRead);2734 2012 2735 2013 do { … … 2739 2017 break; 2740 2018 } 2741 if (pConn->rc) 2742 { 2743 rc = ERROR_PIPE_NOT_CONNECTED; 2744 break; 2745 } 2746 2747 MemCpy(pConn->mem, &pConn->file, sizeof(pConn->file)); 2748 req.request = SMBREQ_READ; 2749 req.param = pConn->mem; 2750 req.paramlen = sizeof(pConn->file); 2751 2752 while (done < ulRead) 2753 { 2754 req.length = req.paramlen + (pRes->memlen - req.paramlen < (ulRead - done) ? pRes->memlen - req.paramlen : (ulRead - done)); 2755 2756 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 2757 if (pConn->rc || action < sizeof(resp) || resp.rc) 2758 { 2759 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 2760 break; 2761 } 2762 if (resp.value == 0) 2763 { 2764 break; 2765 } 2766 onedone = resp.value > req.length ? req.length : resp.value; 2767 MemCpy((char *)pBuffer + done, pConn->mem + sizeof(pConn->file), onedone); 2768 done += onedone; 2769 } 2770 MemCpy(&pConn->file, pConn->mem, sizeof(pConn->file)); 2771 *pulActual = done; 2019 rc = smbwrp_read(pConn->cli, &pConn->file, pBuffer, ulRead, pulActual); 2020 //*pulActual = ulRead; 2021 //DosSleep(0); 2022 2772 2023 } while (0); 2773 log("NdpFileRead <%s> %lu %lu %d %d\n", pConn->file.fd < 0 ? "!null!" : pConn->file.fname, ulRead, *pulActual, rc, pConn->rc);2024 log("NdpFileRead <%s> %lu %lu %d\n", pConn->file.fd < 0 ? "!null!" : pConn->file.fname, ulRead, *pulActual, rc); 2774 2025 2775 2026 return rc; … … 2784 2035 unsigned long onedone; 2785 2036 unsigned long action; 2786 smb_request req = {0};2787 smb_response resp = {0};2788 2037 2789 2038 log("NdpFileWrite in\n"); 2039 2790 2040 do { 2791 2041 if (pConn->file.fd < 0) … … 2794 2044 break; 2795 2045 } 2796 if (pConn->rc) 2797 { 2798 rc = ERROR_PIPE_NOT_CONNECTED; 2799 break; 2800 } 2801 2802 MemCpy(pConn->mem, &pConn->file, sizeof(pConn->file)); 2803 req.request = SMBREQ_WRITE; 2804 req.param = pConn->mem; 2805 req.paramlen = sizeof(pConn->file); 2806 2807 while (done < ulWrite) 2808 { 2809 req.length = pRes->memlen - req.paramlen < (ulWrite - done) ? pRes->memlen - req.paramlen : (ulWrite - done); 2810 MemCpy(pConn->mem + sizeof(pConn->file), (char *)pBuffer + done, req.length); 2811 req.length += req.paramlen; 2812 2813 pConn->rc = _DosTransactNPipe(pConn, &req, sizeof(req), &resp, sizeof(resp), &action); 2814 if (pConn->rc || action < sizeof(resp) || resp.rc) 2815 { 2816 rc = pConn->rc ? pConn->rc : (resp.rc ? resp.rc : ERROR_INVALID_PARAMETER); 2817 break; 2818 } 2819 done += resp.value & 0xFFFFFFFF; 2820 if (resp.value < req.length) 2821 { 2822 break; 2823 } 2824 } 2825 MemCpy(&pConn->file, pConn->mem, sizeof(pConn->file)); 2826 *pulActual = done; 2046 rc = smbwrp_write(pConn->cli, &pConn->file, pBuffer, ulWrite, pulActual); 2047 2827 2048 } while (0); 2828 log("NdpFileWrite <%s> %lu %lu %d %d\n", pConn->file.fd < 0 ? "!null!" : pConn->file.fname, ulWrite, *pulActual, rc, pConn->rc); 2829 2830 return rc; 2831 } 2049 log("NdpFileWrite <%s> %lu %lu %d\n", pConn->file.fd < 0 ? "!null!" : pConn->file.fname, ulWrite, *pulActual, rc); 2050 2051 return rc; 2052 } 2053 -
branches/client-1.5/src/smbwrp.c
r129 r145 377 377 return a connection to a server 378 378 *******************************************************/ 379 int _System smbwrp_connect(smbwrp_server * srv, struct cli_state ** cli, int krb5support) 380 { 379 int _System smbwrp_connect( Resource* pRes, cli_state ** cli) 380 { 381 smbwrp_server * srv = &pRes->srv; 381 382 char * server = srv->server_name; 382 383 char * share = *(srv->share_name) ? srv->share_name : "IPC$"; … … 440 441 } 441 442 442 if (krb5support == 1){ 443 debuglocal(1,"Kerberos support enabled\n"); 444 c->use_kerberos = True;} 443 if (pRes->krb5support == 1) 444 { 445 debuglocal(1,"Kerberos support enabled\n"); 446 c->use_kerberos = True; 447 } 445 448 446 449 if (!cli_session_request(c, &calling, &called)) { … … 492 495 debuglocal(4," tconx ok. cli caps %08x\n", c->capabilities); 493 496 494 // copy back cli_state497 // save cli_state pointer 495 498 *cli = c; 496 499 497 // srv->dev = (dev_t)(str_checksum(server) ^ str_checksum(share));498 499 500 return 0; 500 501 } … … 503 504 close a connection to a server 504 505 *******************************************************/ 505 void _System smbwrp_disconnect( struct cli_state ** cli)506 { 507 if ( cli)506 void _System smbwrp_disconnect( Resource* pRes, cli_state * cli) 507 { 508 if (pRes && cli) 508 509 { 509 510 // this call will free all buffers, close handles and free cli mem 510 cli_shutdown(*cli); 511 // set to zero because no longer valid 512 *cli = 0; 511 cli_shutdown( cli); 513 512 } 514 513 } … … 933 932 934 933 // =============================DIRECTORY ROUTINES============================ 935 934 936 935 /***************************************************** 937 936 add a entry to a directory listing … … 942 941 { 943 942 filelist_state * st = (filelist_state *)state; 944 if (st->add_dir_entry) 945 { 946 debuglocal(8,"adding <%s> %d %d\n", finfo->fname, sizeof(st->finfo), st->datalen); 947 memcpy(&st->finfo, finfo, sizeof(st->finfo)); 948 st->add_dir_entry(state); 949 } 950 } 951 } 952 953 #if 0 954 static void smbwrp_dir_add_old(struct file_info *finfo, const char *mask, void *state) 955 { 956 if (state && finfo) 957 { 958 filelist_state * st = (filelist_state *)state; 959 if (st->add_dir_entry) 960 { 961 strncpy(st->finfo.fname, finfo->name, sizeof(st->finfo.fname) - 1); 962 st->finfo.size = finfo->size; 963 st->finfo.easize = -1; 964 st->finfo.attr = finfo->mode; 965 st->finfo.ctime = finfo->ctime_ts.tv_sec - get_time_zone(finfo->ctime_ts.tv_sec); 966 st->finfo.mtime = finfo->mtime_ts.tv_sec - get_time_zone(finfo->mtime_ts.tv_sec); 967 st->finfo.atime = finfo->atime_ts.tv_sec - get_time_zone(finfo->atime_ts.tv_sec); 968 st->add_dir_entry(state); 969 } 970 } 971 } 972 #endif 943 char fullname[ _MAX_PATH]; 944 debuglocal(8,"adding <%s> %d %d\n", finfo->fname, sizeof(st->finfo), st->datalen); 945 memcpy(&st->finfo, finfo, sizeof(st->finfo)); 946 StrCpy(fullname, st->dir); 947 StrCat(fullname, finfo->fname); 948 StrCpy(st->finfo.fname, fullname); 949 getfindinfoL( st->pConn, st->plist, &st->finfo, st->ulAttribute, st->dir_mask); 950 } 951 } 973 952 974 953 static void smbwrp_special_add(const char * name, void * state) … … 1470 1449 smbwrp_dir_add, state) < 0) 1471 1450 #endif 1472 { 1451 { 1473 1452 return os2cli_errno(cli); 1474 1453 } 1475 } 1454 } 1476 1455 1477 1456 return 0; … … 1719 1698 return 0; 1720 1699 } 1700 1701 1702 char * getlastslash(char * path) 1703 { 1704 char * p; 1705 if (!path) 1706 { 1707 return NULL; 1708 } 1709 for (p = path + strlen(path) - 1; p >= path; p--) 1710 { 1711 if (*p == '\\' || *p == '/') 1712 { 1713 return p; 1714 } 1715 } 1716 return NULL; 1717 } 1718 -
branches/client-1.5/src/smbwrp.h
r107 r145 94 94 95 95 96 typedef struct filelist_state97 {98 unsigned long pipe;99 char * data;100 int datalen;101 int bufferlen;102 void ( * _System add_dir_entry)(void * st);103 char mask[261];104 smbwrp_fileinfo finfo;105 } filelist_state;106 107 96 #ifndef INCL_DOS 108 97 typedef struct _FSALLOCATE /* fsalloc */ … … 116 105 #endif 117 106 107 typedef struct _Resource 108 { 109 int rootlevel; 110 smbwrp_server srv; 111 char logfile[_MAX_PATH + 1]; 112 char loglevel; 113 int easupport; 114 int krb5support; 115 } Resource; 116 117 typedef struct _Connection 118 { 119 Resource *pRes; 120 cli_state* cli; 121 smbwrp_file file; 122 } Connection; 123 124 125 typedef struct filelist_state 126 { 127 unsigned long pipe; 128 char * data; 129 int datalen; 130 int bufferlen; 131 void ( * _System add_dir_entry)(void * st); 132 char mask[ _MAX_PATH]; 133 char dir[ _MAX_PATH]; 134 char dir_mask[ _MAX_PATH]; 135 smbwrp_fileinfo finfo; 136 Connection* pConn; 137 void *plist; 138 unsigned long ulAttribute; 139 } filelist_state; 118 140 119 141 #pragma pack() … … 121 143 int _System smbwrp_getclisize(void); 122 144 int _System smbwrp_init(void); 123 int _System smbwrp_connect( smbwrp_server * srv, cli_state ** c, int krb5support);124 void _System smbwrp_disconnect( cli_state ** cli);145 int _System smbwrp_connect(Resource * pRes, cli_state **); 146 void _System smbwrp_disconnect(Resource * pRes, cli_state *); 125 147 int _System smbwrp_open(cli_state * cli, smbwrp_file * file); 126 148 int _System smbwrp_read(cli_state * cli, smbwrp_file * file, void *buf, unsigned long count, unsigned long * result);
Note:
See TracChangeset
for help on using the changeset viewer.