merge from 2.2 fix for smbclient large files
authorHerb Lewis <herb@samba.org>
Thu, 19 Dec 2002 20:23:45 +0000 (20:23 +0000)
committerHerb Lewis <herb@samba.org>
Thu, 19 Dec 2002 20:23:45 +0000 (20:23 +0000)
source/client/clitar.c
source/libsmb/clireadwrite.c

index bf26beb652aa69fcc407ae6f8657561e93fd427d..bf4b6e592ab44495d67c98be87dbcabeb3757902 100644 (file)
@@ -121,11 +121,11 @@ extern int get_total_size;
 static int blocksize=20;
 static int tarhandle;
 
-static void writetarheader(int f,  char *aname, int size, time_t mtime,
+static void writetarheader(int f,  char *aname, SMB_BIG_UINT size, time_t mtime,
                           char *amode, unsigned char ftype);
 static void do_atar(char *rname,char *lname,file_info *finfo1);
 static void do_tar(file_info *finfo);
-static void oct_it(long value, int ndgs, char *p);
+static void oct_it(SMB_BIG_UINT value, int ndgs, char *p);
 static void fixtarname(char *tptr, char *fp, int l);
 static int dotarbuf(int f, char *b, int n);
 static void dozerobuf(int f, int n);
@@ -164,14 +164,14 @@ static char *string_create_s(int size)
 /****************************************************************************
 Write a tar header to buffer
 ****************************************************************************/
-static void writetarheader(int f,  char *aname, int size, time_t mtime,
+static void writetarheader(int f,  char *aname, SMB_BIG_UINT size, time_t mtime,
                           char *amode, unsigned char ftype)
 {
   union hblock hb;
   int i, chk, l;
   char *jp;
 
-  DEBUG(5, ("WriteTarHdr, Type = %c, Size= %i, Name = %s\n", ftype, size, aname));
+  DEBUG(5, ("WriteTarHdr, Type = %c, Size= %.0f, Name = %s\n", ftype, (double)size, aname));
 
   memset(hb.dummy, 0, sizeof(hb.dummy));
   
@@ -203,17 +203,17 @@ static void writetarheader(int f,  char *aname, int size, time_t mtime,
 
   hb.dbuf.name[NAMSIZ-1]='\0';
   safe_strcpy(hb.dbuf.mode, amode, strlen(amode));
-  oct_it(0L, 8, hb.dbuf.uid);
-  oct_it(0L, 8, hb.dbuf.gid);
-  oct_it((long) size, 13, hb.dbuf.size);
-  oct_it((long) mtime, 13, hb.dbuf.mtime);
+  oct_it((SMB_BIG_UINT)0, 8, hb.dbuf.uid);
+  oct_it((SMB_BIG_UINT)0, 8, hb.dbuf.gid);
+  oct_it((SMB_BIG_UINT) size, 13, hb.dbuf.size);
+  oct_it((SMB_BIG_UINT) mtime, 13, hb.dbuf.mtime);
   memcpy(hb.dbuf.chksum, "        ", sizeof(hb.dbuf.chksum));
   memset(hb.dbuf.linkname, 0, NAMSIZ);
   hb.dbuf.linkflag=ftype;
   
   for (chk=0, i=sizeof(hb.dummy), jp=hb.dummy; --i>=0;) chk+=(0xFF & *jp++);
 
-  oct_it((long) chk, 8, hb.dbuf.chksum);
+  oct_it((SMB_BIG_UINT) chk, 8, hb.dbuf.chksum);
   hb.dbuf.chksum[6] = '\0';
 
   (void) dotarbuf(f, hb.dummy, sizeof(hb.dummy));
@@ -427,7 +427,7 @@ static void fixtarname(char *tptr, char *fp, int l)
 /****************************************************************************
 Convert from decimal to octal string
 ****************************************************************************/
-static void oct_it (long value, int ndgs, char *p)
+static void oct_it (SMB_BIG_UINT value, int ndgs, char *p)
 {
   /* Converts long to octal string, pads with leading zeros */
 
@@ -598,7 +598,7 @@ append one remote file to the tar file
 static void do_atar(char *rname,char *lname,file_info *finfo1)
 {
   int fnum;
-  uint32 nread=0;
+  SMB_BIG_UINT nread=0;
   char ftype;
   file_info2 finfo;
   BOOL close_done = False;
@@ -688,9 +688,9 @@ static void do_atar(char *rname,char *lname,file_info *finfo1)
     }
   else
     {
-      DEBUG(3,("getting file %s of size %d bytes as a tar file %s",
+      DEBUG(3,("getting file %s of size %.0f bytes as a tar file %s",
               finfo.name,
-              (int)finfo.size,
+              (double)finfo.size,
               lname));
       
       /* write a tar header, don't bother with mode - just set to 100644 */
@@ -698,7 +698,7 @@ static void do_atar(char *rname,char *lname,file_info *finfo1)
 
       while (nread < finfo.size && !close_done)        {
              
-             DEBUG(3,("nread=%d\n",nread));
+             DEBUG(3,("nread=%.0f\n",(double)nread));
              
              datalen = cli_read(cli, fnum, data, nread, read_size);
              
@@ -715,7 +715,7 @@ static void do_atar(char *rname,char *lname,file_info *finfo1)
 
                  if (nread > finfo.size) {
                        datalen -= nread - finfo.size;
-                       DEBUG(0,("File size change - truncating %s to %d bytes\n", finfo.name, (int)finfo.size));
+                       DEBUG(0,("File size change - truncating %s to %.0f bytes\n", finfo.name, (double)finfo.size));
                  }
 
              /* add received bits of file to buffer - dotarbuf will
@@ -735,7 +735,7 @@ static void do_atar(char *rname,char *lname,file_info *finfo1)
 
       /* pad tar file with zero's if we couldn't get entire file */
       if (nread < finfo.size) {
-             DEBUG(0, ("Didn't get entire file. size=%d, nread=%d\n", (int)finfo.size, (int)nread));
+             DEBUG(0, ("Didn't get entire file. size=%.0f, nread=%d\n", (double)finfo.size, (int)nread));
              if (padit(data, sizeof(data), finfo.size - nread))
                      DEBUG(0,("Error writing tar file - %s\n", strerror(errno)));
       }
@@ -768,8 +768,8 @@ static void do_atar(char *rname,char *lname,file_info *finfo1)
 
       if (tar_noisy)
        {
-         DEBUG(0, ("%10d (%7.1f kb/s) %s\n",
-              (int)finfo.size, finfo.size / MAX(0.001, (1.024*this_time)),
+         DEBUG(0, ("%12.0f (%7.1f kb/s) %s\n",
+              (double)finfo.size, finfo.size / MAX(0.001, (1.024*this_time)),
                finfo.name));
        }
 
index 38e8aac42a5a559c4f327dc7a61cf5c01d6a0576..7780c93cc431bc3925597b382661c4c3fb9ec73a 100644 (file)
@@ -29,10 +29,15 @@ Issue a single SMBread and don't wait for a reply.
 static BOOL cli_issue_read(struct cli_state *cli, int fnum, off_t offset, 
                           size_t size, int i)
 {
+       BOOL bigoffset = False;
+
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(cli->outbuf,10,0,True);
+       if ((SMB_BIG_UINT)offset >> 32) 
+               bigoffset = True;
+
+       set_message(cli->outbuf,bigoffset ? 12 : 10,0,True);
                
        SCVAL(cli->outbuf,smb_com,SMBreadX);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -45,6 +50,9 @@ static BOOL cli_issue_read(struct cli_state *cli, int fnum, off_t offset,
        SSVAL(cli->outbuf,smb_vwv6,size);
        SSVAL(cli->outbuf,smb_mid,cli->mid + i);
 
+       if (bigoffset)
+               SIVAL(cli->outbuf,smb_vwv10,(offset>>32) & 0xffffffff);
+
        return cli_send_smb(cli);
 }