Author: jra
Date: 2004-12-14 00:25:23 +0000 (Tue, 14 Dec 2004)
New Revision: 4187

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=4187

Log:
Fix client  & server to allow 127k READX calls.
Jeremy.

Modified:
   trunk/source/include/client.h
   trunk/source/libsmb/cliconnect.c
   trunk/source/libsmb/clireadwrite.c
   trunk/source/smbd/process.c
   trunk/source/smbd/reply.c


Changeset:
Modified: trunk/source/include/client.h
===================================================================
--- trunk/source/include/client.h       2004-12-14 00:25:11 UTC (rev 4186)
+++ trunk/source/include/client.h       2004-12-14 00:25:23 UTC (rev 4187)
@@ -27,8 +27,8 @@
    overlap on the wire. This size gives us a nice read/write size, which
    will be a multiple of the page size on almost any system */
 #define CLI_BUFFER_SIZE (0xFFFF)
+#define CLI_MAX_LARGE_READX_SIZE (127*1024)
 
-
 /*
  * These definitions depend on smb.h
  */

Modified: trunk/source/libsmb/cliconnect.c
===================================================================
--- trunk/source/libsmb/cliconnect.c    2004-12-14 00:25:11 UTC (rev 4186)
+++ trunk/source/libsmb/cliconnect.c    2004-12-14 00:25:23 UTC (rev 4187)
@@ -151,12 +151,7 @@
        if (cli->use_level_II_oplocks)
                capabilities |= CAP_LEVEL_II_OPLOCKS;
 
-       if (cli->capabilities & CAP_UNICODE)
-               capabilities |= CAP_UNICODE;
-
-       if (cli->capabilities & CAP_LARGE_FILES)
-               capabilities |= CAP_LARGE_FILES;
-
+       capabilities |= (cli->capabilities & 
(CAP_UNICODE|CAP_LARGE_FILES|CAP_LARGE_READX|CAP_LARGE_WRITEX));
        return capabilities;
 }
 
@@ -1134,6 +1129,14 @@
                        cli->sign_info.negotiated_smb_signing = True;
                }
 
+               if (cli->capabilities & (CAP_LARGE_READX|CAP_LARGE_WRITEX)) {
+                       SAFE_FREE(cli->outbuf);
+                       SAFE_FREE(cli->inbuf);
+                       cli->outbuf = (char 
*)SMB_MALLOC(CLI_MAX_LARGE_READX_SIZE+SAFETY_MARGIN);
+                       cli->inbuf = (char 
*)SMB_MALLOC(CLI_MAX_LARGE_READX_SIZE+SAFETY_MARGIN);
+                       cli->bufsize = CLI_MAX_LARGE_READX_SIZE;
+               }
+
        } else if (cli->protocol >= PROTOCOL_LANMAN1) {
                cli->use_spnego = False;
                cli->sec_mode = SVAL(cli->inbuf,smb_vwv1);

Modified: trunk/source/libsmb/clireadwrite.c
===================================================================
--- trunk/source/libsmb/clireadwrite.c  2004-12-14 00:25:11 UTC (rev 4186)
+++ trunk/source/libsmb/clireadwrite.c  2004-12-14 00:25:23 UTC (rev 4187)
@@ -48,6 +48,7 @@
        SIVAL(cli->outbuf,smb_vwv3,offset);
        SSVAL(cli->outbuf,smb_vwv5,size);
        SSVAL(cli->outbuf,smb_vwv6,size);
+       SSVAL(cli->outbuf,smb_vwv7,((size >> 16) & 1));
        SSVAL(cli->outbuf,smb_mid,cli->mid + i);
 
        if (bigoffset)
@@ -75,7 +76,11 @@
         * rounded down to a multiple of 1024.
         */
 
-       readsize = (cli->max_xmit - (smb_size+32)) & ~1023;
+       if (cli->capabilities & CAP_LARGE_READX) {
+               readsize = CLI_MAX_LARGE_READX_SIZE;
+       } else {
+               readsize = (cli->max_xmit - (smb_size+32)) & ~1023;
+       }
 
        while (total < size) {
                readsize = MIN(readsize, size-total);
@@ -117,6 +122,7 @@
                }
 
                size2 = SVAL(cli->inbuf, smb_vwv5);
+               size2 |= (SVAL(cli->inbuf, smb_vwv7) & 1);
 
                if (size2 > readsize) {
                        DEBUG(5,("server returned more than we wanted!\n"));

Modified: trunk/source/smbd/process.c
===================================================================
--- trunk/source/smbd/process.c 2004-12-14 00:25:11 UTC (rev 4186)
+++ trunk/source/smbd/process.c 2004-12-14 00:25:23 UTC (rev 4187)
@@ -1177,8 +1177,7 @@
        int outsize2;
        char inbuf_saved[smb_wct];
        char outbuf_saved[smb_wct];
-       int wct = CVAL(outbuf,smb_wct);
-       int outsize = smb_size + 2*wct + SVAL(outbuf,smb_vwv0+2*wct);
+       int outsize = smb_len(outbuf);
 
        /* maybe its not chained */
        if (smb_com2 == 0xFF) {

Modified: trunk/source/smbd/reply.c
===================================================================
--- trunk/source/smbd/reply.c   2004-12-14 00:25:11 UTC (rev 4186)
+++ trunk/source/smbd/reply.c   2004-12-14 00:25:23 UTC (rev 4187)
@@ -2148,6 +2148,7 @@
                SSVAL(outbuf,smb_vwv2,0xFFFF); /* Remaining - must be -1. */
                SSVAL(outbuf,smb_vwv5,smb_maxcnt);
                SSVAL(outbuf,smb_vwv6,smb_offset(data,outbuf));
+               SSVAL(outbuf,smb_vwv7,((smb_maxcnt >> 16) & 1));
                SSVAL(smb_buf(outbuf),-2,smb_maxcnt);
                SCVAL(outbuf,smb_vwv0,0xFF);
                set_message(outbuf,12,smb_maxcnt,False);
@@ -2196,9 +2197,11 @@
                return(UNIXERROR(ERRDOS,ERRnoaccess));
        }
 
+       set_message(outbuf,12,nread,False);
        SSVAL(outbuf,smb_vwv2,0xFFFF); /* Remaining - must be -1. */
        SSVAL(outbuf,smb_vwv5,nread);
        SSVAL(outbuf,smb_vwv6,smb_offset(data,outbuf));
+       SSVAL(outbuf,smb_vwv7,((nread >> 16) & 1));
        SSVAL(smb_buf(outbuf),-2,nread);
   
        DEBUG( 3, ( "send_file_readX fnum=%d max=%d nread=%d\n",

Reply via email to