1 /* tar archive format definitions and functions */ 2 3 #define islink(lf) (isreallink(lf) || issymlink(lf)) 4 #define isreallink(lf) ((lf) == Lflink) 5 #define issymlink(lf) ((lf) == Lfsymlink1 || (lf) == Lfsymlink2) 6 7 #define HOWMANY(a, size) (((a) + (size) - 1) / (size)) 8 #define ROUNDUP(a, size) (HOWMANY(a, size) * (size)) 9 10 #define TAPEBLKS(bytes) HOWMANY(bytes, Tblock) 11 12 enum { 13 Tblock = 512u, 14 Namesz = 100, 15 16 /* link flags */ 17 Lfplain1 = '\0', 18 Lfplain2 = '0', 19 Lflink, 20 Lfsymlink1, 21 Lfchr, 22 Lfblk, 23 Lfdir, 24 Lffifo, 25 Lfcontig, 26 Lfsymlink2 = 's', 27 }; 28 29 typedef struct { 30 char name[Namesz]; 31 char mode[8]; 32 char uid[8]; 33 char gid[8]; 34 char size[12]; 35 char mtime[12]; 36 char chksum[8]; 37 char linkflag; 38 char linkname[Namesz]; 39 } Header; 40 41 typedef union { 42 uchar dummy[Tblock]; 43 Header; 44 } Hblock; 45 46 /* tarsub.c */ 47 char *thisnm, *lastnm; 48 49 unsigned checksum(Hblock *hp); 50 int closeout(int outf, char *, int prflag); 51 int getdir(Hblock *, int in, vlong *); 52 ulong otoi(char *s); 53 void newarch(void); 54 uvlong passtar(Hblock *hp, int in, int outf, vlong bytes); 55 void putempty(int out); 56 void readtar(int in, char *buffer, long size); 57 uvlong writetar(int outf, char *buffer, ulong size); 58