#pragma prototyped
#ifndef _PAX_H
#define _PAX_H 1
#include <ast.h>
#include <ls.h>
#include <sig.h>
#include <ftwalk.h>
#include <ctype.h>
#include <ccode.h>
#include <hash.h>
#include <proc.h>
#include <regex.h>
#include <error.h>
#include <times.h>
#include <swap.h>
#include <align.h>
#include <debug.h>
#include <stdarg.h>
#include <sum.h>
#include <tv.h>
#include <fnv.h>
#define header Tarheader_s
#include <tar.h>
#undef header
typedef struct Tarheader_s Tarheader_t;
#include "FEATURE/local"
#define VENDOR "ATT"
#define ID "PAX"
#define VERSION "1"
#define IMPLEMENTATION VENDOR ID VERSION
#define PANIC ERROR_PANIC|ERROR_SOURCE,__FILE__,__LINE__
#define bcount(ap) ((ap)->io->last-(ap)->io->next)
#define bsave(ap) (state.backup=(*(ap)->io),error(-7, "bsave(%s,@%I*d)", ap->name, sizeof(ap->io->count), ap->io->count))
#define tvmtime(t,s) (tvgetmtime(t,s),t)
#define BUFFER_FD_MAX (-2)
#define BUFFER_FD_MIN (-3)
#undef getbuffer
#define getbuffer(n) (((n)>=BUFFER_FD_MIN&&(n)<=BUFFER_FD_MAX)?&state.buffer[BUFFER_FD_MAX-(n)]:(Buffer_t*)0)
#undef setbuffer
#define setbuffer(n) (BUFFER_FD_MAX-(n))
#define HOLE_MIN 1024
#define holeinit(fd) (state.hole=0)
#define holedone(fd) do if(state.hole){lseek(fd,state.hole-1,SEEK_CUR);state.hole=0;write(fd,"",1);} while(0)
#define ropath(p) (p[0]=='.'&&(p[1]==0||p[1]=='.'&&(p[2]==0||p[2]=='.'&&p[3]==0))||p[0]=='-'&&p[1]==0)
#define SECTION_CONTROL 1
#define SECTION_DATA 2
#define SECTION_MAX 3
#define SECTION(p) (p)->section
#define METER_parts 20
#define METER_width (METER_parts + 7)
#define NOW time(NiL)
#define HDR_atime (1<<0)
#define HDR_charset (1<<1)
#define HDR_ctime (1<<2)
#define HDR_gid (1<<3)
#define HDR_gname (1<<4)
#define HDR_linkpath (1<<5)
#define HDR_mtime (1<<6)
#define HDR_path (1<<7)
#define HDR_size (1<<8)
#define HDR_uid (1<<9)
#define HDR_uname (1<<10)
#define FMT_COMPRESS "gzip"
#define FMT_DEFAULT "pax"
#define FMT_DELTA "delta"
#define FMT_IGNORE "ignore"
#define FMT_PATCH "patch"
#define IN PAX_IN
#define OUT PAX_OUT
#define ARCHIVE PAX_ARCHIVE
#define COMPRESS PAX_COMPRESS
#define DELTA PAX_DELTA
#define DELTAIO PAX_DELTAIO
#define DLL PAX_DLL
#define DOS PAX_DOS
#define PSEUDO PAX_PSEUDO
#define COMPRESSED PAX_COMPRESSED
#define CONV PAX_CONV
#define DELTAINFO PAX_DELTAINFO
#define KEEPSIZE PAX_KEEPSIZE
#define LINKTYPE PAX_LINKTYPE
#define NOHARDLINKS PAX_NOHARDLINKS
#define SLASHDIR PAX_SLASHDIR
#define STANDARD PAX_STANDARD
#define SUM PAX_SUM
#define APPEND PAX_APPEND
#define SETIDS (1<<0)
#define INFO_MATCH "*([A-Z0-9!])!!!"
#define INFO_SEP '!'
#define INFO_ORDERED 'O'
#define IDLEN (sizeof(ID)-1)
#define DELTA_94 1
#define DELTA_88 2
#define DELTA_IGNORE 3
#define DELTA_PATCH 4
#define TYPE_COMPRESS 'C'
#define TYPE_DELTA 'D'
#define DELTA_SRC 0
#define DELTA_TAR 1
#define DELTA_DEL 2
#define DELTA_DATA 3
#define DELTA_BIO (1<<2)
#define DELTA_BUFFER (1<<3)
#define DELTA_FD (1<<4)
#define DELTA_HOLE (1<<5)
#define DELTA_OFFSET (1<<6)
#define DELTA_SIZE (1<<7)
#define DELTA_OUTPUT (1<<8)
#define DELTA_TEMP (1<<9)
#define DELTA_FREE (1<<10)
#define DELTA_COUNT (1<<11)
#define DELTA_LIST (1<<12)
#define DELTA_create 'c'
#define DELTA_delete 'd'
#define DELTA_nop 'x'
#define DELTA_pass 'p'
#define DELTA_update 'u'
#define DELTA_verify 'v'
#define DELTA_TRAILER 10
#define DELTA_checksum 'c'
#define DELTA_index 'i'
#define DELTA_trailer 't'
#define DELTA_WINDOW (128*1024L)
#define DELTA_LO(c) ((c)&0xffff)
#define DELTA_HI(c) DELTA_LO(c>>16)
#define HEADER_EXTENDED "@PaxHeaders/%(sequence)s"
#define HEADER_EXTENDED_STD "%(dir)s/PaxHeaders/%(file)s"
#define HEADER_GLOBAL "@PaxGlobals/%(sequence)s"
#define HEADER_GLOBAL_STD "%(tmp)s/GlobalHead/%(entry)s"
#define INVALID_binary 0
#define INVALID_ignore 1
#define INVALID_prompt 2
#define INVALID_translate 3
#define INVALID_UTF8 4
#define NOLINK PAX_NOLINK
#define HARDLINK PAX_HARDLINK
#define SOFTLINK PAX_SOFTLINK
#define BLOCKSIZE PAX_BLOCK
#define IOALIGN ALIGN_BOUND1
#define MINBLOCK 1
#define DEFBLOCKS PAX_DEFBLOCKS
#define DEFBUFFER PAX_DEFBUFFER
#define FILBLOCKS 1024
#define MAXUNREAD (8*BLOCKSIZE)
#define MINID 80
#define MAXID BLOCKSIZE
#define RESETABLE (-1)
#define MAP_INDEX 0x01
typedef int (*Link_f)(const char*, const char*);
typedef int (*Stat_f)(const char*, struct stat*);
struct Archive_s; typedef struct Archive_s Archive_t;
struct File_s; typedef struct File_s File_t;
struct Filter_s; typedef struct Filter_s Filter_t;
struct Format_s; typedef struct Format_s Format_t;
struct List_s; typedef struct List_s List_t;
struct Map_s; typedef struct Map_s Map_t;
struct Member_s; typedef struct Member_s Member_t;
#define _PAX_IO_PRIVATE_ \
char* next; \
char* last; \
char* buffer; \
off_t count; \
off_t expand; \
off_t offset; \
off_t size; \
unsigned int fill; \
int skip; \
int keep; \
int mode; \
int unread; \
unsigned int all:1; \
unsigned int blocked:1; \
unsigned int blok:1; \
unsigned int blokeof:1; \
unsigned int blokflag:1; \
unsigned int empty:1; \
unsigned int seekable:1; \
unsigned int unblocked:1;
typedef struct Buffer_s
{
char* base;
char* next;
char* past;
} Buffer_t;
typedef struct Fileid_s
{
int dev;
int ino;
} Fileid_t;
typedef struct Link_s
{
char* name;
char* checksum;
int namesize;
Fileid_t id;
} Link_t;
#define _PAX_FILE_PRIVATE_ \
Archive_t* ap; \
unsigned long checksum; \
off_t datasize; \
struct \
{ \
int op; \
int same; \
unsigned long checksum; \
unsigned long index; \
Member_t* base; \
} delta; \
int extended; \
int fd; \
char* id; \
char* intermediate; \
int linkpathsize; \
int magic; \
int namesize; \
int perm; \
int type; \
Link_t* link; \
char* uidname; \
char* gidname; \
struct \
{ \
char* partial; \
int blocks; \
int format; \
int section; \
} record; \
unsigned int chmod:1; \
unsigned int longlink:1; \
unsigned int longname:1; \
unsigned int ordered:1; \
unsigned int ro:1; \
unsigned int skip:1;
struct Member_s
{
File_t* info;
Tv_t atime;
Tv_t mtime;
off_t offset;
off_t size;
off_t uncompressed;
short dev;
short ino;
short mode;
unsigned int mark:1;
};
typedef uint32_t Magic_t;
typedef struct Compress_format_s
{
char* variant;
char* undo[2];
char* undotoo[2];
} Compress_format_t;
typedef struct Delta_format_s
{
char* variant;
} Delta_format_t;
struct List_s
{
List_t* next;
void* item;
};
struct Map_s
{
Map_t* next;
regex_t re;
int flags;
};
typedef struct Post_s
{
Tv_t atime;
Tv_t mtime;
int mode;
int uid;
int gid;
unsigned int chmod:1;
} Post_t;
typedef union Integral_u
{
uint32_t l;
uint16_t s[2];
uint8_t c[4];
} Integral_t;
typedef struct Convert_s
{
int on;
unsigned char* f2t;
unsigned char* t2f;
unsigned char* f2a;
unsigned char* t2a;
} Convert_t;
typedef struct Delta_s
{
Archive_t* base;
unsigned long checksum;
int compress;
int epilogue;
int index;
int initialized;
Format_t* format;
char* hdr;
char hdrbuf[64];
int ordered;
off_t size;
Hash_table_t* tab;
int trailer;
char* version;
} Delta_t;
typedef struct Part_s
{
Sfdisc_t disc;
off_t n;
struct State_s* pax;
Archive_t* ap;
Sfio_t* sp;
} Part_t;
struct Filter_s
{
Filter_t* next;
regex_t* re;
char* command;
char** argv;
char** patharg;
};
typedef struct Pattern_s
{
char* pattern;
unsigned char directory;
unsigned char matched;
} Pattern_t;
#define _PAX_ARCHIVE_PRIVATE_ \
unsigned long checksum; \
int checkdelta; \
Format_t* compress; \
Convert_t convert[SECTION_MAX]; \
Delta_t* delta; \
int errors; \
Format_t* expected; \
File_t file; \
File_t* info; \
int locked; \
Bio_t mio; \
unsigned long memsum; \
off_t offset; \
int ordered; \
struct \
{ \
unsigned long checksum; \
unsigned long memsum; \
int warned; \
} old; \
char* package; \
Archive_t* parent; \
int part; \
Part_t* partio; \
struct \
{ \
Paxvalue_t copy; \
Paxvalue_t name; \
Paxvalue_t path; \
Paxvalue_t peek; \
Paxvalue_t prev; \
char temp[PATH_MAX]; \
} path; \
int peek; \
File_t* record; \
int raw; \
int section; \
size_t selected; \
off_t size; \
off_t skip; \
struct stat st; \
int sum; \
int swap; \
int swapio; \
Hash_table_t* tab; \
Bio_t tio; \
struct \
{ \
Sfio_t* extended; \
Sfio_t* global; \
Sfio_t* hdr; \
Sfio_t* key; \
} tmp; \
off_t total; \
char* type; \
off_t uncompressed; \
Hash_table_t* update; \
size_t updated; \
int warnlinkhead;
#define _PAX_PRIVATE_ \
int acctime; \
int append; \
Bio_t backup; \
long blocksize; \
Buffer_t buffer[BUFFER_FD_MAX-BUFFER_FD_MIN+1]; \
struct \
{ \
char* name; \
char* path; \
Sfio_t* sp; \
Sum_t* sum; \
} checksum; \
int chmod; \
int clobber; \
int complete; \
int current; \
struct \
{ \
int bufferindex; \
int buffersize; \
int update; \
} delta; \
int delta2delta; \
int descend; \
char* destination; \
dev_t dev; \
unsigned short devcnt; \
int drop; \
int dropcount; \
int exact; \
char** files; \
struct \
{ \
Filter_t* list; \
Filter_t* last; \
Filter_t* all; \
char* options; \
char* command; \
char* path; \
char* name; \
int line; \
} filter; \
int forceconvert; \
Format_t* format; \
int ftwflags; \
struct \
{ \
char* comment; \
int invalid; \
int linkdata; \
char* listformat; \
char* global; \
char* extended; \
} header; \
off_t hole; \
Archive_t* in; \
unsigned short inocnt; \
struct \
{ \
char* name; \
char* path; \
Sfio_t* sp; \
} install; \
int intermediate; \
int interrupt; \
Link_f linkf; \
Hash_table_t* linktab; \
char* listformat; \
int local; \
struct \
{ \
unsigned char* a2n; \
unsigned char* e2n; \
unsigned char* n2e; \
} map; \
Map_t* maps; \
int matchsense; \
off_t maxout; \
struct \
{ \
Sfio_t* tmp; \
off_t size; \
int fancy; \
int last; \
int on; \
int width; \
} meter; \
int mkdir; \
struct \
{ \
char* magic; \
size_t length; \
size_t fill; \
} mime; \
char* mode; \
int modtime; \
char* mtime; \
int newer; \
int operation; \
Hash_table_t* options; \
int ordered; \
int owner; \
Archive_t* out; \
int pass; \
Pattern_t* pattern; \
Pattern_t* patterns; \
char* peekfile; \
int peeklen; \
char pwd[PATH_MAX]; \
int pwdlen; \
List_t* proc; \
struct \
{ \
int charset; \
int delimiter; \
File_t* file; \
int format; \
char* header; \
int headerlen; \
int line; \
int pad; \
char* pattern; \
int offset; \
long size; \
char* trailer; \
int trailerlen; \
} record; \
int resetacctime; \
Hash_table_t* restore; \
Sfio_t* rtty; \
int scanned; \
size_t selected; \
int setgid; \
int setuid; \
Stat_f statf; \
int sync; \
unsigned long testdate; \
struct \
{ \
char* buffer; \
long buffersize; \
char* delta; \
char* file; \
Sfio_t* fmt; \
Sfio_t* lst; \
Sfio_t* mac; \
Sfio_t* str; \
} tmp; \
int update; \
size_t updated; \
char* usage; \
char volume[64]; \
int warnmkdir; \
int warnlinknum; \
Sfio_t* wtty; \
int yesno;
#define Pax_t State_t
#define Pax_s State_s
#define Paxarchive_t Archive_t
#define Paxarchive_s Archive_s
#define Paxfile_t File_t
#define Paxfile_s File_s
#define Paxformat_t Format_t
#define Paxformat_s Format_s
#define Paxio_t Bio_t
#define Paxio_s Bio_s
#define Paxvalue_t Value_t
#define Paxvalue_s Value_s
#include "paxlib.h"
#include "options.h"
extern char* definput;
extern char* defoutput;
extern char* eomprompt;
extern Format_t* formats;
extern State_t state;
extern int addlink(Archive_t*, File_t*);
extern int apply(Archive_t*, File_t*, Filter_t*);
extern long asc_checksum(char*, int, unsigned long);
extern void backup(Archive_t*);
extern long bblock(int);
extern void bflushin(Archive_t*, int);
extern void bflushout(Archive_t*);
extern char* bget(Archive_t*, off_t, off_t*);
extern void binit(Archive_t*);
extern void bput(Archive_t*, off_t);
extern off_t bread(Archive_t*, void*, off_t, off_t, int);
extern off_t bseek(Archive_t*, off_t, int, int);
extern int bskip(Archive_t*);
extern void bunread(Archive_t*, void*, int);
extern void bwrite(Archive_t*, void*, off_t);
extern int closein(Archive_t*, File_t*, int);
extern int closeout(Archive_t*, File_t*, int);
extern int cmpftw(Ftw_t*, Ftw_t*);
extern void complete(Archive_t*, File_t*, size_t);
extern void convert(Archive_t*, int, int, int);
extern void copy(Archive_t*, int(*)(Ftw_t*));
extern void copyin(Archive_t*);
extern int copyinout(Ftw_t*);
extern int copyout(Ftw_t*);
extern void deltabase(Archive_t*);
extern int deltacheck(Archive_t*, File_t*);
extern void deltadelete(Archive_t*);
extern void deltaout(Archive_t*, Archive_t*, File_t*);
extern void deltapass(Archive_t*, Archive_t*);
extern void deltaset(Archive_t*, char*);
extern void deltaverify(Archive_t*);
extern int dirprefix(char*, char*, int);
extern void filein(Archive_t*, File_t*);
extern void fileout(Archive_t*, File_t*);
extern void fileskip(Archive_t*, File_t*);
extern Filter_t* filter(Archive_t*, File_t*);
extern void finish(int);
extern Archive_t* getarchive(int);
extern void getdeltaheader(Archive_t*, File_t*);
extern void getdeltatrailer(Archive_t*, File_t*);
extern int getepilogue(Archive_t*);
extern int getfile(Archive_t*, File_t*, Ftw_t*);
extern Format_t* getformat(char*, int);
extern int getheader(Archive_t*, File_t*);
extern void getidnames(File_t*);
extern int getprologue(Archive_t*);
extern void gettrailer(Archive_t*, File_t*);
extern ssize_t holewrite(int, void*, size_t);
extern Archive_t* initarchive(const char*, int);
extern void initdelta(Archive_t*, Format_t*);
extern void initfile(Archive_t*, File_t*, struct stat*, char*, int);
extern void initmatch(char**);
extern void interactive(void);
extern void listentry(File_t*);
extern int listprintf(Sfio_t*, Archive_t*, File_t*, const char*);
extern char* map(Archive_t*, char*);
extern int match(char*);
extern void newio(Archive_t*, int, int);
extern Format_t* nextformat(Format_t*);
extern void nospace(void);
extern unsigned long omemsum(const void*, int, unsigned long);
extern int openin(Archive_t*, File_t*);
extern int openout(Archive_t*, File_t*);
extern int paxdelta(Archive_t*, Archive_t*, File_t*, int, ...);
extern void paxinit(Pax_t*, const char*);
extern int portable(Archive_t*, const char*);
extern int prune(Archive_t*, File_t*, struct stat*);
extern void putdeltaheader(Archive_t*, File_t*);
extern void putdeltatrailer(Archive_t*, File_t*);
extern void putepilogue(Archive_t*);
extern int putheader(Archive_t*, File_t*);
extern void putinfo(Archive_t*, char*, unsigned long, unsigned long);
extern void putkey(Archive_t*, Sfio_t*, Option_t*, const char*, Sfulong_t);
extern void putprologue(Archive_t*, int);
extern void puttrailer(Archive_t*, File_t*);
extern char* release(void);
extern int restore(const char*, char*, void*);
extern void seekable(Archive_t*);
extern int selectfile(Archive_t*, File_t*);
extern void setdeltaheader(Archive_t*, File_t*);
extern void setfile(Archive_t*, File_t*);
extern void setidnames(File_t*);
extern void setinfo(Archive_t*, File_t*);
extern void setoptions(char*, size_t, char**, char*, Archive_t*, int);
extern void settime(const char*, Tv_t*, Tv_t*, Tv_t*);
extern char* stash(Value_t*, const char*, size_t);
extern char* strlower(char*);
extern char* strupper(char*);
extern void undoable(Archive_t*, Format_t*);
extern void undos(File_t*);
extern int validout(Archive_t*, File_t*);
extern int verify(Archive_t*, File_t*, char*);
#endif