On 9/3/2010 4:59 PM, Timothy Madden wrote:
> On 02.09.2010 00:35, Charles Wilson wrote:
>> Whoever created that tar file did so on a platform that allows gid_t
>> values of 32bits. New cygwin also allows this. However, old cygwin
>> (like the version MSYS forked from) does not; so, when tar sees a value
>> that requires more than 16 bits, its error checking kicks in when it
>> realizes that it is about to assign that value to a variable that will
>> throw away half the data.
> Your wording kind of implies that tar /cannot/ extract that archive on
> the MinGW platform, because the platform does not support it. Is this
> the case ?
Well, it is reported as a *warning* not an error. So I expect that tar
*is* able to extract the files; it's just noisy about it, and returns a
nonzero error code.
Besides, when you extract as a non-super-user, tar ignores the gid value
specified in the archive anyway; YOUR gid is used. What if you did:
tar ... args ... 2>/dev/null || /bin/true ?
Or, just use the "full" bsdtar program instead, if basic-bsdtar is not
sufficient. As I said, the problem is this: GNU tar stores the gid
information in a gid_t variable (that makes sense, right?). However,
the size of gid_t differs on various platforms, so this means it is
possible to create an archive on a platform that supports large gid_t,
that is...troublesome...on platforms that support only small gid_t.
Tar is no longer part of the posix standard, but the PAX standard
specifies that the gid field is 7 octal digits (null terminated=8
chars). So the largest gid that pax (and, previously, tar) was required
to support is 7777777 octal, or 2097151 -- without using the (pax-only,
not ustar or tar) extended header record. So...the standard doesn't
really require support for really large gid values, and any
implementation that creates archives with them -- like GNU tar -- is
obviously using a "proprietary" extension of the format to do so, and is
inherently not fully portable. :-(
New cygwin = large gid_t
old cygwin (== msys) = small gid_t
bsdtar sidesteps the issue by storing gid information in a 'long long',
not a gid_t.