14d2c0504SDavid du Colombier /* tar archive format definitions and functions */ 24d2c0504SDavid du Colombier 34d2c0504SDavid du Colombier #define islink(lf) (isreallink(lf) || issymlink(lf)) 44d2c0504SDavid du Colombier #define isreallink(lf) ((lf) == Lflink) 54d2c0504SDavid du Colombier #define issymlink(lf) ((lf) == Lfsymlink1 || (lf) == Lfsymlink2) 64d2c0504SDavid du Colombier 7*ad6ca847SDavid du Colombier #define HOWMANY(a, size) (((a) + (size) - 1) / (size)) 8*ad6ca847SDavid du Colombier #define ROUNDUP(a, size) (HOWMANY(a, size) * (size)) 9*ad6ca847SDavid du Colombier 10*ad6ca847SDavid du Colombier #define TAPEBLKS(bytes) HOWMANY(bytes, Tblock) 114d2c0504SDavid du Colombier 124d2c0504SDavid du Colombier enum { 134d2c0504SDavid du Colombier Tblock = 512u, 144d2c0504SDavid du Colombier Namesz = 100, 154d2c0504SDavid du Colombier 164d2c0504SDavid du Colombier /* link flags */ 174d2c0504SDavid du Colombier Lfplain1 = '\0', 184d2c0504SDavid du Colombier Lfplain2 = '0', 194d2c0504SDavid du Colombier Lflink, 204d2c0504SDavid du Colombier Lfsymlink1, 214d2c0504SDavid du Colombier Lfchr, 224d2c0504SDavid du Colombier Lfblk, 234d2c0504SDavid du Colombier Lfdir, 244d2c0504SDavid du Colombier Lffifo, 254d2c0504SDavid du Colombier Lfcontig, 264d2c0504SDavid du Colombier Lfsymlink2 = 's', 274d2c0504SDavid du Colombier }; 284d2c0504SDavid du Colombier 294d2c0504SDavid du Colombier typedef struct { 304d2c0504SDavid du Colombier char name[Namesz]; 314d2c0504SDavid du Colombier char mode[8]; 324d2c0504SDavid du Colombier char uid[8]; 334d2c0504SDavid du Colombier char gid[8]; 344d2c0504SDavid du Colombier char size[12]; 354d2c0504SDavid du Colombier char mtime[12]; 364d2c0504SDavid du Colombier char chksum[8]; 374d2c0504SDavid du Colombier char linkflag; 384d2c0504SDavid du Colombier char linkname[Namesz]; 394d2c0504SDavid du Colombier } Header; 404d2c0504SDavid du Colombier 414d2c0504SDavid du Colombier typedef union { 424d2c0504SDavid du Colombier uchar dummy[Tblock]; 434d2c0504SDavid du Colombier Header; 444d2c0504SDavid du Colombier } Hblock; 454d2c0504SDavid du Colombier 464d2c0504SDavid du Colombier /* tarsub.c */ 474d2c0504SDavid du Colombier char *thisnm, *lastnm; 484d2c0504SDavid du Colombier 494d2c0504SDavid du Colombier unsigned checksum(Hblock *hp); 504d2c0504SDavid du Colombier int closeout(int outf, char *, int prflag); 514d2c0504SDavid du Colombier int getdir(Hblock *, int in, vlong *); 524d2c0504SDavid du Colombier ulong otoi(char *s); 534d2c0504SDavid du Colombier void newarch(void); 54*ad6ca847SDavid du Colombier uvlong passtar(Hblock *hp, int in, int outf, vlong bytes); 554d2c0504SDavid du Colombier void putempty(int out); 564d2c0504SDavid du Colombier void readtar(int in, char *buffer, long size); 574d2c0504SDavid du Colombier uvlong writetar(int outf, char *buffer, ulong size); 58