/* tar archive format definitions and functions */ #define islink(lf) (isreallink(lf) || issymlink(lf)) #define isreallink(lf) ((lf) == Lflink) #define issymlink(lf) ((lf) == Lfsymlink1 || (lf) == Lfsymlink2) #define HOWMANY(a, size) (((a) + (size) - 1) / (size)) #define ROUNDUP(a, size) (HOWMANY(a, size) * (size)) #define TAPEBLKS(bytes) HOWMANY(bytes, Tblock) enum { Tblock = 512u, Namesz = 100, /* link flags */ Lfplain1 = '\0', Lfplain2 = '0', Lflink, Lfsymlink1, Lfchr, Lfblk, Lfdir, Lffifo, Lfcontig, Lfsymlink2 = 's', }; typedef struct { char name[Namesz]; char mode[8]; char uid[8]; char gid[8]; char size[12]; char mtime[12]; char chksum[8]; char linkflag; char linkname[Namesz]; } Header; typedef union { uchar dummy[Tblock]; Header; } Hblock; /* tarsub.c */ char *thisnm, *lastnm; unsigned checksum(Hblock *hp); int closeout(int outf, char *, int prflag); int getdir(Hblock *, int in, vlong *); ulong otoi(char *s); void newarch(void); uvlong passtar(Hblock *hp, int in, int outf, vlong bytes); void putempty(int out); void readtar(int in, char *buffer, long size); uvlong writetar(int outf, char *buffer, ulong size);