#include <machine/bswap.h>
#ifdef DUMP_LFS
#include <ufs/lfs/lfs.h>
#include <ufs/lfs/lfs_accessors.h>
#endif
#include <ufs/ufs/dinode.h>
#include <protocols/dumprestore.h>
union dinode {
struct ufs1_dinode dp1;
struct ufs2_dinode dp2;
#ifdef DUMP_LFS
struct lfs32_dinode dlp32;
struct lfs64_dinode dlp64;
#endif
};
#define DIP(dp, field) \
(is_ufs2 ? (dp)->dp2.di_##field : (dp)->dp1.di_##field)
#define DIP_SET(dp, field, val) do { \
if (is_ufs2) \
(dp)->dp2.di_##field = (val); \
else \
(dp)->dp1.di_##field = (val); \
} while (0)
struct ufsi {
int64_t ufs_dsize;
int32_t ufs_bsize;
int32_t ufs_bshift;
int32_t ufs_fsize;
int32_t ufs_frag;
int32_t ufs_fsatoda;
int32_t ufs_nindir;
int32_t ufs_inopb;
int32_t ufs_maxsymlinklen;
int32_t ufs_bmask;
int32_t ufs_fmask;
int64_t ufs_qbmask;
int64_t ufs_qfmask;
};
#define fsatoda(u,a) ((a) << (u)->ufs_fsatoda)
#define ufs_fragroundup(u,size) \
(((size) + (u)->ufs_qfmask) & (u)->ufs_fmask)
#define ufs_blkoff(u,loc) \
((loc) & (u)->ufs_qbmask)
#define ufs_dblksize(u,d,b) \
((((b) >= UFS_NDADDR || DIP((d), size) >= ((b)+1) << (u)->ufs_bshift \
? (u)->ufs_bsize \
: (ufs_fragroundup((u), ufs_blkoff(u, DIP((d), size)))))))
extern struct ufsi *ufsib;
extern int mapsize;
extern char *usedinomap;
extern char *dumpdirmap;
extern char *dumpinomap;
#define SETINO(ino, map) \
map[(u_int)((ino) - 1) / NBBY] |= 1 << ((u_int)((ino) - 1) % NBBY)
#define CLRINO(ino, map) \
map[(u_int)((ino) - 1) / NBBY] &= ~(1 << ((u_int)((ino) - 1) % NBBY))
#define TSTINO(ino, map) \
(map[(u_int)((ino) - 1) / NBBY] & (1 << ((u_int)((ino) - 1) % NBBY)))
extern char *disk;
extern char *disk_dev;
extern const char *tape;
extern const char *dumpdates;
extern const char *temp;
extern char lastlevel;
extern char level;
extern int uflag;
extern const char *dumpdev;
extern int eflag;
extern int lflag;
extern int diskfd;
extern int tapefd;
extern int pipeout;
extern int trueinc;
extern ino_t curino;
extern int newtape;
extern u_int64_t tapesize;
extern long tsize;
extern long asize;
extern int etapes;
extern int nonodump;
extern int unlimited;
extern int density;
extern int notify;
extern int timestamp;
extern u_int64_t blockswritten;
extern int tapeno;
extern int is_ufs2;
extern time_t tstart_writing;
extern time_t tstart_volume;
extern int xferrate;
extern char sblock_buf[MAXBSIZE];
extern long dev_bsize;
extern int dev_bshift;
extern int tp_bshift;
extern int needswap;
static inline u_int16_t iswap16(u_int16_t);
static inline u_int32_t iswap32(u_int32_t);
static inline u_int64_t iswap64(u_int64_t);
static inline u_int16_t iswap16(u_int16_t x)
{
if (needswap)
return bswap16(x);
else
return x;
}
static inline u_int32_t iswap32(u_int32_t x)
{
if (needswap)
return bswap32(x);
else
return x;
}
static inline u_int64_t iswap64(u_int64_t x)
{
if (needswap)
return bswap64(x);
else
return x;
}
int fs_read_sblock(char *);
struct ufsi *fs_parametrize(void);
ino_t fs_maxino(void);
void fs_mapinodes(ino_t, u_int64_t *, int *);
void broadcast(const char *);
void lastdump(char);
void msg(const char *, ...) __printflike(1, 2);
void msgtail(const char *, ...) __printflike(1, 2);
int query(const char *);
void quit(const char *, ...) __printflike(1, 2);
void quite(int, const char *, ...) __printflike(2, 3);
time_t do_stats(void);
void statussig(int);
void timeest(void);
time_t unctime(const char *);
union dinode;
int64_t blockest(union dinode *);
void mapfileino(ino_t, u_int64_t *, int *);
int mapfiles(ino_t, u_int64_t *, char *, char * const *);
int mapdirs(ino_t, u_int64_t *);
void blksout32(int32_t *, int, ino_t);
void blksout64(union dinode *, int64_t *, int, ino_t, int);
void dumpino(union dinode *, ino_t);
#ifndef RRESTORE
void dumpmap(char *, int, ino_t);
#endif
void writeheader(ino_t);
void bread(daddr_t, char *, int);
void rawread(daddr_t, char *, int);
void initcache(int, int);
void printcachestats(void);
int alloctape(void);
void close_rewind(void);
void dumpblock(daddr_t, int);
void startnewtape(int);
void trewind(int);
void writerec(const char *, int);
void Exit(int) __dead;
void dumpabort(int);
void getfstab(void);
char *rawname(char *);
union dinode *getino(ino_t);
void *xcalloc(size_t, size_t);
void *xmalloc(size_t);
char *xstrdup(const char *);
#ifdef DUMP_LFS
int lfs_wrap_stop(char *);
void lfs_wrap_go(void);
#endif
#if defined(RDUMP) || defined(RRESTORE)
void rmtclose(void);
int rmthost(const char *);
int rmtopen(const char *, int, int);
int rmtwrite(const char *, int);
int rmtioctl(int, int);
#endif
void interrupt(int);
#define X_FINOK 0
#define X_STARTUP 1
#define X_REWRITE 2
#define X_ABORT 3
#define OPGRENT "operator"
#define DIALUP "ttyd"
struct fstab *fstabsearch(const char *);
struct statvfs *mntinfosearch(const char *key);
#ifndef NAME_MAX
#define NAME_MAX 511
#endif
struct dumpdates {
char dd_name[NAME_MAX+3];
char dd_level;
time_t dd_ddate;
};
extern int nddates;
extern struct dumpdates **ddatev;
void initdumptimes(void);
void getdumptime(void);
void putdumptime(void);
#define ITITERATE(i, ddp) \
if (ddatev != NULL) \
for (ddp = ddatev[i = 0]; i < nddates; ddp = ddatev[++i])
void sig(int signo);
#ifndef _PATH_FSTAB
#define _PATH_FSTAB "/etc/fstab"
#endif