Changeset 10664


Ignore:
Timestamp:
Jan 27, 2005, 3:32:04 AM (15 years ago)
Author:
landonf (Landon Fuller)
Message:

Add support for the Prefix member of ustar archive file headers (fixes long(er) file name support with BSD tar created archives)

Location:
trunk/dports/sysutils/dpkg
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/dports/sysutils/dpkg/Portfile

    r10630 r10664  
    1 # $Id: Portfile,v 1.21 2005/01/26 00:14:40 landonf Exp $
     1# $Id: Portfile,v 1.22 2005/01/27 03:32:02 landonf Exp $
    22
    33PortSystem 1.0
    44name                    dpkg
    55version                 1.10.25
    6 revision                10
     6revision                11
    77platforms               darwin freebsd
    88categories              sysutils archivers
  • trunk/dports/sysutils/dpkg/files/patch-lib_tarfn.c

    r9756 r10664  
    1 --- lib/tarfn.c.old     Mon Dec 13 16:27:17 2004
    2 +++ lib/tarfn.c Mon Dec 13 16:27:07 2004
    3 @@ -181,7 +181,9 @@
     1--- lib/tarfn.c.orig    Wed Jan 26 18:31:15 2005
     2+++ lib/tarfn.c Wed Jan 26 19:26:19 2005
     3@@ -13,6 +13,9 @@
     4 #include <errno.h>
     5 #include <tarfn.h>
     6 
     7+static const char ustarMagic[] = { 'u', 's', 't', 'a', 'r', '\0', '0', '0', '\0' };
     8+static const char gnutarMagic[] = { 'u', 's', 't', 'a', 'r', ' ', ' ', '\0' };
     9+
     10 struct TarHeader {
     11        char Name[100];
     12        char Mode[8];
     13@@ -23,11 +26,12 @@
     14        char Checksum[8];
     15        char LinkFlag;
     16        char LinkName[100];
     17-       char MagicNumber[8];
     18+       char MagicNumber[8]; /* POSIX: "ustar\000", GNU: "ustar  \0" (blank blank null) */
     19        char UserName[32];
     20        char GroupName[32];
     21        char MajorDevice[8];
     22        char MinorDevice[8];
     23+       char Prefix[155]; /* POSIX ustar header */
     24 };
     25 typedef struct TarHeader       TarHeader;
     26 
     27@@ -74,6 +78,10 @@
     28        struct passwd *         passwd = NULL;
     29        struct group *          group = NULL;
     30        unsigned int            i;
     31+       char                    *prefix, *name, *file;
     32+       size_t                  prefixLen;
     33+       size_t                  nameLen;
     34+       size_t                  fileLen;
     35        long                    sum;
     36        long                    checksum;
     37 
     38@@ -82,7 +90,35 @@
     39        if ( *h->GroupName )
     40                group = getgrnam(h->GroupName);
     41 
     42-       d->Name = StoC(h->Name, sizeof(h->Name));
     43+       /*
     44+        * Is this a ustar archive entry?
     45+        * Is Prefix in use?
     46+        */
     47+       if ((memcmp(h->MagicNumber, ustarMagic, sizeof(h->MagicNumber)) == 0) &&  h->Prefix[0]) {
     48+               prefixLen = strnlen(h->Prefix, sizeof(h->Prefix));
     49+
     50+               prefix = StoC(h->Prefix, prefixLen);
     51+               if (h->Prefix[prefixLen - 1] != '/') {
     52+                       prefixLen++; /* Space for '/' */
     53+                        /* The rest of the code doesn't care if malloc fails, so we won't either */
     54+                       prefix = realloc(prefix, prefixLen + 1); /* prefix + \0 */
     55+                       prefix[prefixLen - 1] = '/';
     56+                       prefix[prefixLen] = '\0';
     57+               }
     58+
     59+               nameLen = strnlen(h->Name, sizeof(h->Name));
     60+               name = StoC(h->Name, nameLen);
     61+
     62+               file = realloc(prefix, prefixLen + nameLen + 1); /* prefix + name + \0 */
     63+               strcat(file, name);
     64+
     65+               free(name);
     66+
     67+               d->Name = file;
     68+       } else {
     69+               d->Name = StoC(h->Name, sizeof(h->Name));
     70+       }
     71+
     72        d->LinkName = StoC(h->LinkName, sizeof(h->LinkName));
     73        d->Mode = (mode_t)OtoL(h->Mode, sizeof(h->Mode));
     74        d->Size = (size_t)OtoL(h->Size, sizeof(h->Size));
     75@@ -181,7 +217,9 @@
    476                        }
    577                        /* Else, Fall Through */
Note: See TracChangeset for help on using the changeset viewer.