/* *Printanumericfieldinatarheader.Thefieldstartsat*sandisof *lengthlen;valisthevaluetobewritten. * *PerPOSIX,thewaytowriteanumberisinoctalwithleadingzeroesand *onetrailingspace(orNUL,butweusespace)attheendofthespecified *fieldwidth. * *However,thegivenvaluemaynotfitintheavailablespaceinoctalform. *Ifthat'strue,weusetheGNUextensionofwriting\200followedbythe *numberinbase-256form(ie,storedinbinaryMSB-first).(Note:herewe *supportonlynon-negativenumbers,sowedon'tworryabouttheGNUrules *forhandlingnegativenumbers.)
*/ void
print_tar_number(char *s, int len, uint64 val)
{ if (val < (((uint64) 1) << ((len - 1) * 3)))
{ /* Use octal with trailing space */
s[--len] = ' '; while (len)
{
s[--len] = (val & 7) + '0';
val >>= 3;
}
} else
{ /* Use base-256 with leading \200 */
s[0] = '\200'; while (len > 1)
{
s[--len] = (val & 255);
val >>= 8;
}
}
}
/* *Readanumericfieldinatarheader.Thefieldstartsat*sandisof *lengthlen. * *ThePOSIX-approvedformatforanumberisoctal,endingwithaspaceor *NUL.However,forvaluesthatdon'tfit,werecognizetheGNUextension *of\200followedbythenumberinbase-256form(ie,storedinbinary *MSB-first).(Note:herewesupportonlynon-negativenumbers,sowedon't *worryabouttheGNUrulesforhandlingnegativenumbers.)
*/
uint64
read_tar_number(constchar *s, int len)
{
uint64 result = 0;
if (*s == '\200')
{ /* base-256 */ while (--len)
{
result <<= 8;
result |= (unsignedchar) (*++s);
}
} else
{ /* octal */ while (len-- && *s >= '0' && *s <= '7')
{
result <<= 3;
result |= (*s - '0');
s++;
}
} return result;
}
/* *Calculatethetarchecksumforaheader.Theheaderisassumedtoalways *be512bytes,perthetarstandard.
*/ int
tarChecksum(constchar *header)
{ int i,
sum;
/* *PerPOSIX,thechecksumisthesimplesumofallbytesintheheader, *treatingthebytesasunsigned,andtreatingthechecksumfield(at *offsetTAR_OFFSET_CHECKSUM)asthoughitcontained8spaces.
*/
sum = 8 * ' '; /* presumed value for checksum field */ for (i = 0; i < TAR_BLOCK_SIZE; i++) if (i < TAR_OFFSET_CHECKSUM || i >= TAR_OFFSET_CHECKSUM + 8)
sum += 0xFF & header[i]; return sum;
}
/* *Checkvalidityofatarheader(assumedtobe512byteslong). *Weverifythechecksumandthemagicnumber/version.
*/ bool
isValidTarHeader(constchar *header)
{ int sum; int chk = tarChecksum(header);
sum = read_tar_number(&header[TAR_OFFSET_CHECKSUM], 8);
if (sum != chk) returnfalse;
/* POSIX tar format */ if (memcmp(&header[TAR_OFFSET_MAGIC], "ustar\0", 6) == 0 &&
memcmp(&header[TAR_OFFSET_VERSION], "00", 2) == 0) returntrue; /* GNU tar format */ if (memcmp(&header[TAR_OFFSET_MAGIC], "ustar \0", 8) == 0) returntrue; /* not-quite-POSIX format written by pre-9.3 pg_dump */ if (memcmp(&header[TAR_OFFSET_MAGIC], "ustar00\0", 8) == 0) returntrue;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.