xref: /plan9/sys/src/cmd/tarsplit/tar.h (revision ad6ca847b1a6a504acb0003cd6c5c6d92687369b)
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