#ifndef _RESTORE_H
#define _RESTORE_H
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <netdb.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <sys/time.h>
#include <sys/vnode.h>
#include <locale.h>
#include <stdlib.h>
#include <sys/fs/ufs_inode.h>
#include <sys/fs/ufs_fs.h>
#include <sys/fs/ufs_fsdir.h>
#include <note.h>
#ifdef __cplusplus
extern "C" {
#endif
#define ROOTINO UFSROOTINO
#define SUPPORTS_MTB_TAPE_FORMAT
#include <protocols/dumprestore.h>
#include <memutils.h>
#include <assert.h>
extern int cvtflag;
extern int bflag;
extern int dflag;
extern int hflag;
extern int mflag;
extern int vflag;
extern int yflag;
extern int paginating;
extern int offline;
extern int autoload;
extern int autoload_tries;
extern int autoload_period;
extern struct byteorder_ctx *byteorder;
extern char *progname;
extern char *dumpmap;
extern char *clrimap;
extern char *c_label;
extern ino_t maxino;
extern long dumpnum;
extern int volno;
extern uint_t ntrec;
extern uint_t saved_ntrec;
extern ssize_t tape_rec_size;
extern time_t dumptime;
extern time_t dumpdate;
extern char command;
extern FILE *terminal;
extern char *tmpdir;
extern char *pager_catenated;
extern char **pager_vector;
extern int pager_len;
extern int inattrspace;
extern int savepwd;
struct entry {
char *e_name;
ushort_t e_namlen;
char e_type;
short e_flags;
ino_t e_ino;
long e_index;
struct entry *e_parent;
struct entry *e_sibling;
struct entry *e_links;
struct entry *e_entries;
struct entry *e_xattrs;
struct entry *e_next;
};
#define LEAF 1
#define NODE 2
#define LINK 4
#define ROOT 8
#define EXTRACT 0x0001
#define NEW 0x0002
#define KEEP 0x0004
#define REMOVED 0x0010
#define TMPNAME 0x0020
#define EXISTED 0x0040
#define XATTR 0x0080
#define XATTRROOT 0x0100
extern struct entry *lookupino(ino_t);
extern struct entry *lookupname(char *);
extern struct entry *addentry(char *, ino_t, int);
extern void deleteino(ino_t);
extern char *myname(struct entry *);
extern void freeentry(struct entry *);
extern void moveentry(struct entry *, char *);
extern char *savename(char *);
extern void freename(char *);
extern void dumpsymtable(char *, int);
extern void initsymtable(char *);
extern void mktempname(struct entry *);
extern char *gentempname(struct entry *);
extern void newnode(struct entry *);
extern void removenode(struct entry *);
extern void removeleaf(struct entry *);
extern ino_t lowerbnd(ino_t);
extern ino_t upperbnd(ino_t);
extern void badentry(struct entry *, char *);
extern char *flagvalues(struct entry *);
extern ino_t dirlookup(char *);
#define NIL ((struct entry *)(0))
#if !defined(DEV_BSIZE)
#define DEV_BSIZE 512
#endif
#define DIRBLKSIZ DEV_BSIZE
typedef struct _rstdirdesc {
int dd_fd;
int dd_refcnt;
off64_t dd_loc;
off64_t dd_size;
char dd_buf[DIRBLKSIZ];
} RST_DIR;
#define HARDLINK 1
#define SYMLINK 2
#define TMPHDR "RSTTMP"
extern struct context {
char *name;
ino_t ino;
struct dinode *dip;
int action;
int ts;
} curfile;
#define USING 1
#define SKIP 2
#define UNKNOWN 3
struct afile {
ino_t fnum;
char *fname;
short fflags;
char ftype;
};
struct arglist {
struct afile *head;
struct afile *last;
struct afile *base;
int nent;
char *cmd;
};
#ifdef __STDC__
extern int mkentry(char *, ino_t, struct arglist *);
extern int expand(char *, int, struct arglist *);
extern ino_t psearch(char *);
extern void metaget(char **data, size_t *size);
extern void metaproc(char *, char *, size_t);
extern long listfile(char *, ino_t, int);
extern long addfile(char *, ino_t, int);
extern long deletefile(char *, ino_t, int);
extern long nodeupdates(char *, ino_t, int);
extern long verifyfile(char *, ino_t, int);
extern void extractdirs(int genmode);
extern void skipdirs(void);
extern void treescan(char *, ino_t, long (*)(char *, ino_t, int));
extern RST_DIR *rst_opendir(char *);
extern void rst_closedir(RST_DIR *);
extern struct direct *rst_readdir(RST_DIR *);
extern void setdirmodes(void);
extern int genliteraldir(char *, ino_t);
extern int inodetype(ino_t);
extern void done(int) __NORETURN;
extern void runcmdshell(void);
extern void canon(char *, char *, size_t);
extern void onintr(int);
extern void removeoldleaves(void);
extern void findunreflinks(void);
extern void removeoldnodes(void);
extern void createleaves(char *);
extern void createfiles(void);
extern void createlinks(void);
extern void checkrestore(void);
extern void setinput(char *, char *);
extern void newtapebuf(size_t);
extern void setup(void);
extern void setupR(void);
extern void getvol(int);
extern void printdumpinfo(void);
extern int extractfile(char *);
extern void skipmaps(void);
extern void skipfile(void);
extern void getfile(void (*)(char *, size_t), void (*)(char *, size_t));
extern void null(char *, size_t);
extern void findtapeblksize(int);
extern void flsht(void);
extern void closemt(int);
extern int readhdr(struct s_spcl *);
extern int gethead(struct s_spcl *);
extern int volnumber(ino_t);
extern void findinode(struct s_spcl *);
extern void pathcheck(char *);
extern void renameit(char *, char *);
extern int linkit(char *, char *, int);
extern int lf_linkit(char *, char *, int);
extern int reply(char *);
extern void panic(const char *, ...);
extern char *lctime(time_t *);
extern int safe_open(int, const char *file, int mode, int perms);
extern FILE *safe_fopen(const char *filename, const char *smode, int perms);
extern void reset_dump(void);
extern void get_next_device(void);
extern void initpagercmd(void);
extern void resolve(char *, int *, char **);
extern int complexcopy(char *, char *, int);
#else
extern int mkentry();
extern int expand();
extern ino_t psearch();
extern void metaget();
extern void metaproc();
extern long listfile();
extern long addfile();
extern long deletefile();
extern long nodeupdates();
extern long verifyfile();
extern void extractdirs();
extern void skipdirs();
extern void treescan();
extern RST_DIR *rst_opendir();
extern void rst_closedir();
extern struct direct *rst_readdir();
extern void setdirmodes();
extern int genliteraldir();
extern int inodetype();
extern void done();
extern void runcmdshell();
extern void canon();
extern void onintr();
extern void removeoldleaves();
extern void findunreflinks();
extern void removeoldnodes();
extern void createleaves();
extern void createfiles();
extern void createlinks();
extern void checkrestore();
extern void setinput();
extern void newtapebuf();
extern void setup();
extern void setupR();
extern void getvol();
extern void printdumpinfo();
extern int extractfile();
extern void skipmaps();
extern void skipfile();
extern void getfile();
extern void null();
extern void findtapeblksize();
extern void flsht();
extern void closemt();
extern int readhdr();
extern int gethead();
extern int volnumber();
extern void findinode();
extern void pathcheck();
extern void renameit();
extern int linkit();
extern int lf_linkit();
extern int reply();
extern void panic();
extern char *lctime();
extern int safe_open();
extern FILE *safe_fopen();
extern void reset_dump();
extern void get_next_device();
extern void initpagercmd();
extern void resolve();
extern int complexcopy();
#endif
#define MWORD(m, i) ((m)[(ino_t)((i)-1)/NBBY])
#define MBIT(i) (1<<((ino_t)((i)-1)%NBBY))
#define BIS(i, w) (MWORD((w), (i)) |= MBIT(i))
#define BIC(i, w) (MWORD((w), (i)) &= ~MBIT(i))
#define BIT(i, w) (MWORD((w), (i)) & MBIT(i))
#define LASTPART(s) {int len = strlen(s)+1;\
while (s[len] != '\0')\
{s += len; len = strlen(s)+1; }\
}
#define MAXCOMPLEXLEN (MAXPATHLEN*2 + 3)
#define d_howmany(x, y) ((x) / (y) + ((x) % (y) != 0))
#define TAPE_FILE 0
#define ARCHIVE_FILE 1
#undef setjmp
#define setjmp(b) sigsetjmp((b), 1)
#define longjmp siglongjmp
#define jmp_buf sigjmp_buf
#define chown lchown
#define TAPE "/dev/rmt/0b"
#define RESTORESYMTABLE "./restoresymtable"
#define dprintf if (dflag) (void) fprintf
#define vprintf if (vflag) (void) fprintf
#define GOOD 1
#define FAIL 0
#define ALLOW_OFFLINE 0
#define FORCE_OFFLINE 1
#define DEF_PAGER "/usr/bin/more"
#ifdef __cplusplus
}
#endif
#endif