Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

/* 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);