restore.h revision 33a5e6b27fde6c2d7434c79c15232c335e18950e
/*
* Copyright (c) 1983 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
/*
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _RESTORE_H
#define _RESTORE_H
#pragma ident "%Z%%M% %I% %E% SMI"
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <netdb.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <locale.h>
#include <stdlib.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>
/*
* Flags
*/
extern int cvtflag; /* convert from old to new tape format */
extern int bflag; /* set input block size */
extern int dflag; /* print out debugging info */
extern int hflag; /* restore heirarchies */
extern int mflag; /* restore by name instead of inode number */
extern int vflag; /* print out actions taken */
extern int yflag; /* always try to recover from tape errors */
extern int paginating; /* paginate bulk interactive output */
extern int offline; /* take tape offline when closing */
extern int autoload; /* wait for tape to autoload; implies offline */
/*
* Global variables
*/
extern int autoload_tries; /* number of times to check on autoload */
extern int autoload_period; /* seconds, tries*period = total wait time */
extern struct byteorder_ctx *byteorder;
extern char *progname; /* our name */
extern char *dumpmap; /* map of inodes on this dump tape */
extern char *clrimap; /* map of inodes to be deleted */
extern char *c_label; /* label we expect to see on the tape */
extern long dumpnum; /* location of the dump on this tape */
extern int volno; /* current volume being read */
extern char command; /* opration being performed */
extern char *tmpdir; /* where to put the rst{dir,mode}... files */
extern char *pager_catenated; /* pager command and args */
extern char **pager_vector; /* pager_catenated split up for execve() */
extern int pager_len; /* # elements in pager_vector; includes NULL */
extern int inattrspace; /* true if currently scanning attribute space */
extern int savepwd; /* this is where restore is running from */
/*
* Each file in the file system is described by one of these entries
* Note that the e_next field is used by the symbol table hash lists
* and then reused by the remove code after the entry is removed from
* the symbol table.
*/
struct entry {
char *e_name; /* the current name of this entry */
char e_type; /* type of this entry, see below */
short e_flags; /* status flags, see below */
long e_index; /* unique index (for dumpped table) */
};
/* types */
/* flags */
/*
* functions defined on entry structs
*/
#ifdef __STDC__
extern struct entry *lookupname(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 removenode(struct entry *);
extern void removeleaf(struct entry *);
extern char *flagvalues(struct entry *);
#else
extern struct entry *lookupname();
extern void deleteino();
extern char *myname();
extern void freeentry();
extern void moveentry();
extern char *savename();
extern void freename();
extern void dumpsymtable();
extern void initsymtable();
extern void mktempname();
extern char *gentempname();
extern void newnode();
extern void removenode();
extern void removeleaf();
extern void badentry();
extern char *flagvalues();
#endif
/*
* Definitions for library routines operating on directories.
* These definitions are used only for reading fake directory
* entries from restore's temporary file "restoresymtable"
* These have little to do with real directory entries.
*/
#if !defined(DEV_BSIZE)
#define DEV_BSIZE 512
#endif
typedef struct _rstdirdesc {
int dd_fd;
int dd_refcnt; /* so rst_{open,close}dir() avoid leaking memory */
} RST_DIR;
/*
* Constants associated with entry structs
*/
#define HARDLINK 1
#define SYMLINK 2
#define TMPHDR "RSTTMP"
/*
* The entry describes the next file available on the tape
*/
struct context {
char *name; /* name of file */
int action; /* action being taken on this file */
int ts; /* TS_* type of tape record */
} curfile;
/* actions */
/*
* Structure and routines associated with listing directories
* and expanding meta-characters in pathnames.
*/
struct afile {
char *fname; /* file name */
short fflags; /* extraction flags, if any */
char ftype; /* file type, e.g. LEAF or NODE */
};
struct arglist {
int nent; /* maximum size of list */
char *cmd; /* the current command */
};
/*
* Other exported routines
*/
#ifdef __STDC__
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 RST_DIR *rst_opendir(char *);
extern void rst_closedir(RST_DIR *);
extern void setdirmodes(void);
extern int genliteraldir(char *, ino_t);
extern void done(int);
extern void runcmdshell(void);
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 findtapeblksize(int);
extern void flsht(void);
extern void closemt(int);
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 *);
/*PRINTFLIKE1*/
extern void panic(const char *, ...);
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 /* !STDC */
extern int mkentry();
extern int expand();
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 /* STDC */
/*
* Useful macros
*/
/*
* Macro used to get to the last segment of a complex string
*/
while (s[len] != '\0')\
}
/*
* Define maximum length of complex string. For now we use
* MAXPATHLEN * 2 since recursion is not (yet) supported.
* (add 3 for the 3 NULL characters in a two-part path)
* Note that each component of a complex string is still
* limited to MAXPATHLEN length.
*/
/*
* Define an overflow-free version of howmany so that we don't
* run into trouble with large files.
*/
#define d_howmany(x, y) ((x) / (y) + ((x) % (y) != 0))
/*
* Defines used by findtapeblksize()
*/
#define TAPE_FILE 0
#define ARCHIVE_FILE 1
#define longjmp siglongjmp
#define jmp_buf sigjmp_buf
/*
* Defaults
*/
#define RESTORESYMTABLE "./restoresymtable"
#define GOOD 1
#define FAIL 0
#define ALLOW_OFFLINE 0
#ifdef __cplusplus
}
#endif
#endif /* _RESTORE_H */