John asked the other day about using the tar feature in smbclient to
authorAndrew Tridgell <tridge@samba.org>
Thu, 18 Sep 1997 06:52:49 +0000 (06:52 +0000)
committerAndrew Tridgell <tridge@samba.org>
Thu, 18 Sep 1997 06:52:49 +0000 (06:52 +0000)
handle file paths longer than 100 characters (the limit of the normal
tar format).

This patch adds support for producing GNU tar files (which have no
real limit on the path length) in smbclient.

Note that I have only added support for producing GNU tar files, I
haven't added support for accepting them when restoring. I thought I'd
leave that up to John :-)
(This used to be commit d5daf85162e844c9e953cc4dfbb3f1d800747130)

source3/client/clitar.c

index a30f6c2960f98bf7fd4ba92c59dc9c8718afbcb9..344263967fd6ebbff1257f01ee8a5e7f43c2928a 100644 (file)
@@ -90,7 +90,7 @@ static void unfixtarname();
 Write a tar header to buffer
 ****************************************************************************/
 static void writetarheader(int f,  char *aname, int size, time_t mtime,
-                   char *amode)
+                          char *amode)
 {
   union hblock hb;
   int i, chk, l;
@@ -99,10 +99,21 @@ static void writetarheader(int f,  char *aname, int size, time_t mtime,
   memset(hb.dummy, 0, sizeof(hb.dummy));
   
   l=strlen(aname);
-  if (l >= NAMSIZ)
-    {
-      DEBUG(0, ("tar file %s name length exceeds NAMSIZ\n", aname));
-    }
+  if (l >= NAMSIZ) {
+         /* write a GNU tar style long header */
+         char *b;
+         b = (char *)malloc(l+TBLOCK+100);
+         if (!b) {
+                 DEBUG(0,("out of memory\n"));
+                 exit(1);
+         }
+         writetarheader(f, "/./@LongLink", l+1, 0, "     0 \0");
+         memset(b, 0, l+TBLOCK+100);
+         fixtarname(b, aname, l+1);
+         i = strlen(b)+1;
+         dotarbuf(f, b, TBLOCK*((i+(TBLOCK-1)/TBLOCK)));
+         free(b);
+  }
 
   /* use l + 1 to do the null too */
   fixtarname(hb.dbuf.name, aname, (l >= NAMSIZ) ? NAMSIZ : l + 1);
@@ -119,8 +130,13 @@ static void writetarheader(int f,  char *aname, int size, time_t mtime,
   oct_it((long) size, 13, hb.dbuf.size);
   oct_it((long) mtime, 13, hb.dbuf.mtime);
   memcpy(hb.dbuf.chksum, "        ", sizeof(hb.dbuf.chksum));
-  hb.dbuf.linkflag='0';
   memset(hb.dbuf.linkname, 0, NAMSIZ);
+  if (strcmp("/./@LongLink", aname) == 0) {
+         /* we're doing a GNU tar long filename */
+         hb.dbuf.linkflag='L';
+  } else {
+         hb.dbuf.linkflag='0';
+  }
   
   for (chk=0, i=sizeof(hb.dummy), jp=hb.dummy; --i>=0;) chk+=(0xFF & *jp++);