#ifndef _DUMP_H
#define _DUMP_H
#include <stdio.h>
#include <locale.h>
#include <sys/types.h>
#include <ctype.h>
#include <string.h>
#include <syslog.h>
#include <errno.h>
#include <fcntl.h>
#include <utmpx.h>
#include <signal.h>
#include <stdlib.h>
#include <time.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <sys/vnode.h>
#include <setjmp.h>
#include <sys/mman.h>
#include <assert.h>
#include <dumpusg.h>
#include <kstat.h>
#include <sys/fssnap_if.h>
#include <libgen.h>
#include <limits.h>
#ifdef __cplusplus
extern "C" {
#endif
#define SUPPORTS_MTB_TAPE_FORMAT
#include <protocols/dumprestore.h>
#include <memutils.h>
#include <note.h>
#define NI 16
#define MAXINOPB (MAXBSIZE / sizeof (struct dinode))
#define MAXNINDIR (MAXBSIZE / sizeof (daddr32_t))
#ifndef roundup
#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
#endif
#ifndef MIN
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef MAX
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#endif
#define d_howmany(x, y) ((x) / (y) + ((x) % (y) != 0))
#define MWORD(m, i) (m[(ino_t)(i-1)/NBBY])
#define MBIT(i) ((1<<((ino_t)(i-1)%NBBY))&0xff)
#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))
extern uint_t msiz;
extern uchar_t *clrmap;
extern uchar_t *dirmap;
extern uchar_t *filmap;
extern uchar_t *nodmap;
extern uchar_t *shamap;
extern uchar_t *activemap;
extern char *disk;
extern char *dname;
extern int disk_dynamic;
extern char *tape;
extern char *host;
extern char *dumpdev;
extern char *sdumpdev;
extern char *increm;
extern char *filesystem;
extern char *myname;
extern char lastincno;
extern char incno;
extern char *tlabel;
extern int uflag;
extern int fi;
extern int to;
extern int mapfd;
extern int pipeout;
extern int tapeout;
extern ino_t ino;
extern off_t pos;
extern int leftover;
extern int nsubdir;
extern int newtape;
extern int nadded;
extern int dadded;
extern int density;
extern ulong_t tsize;
extern u_offset_t esize;
extern u_offset_t o_esize;
extern u_offset_t f_esize;
extern uint_t etapes;
extern uint_t ntrec;
extern int tenthsperirg;
extern dev_t partial_dev;
extern pid_t dumppid;
extern int verify;
extern int doingverify;
extern int active;
extern int doingactive;
extern int archive;
extern char *archivefile;
extern int archive_opened;
extern int notify;
extern int diskette;
extern int cartridge;
extern uint_t tracks;
extern int printsize;
extern int offline;
extern int autoload;
extern int autoload_tries;
extern int autoload_period;
extern int doposition;
extern daddr32_t filenum;
extern int dumpstate;
extern int dumptoarchive;
extern int blockswritten;
extern uint_t tapeno;
extern struct fs *sblock;
extern int shortmeta;
extern union u_shadow c_shadow_save[1];
extern time_t *telapsed;
extern time_t *tstart_writing;
extern time_t *tschedule;
extern char *debug_chdir;
#define di_atspare di_ic.ic_atspare
#define di_mtspare di_ic.ic_mtspare
#define di_ctspare di_ic.ic_ctspare
#define HOUR (60L*60L)
#define DAY (24L*HOUR)
#define YEAR (365L*DAY)
#define DS_INIT 0
#define DS_START 1
#define DS_CLRI 2
#define DS_BITS 3
#define DS_DIRS 4
#define DS_FILES 5
#define DS_END 6
#define DS_DONE 7
#define X_FINOK 0
#define X_REWRITE 2
#define X_ABORT 3
#define X_VERIFY 4
#define X_RESTART 5
#define NINCREM "/etc/dumpdates"
#define TAPE "/dev/rmt/0b"
#define OPGRENT "sys"
#define DIALUP "ttyd"
#define DISKETTE "/dev/rfd0c"
#define NBUF 64
#define MAXNTREC 256
struct idates {
char id_name[MAXNAMLEN+3];
char id_incno;
time32_t id_ddate;
};
extern size_t nidates;
extern struct idates **idatev;
#define ITITERATE(i, ip) \
for (i = 0; i < nidates && (ip = idatev[i]) != NULL; i++)
#ifdef __STDC__
extern void mnttabread(void);
extern struct mntent *mnttabsearch(char *, int);
extern void setmnttab(void);
extern struct mntent *getmnttab(void);
extern char *prdate(time_t);
extern void inititimes(void);
extern void getitime(void);
extern void putitime(void);
extern void est(struct dinode *);
extern time32_t is_fssnap_dump(char *);
extern void bmapest(uchar_t *);
extern void getlabel(void);
extern void child_chdir(void);
extern char *unrawname(char *);
extern void sigAbort(int);
extern char *rawname(char *);
extern char *lf_rawname(char *);
extern time32_t timeclock(time32_t);
#ifdef signal
extern void (*nsignal(int, void (*)(int)))(int);
#endif
extern int safe_file_open(const char *file, int mode, int perms);
extern int safe_device_open(const char *file, int mode, int perms);
extern FILE *safe_fopen(const char *filename, const char *smode, int perms);
extern void allocino(void);
extern void freeino(void);
extern void saveino(ino_t, struct dinode *);
extern void resetino(ino_t);
extern long getigen(ino_t);
extern int lf_ismounted(char *, char *);
extern int isoperator(uid_t, gid_t);
extern int lockfs(char *, char *);
extern int openi(ino_t, long, char *);
extern caddr_t mapfile(int, off_t, off_t, int);
extern void unmapfile(void);
extern void stattoi(struct stat *, struct dinode *);
extern void dumpfile(int, caddr_t, off_t, off_t, off_t, int, int);
extern void activepass(void);
extern int query(char *);
extern int query_once(char *, int);
extern void interrupt(int);
extern void broadcast(char *);
extern void timeest(int, int);
extern void msg(const char *, ...);
extern void msgtail(const char *, ...);
extern void lastdump(int);
extern char *getresponse(char *, char *);
extern void alloctape(void);
extern void reset(void);
extern void spclrec(void);
extern void taprec(uchar_t *, int, int);
extern void dmpblk(daddr32_t, size_t, off_t);
extern void toslave(void (*)(ino_t), ino_t);
extern void doinode(ino_t);
extern void dospcl(ino_t);
extern void flushcmds(void);
extern void flusht(void);
extern void nextdevice(void);
extern int isrewind(int);
extern void trewind(void);
extern void close_rewind(void);
extern void changevol(void);
extern void otape(int);
extern void dumpabort(void);
extern void dumpailing(void);
extern void Exit(int);
extern void positiontape(char *);
extern void pass(void (*)(struct dinode *), uchar_t *);
extern void mark(struct dinode *);
extern void active_mark(struct dinode *);
extern void markshad(struct dinode *);
extern void estshad(struct dinode *);
extern void freeshad();
extern void add(struct dinode *);
extern void dirdump(struct dinode *);
extern void dump(struct dinode *);
extern void lf_dump(struct dinode *);
extern void dumpblocks(ino_t);
extern void bitmap(uchar_t *, int);
extern struct dinode *getino(ino_t);
extern void bread(diskaddr_t, uchar_t *, size_t);
extern int hasshortmeta(struct dinode **ip);
extern int lftw(const char *,
int (*)(const char *, const struct stat *, int), int);
extern int lf_lftw(const char *,
int (*)(const char *, const struct stat64 *, int), int);
extern void partial_check(void);
extern void lf_partial_check(void);
extern int partial_mark(int, char **);
extern time_t unctime(char *);
#else
extern void mnttabread();
extern struct mntent *mnttabsearch();
extern void setmnttab();
extern struct mntent *getmnttab();
extern char *prdate();
extern void inititimes();
extern void getitime();
extern void putitime();
extern void est();
extern time32_t is_fssnap_dump();
extern void bmapest();
extern void getlabel();
extern void child_chdir();
extern char *unrawname();
extern void sigAbort();
extern char *rawname();
extern char *lf_rawname();
extern time_t timeclock();
#ifdef signal
extern void nsignal();
#endif
extern int safe_file_open();
extern int safe_device_open();
extern FILE *safe_fopen();
extern void allocino();
extern void freeino();
extern void saveino();
extern void resetino();
extern long getigen();
extern int lf_ismounted();
extern int isoperator();
extern ulong_t lockfs();
extern int openi();
extern caddr_t mapfile();
extern void unmapfile();
extern void stattoi();
extern void dumpfile();
extern void activepass();
extern int query();
extern int query_once();
extern void interrupt();
extern void broadcast();
extern void timeest();
extern void msg();
extern void msgtail();
extern void lastdump();
extern char *getresponse();
extern void alloctape();
extern void reset();
extern void spclrec();
extern void taprec();
extern void dmpblk();
extern void toslave();
extern void doinode();
extern void dospcl();
extern void flushcmds();
extern void flusht();
extern void nextdevice();
extern int isrewind();
extern void trewind();
extern void close_rewind();
extern void changevol();
extern void otape();
extern void dumpabort();
extern void dumpailing();
extern void Exit();
extern void positiontape();
extern void pass();
extern void mark();
extern void active_mark();
extern void markshad();
extern void estshad();
extern void freeshad();
extern void add();
extern void dirdump();
extern void dump();
extern void lf_dump();
extern void dumpblocks();
extern void bitmap();
extern struct dinode *getino();
extern void bread();
extern int hasshortmeta();
extern int lftw();
extern int lf_lftw();
extern void partial_check();
extern void lf_partial_check();
extern int partial_mark();
extern time_t unctime();
#endif
NOTE(ALIGNMENT(mmap, 8))
#ifdef __cplusplus
}
#endif
#endif