blob: f9fcb1965c578b01b78a16514a626f56ae96a129 [file] [log] [blame]
/*
* Copyright (c) 2000-2001 Silicon Graphics, Inc.
* All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it would be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef INVENTORY_H
#define INVENTORY_H
/* abstract interface to the inventory sub system of xfsdump
*
* the inventory contains a description of every xfsdump ever
* done, unless explicitly deleted. It provides simple and specific
* storage and query facilities.
*
* This was not an attempt to write a generic database. The inventory does have
* knowledge of the functionalities, some abstractions, and even typical queries
* of dump() and restore() and uses this knowledge in formulating its storage
* structure on disk. All these things, of course, are completely abstract with
* respect to the clients of the inventory.
*
*/
#define INV_DIRPATH inv_dirpath()
#define INV_TOKEN_NULL NULL
#define INV_FSTAB inv_fstab()
#define INV_INVINDEX_PREFIX ".InvIndex"
#define INV_STOBJ_PREFIX ".StObj"
#define INV_STRLEN 128 /* length of labels, mntpts, etc */
/*----------------------------------------------------------------------*/
/* */
/* */
/* Users are first supposed to call inventory_open() specifying what */
/* type of handle s/he would like to supply. This can be BY_MOUNTPT, */
/* BY_DEVPATH, or BY_UUID. The inventory maintains its own table of file*/
/* systems and their uuids, mountpts, and device paths. (XXX host). */
/* The current implementation requires that a uuid be present for all */
/* its fs table entries. However, once the entry is there, caller can */
/* query by any of the other handles. */
/* */
/* For a read-session, ie. just querying, like in restore(), the token */
/* from inventory_open() must always be passed. */
/* */
/* This inventory has a hierarchical token scheme. */
/* For write-sessions, the caller should obtain a session_token */
/* by calling inventory_session_open() with the original token. */
/* In order to start writing media files, the caller must */
/* then obtain a stream_token via inventory_stream_open() using that */
/* session_token. */
/* */
/* Once, done, stream_close(), session_close() and inventory_close() */
/* must be called in that order. */
/* */
/*----------------------------------------------------------------------*/
/* Caller can open the inventory by any of these handles */
typedef enum {
INV_BY_UUID,
INV_BY_MOUNTPT,
INV_BY_DEVPATH
} inv_predicate_t;
typedef struct inv_stream {
bool_t st_interrupted; /* was this stream interrupted ? */
/* duplicate info from mediafiles for speed */
xfs_ino_t st_startino; /* the starting pt */
off64_t st_startino_off;
xfs_ino_t st_endino; /* where we actually ended up. this means
we've written upto but not including
this breakpoint. */
off64_t st_endino_off;
int st_nmediafiles; /* number of mediafiles */
} inv_stream_t;
/*
* inventory_session_t
* all the information that is kept on a single dump session of a single
* file system in the inventory.
*
*/
typedef struct inv_session {
uuid_t s_fsid; /* file system */
uuid_t s_sesid; /* this dump session's id: 16 bytes*/
uint s_nstreams; /* number of media streams recorded */
inv_stream_t *s_streams; /* array of streams */
time32_t s_time; /* time of the dump */
u_char s_level; /* dump level */
char s_label[INV_STRLEN]; /* session label, assigned by the
operator */
char s_mountpt[INV_STRLEN];/* path to the mount point */
char s_devpath[INV_STRLEN];/* path to the device */
} inv_session_t;
/* Is there anything else that you need here, Chuck? */
typedef struct inv_mediafile {
uuid_t m_moid; /* media object id */
xfs_ino_t m_startino; /* file that we started out with */
off64_t m_startino_off;
xfs_ino_t m_endino; /* the dump file we ended this .. */
off64_t m_endino_off; /* .. media file with. */
char m_label[INV_STRLEN]; /* media file label */
} inv_mediafile_t;
/* the list of inos returned by inv_get_inolist() */
typedef struct inolist {
xfs_ino_t i_ino;
struct inolist *i_next; /* NULL if last element */
} inv_inolist_t;
struct invt_desc_entry;
struct invt_sesdesc_entry;
struct invt_strdesc_entry;
/* The three kinds of access tokens for the inventory */
typedef struct invt_desc_entry *inv_idbtoken_t;
typedef struct invt_sesdesc_entry *inv_sestoken_t;
typedef struct invt_strdesc_entry *inv_stmtoken_t;
/* inventory_open - initializes access to the inventory
*/
extern inv_idbtoken_t
inv_open(
inv_predicate_t bywhat, /* BY_UUID, BY_MOUNTPT, BY_DEVPATH */
void *pred );/* uuid_t *,char * mntpt, or char *dev */
extern bool_t
inv_close(
inv_idbtoken_t tok );
extern inv_sestoken_t
inv_writesession_open(
inv_idbtoken_t tok, /* token obtained by inventory_init() */
uuid_t *fsid,
uuid_t *sesid,
char *label,
u_char level,
uint nstreams,
time32_t time,
char *mntpt,
char *devpath );
extern bool_t
inv_writesession_close(
inv_sestoken_t tok );
extern inv_stmtoken_t
inv_stream_open(
inv_sestoken_t tok );
extern bool_t
inv_stream_close(
inv_stmtoken_t tok,
bool_t wasinterrupted );
extern bool_t
inv_put_mediafile(
inv_stmtoken_t tok,
uuid_t *moid,
char *label,
xfs_ino_t startino,
off64_t startino_offset,
xfs_ino_t endino,
off64_t endino_offset );
/* lasttime_level_lessthan - finds the time of the last dump of the
* specified file system at a level less than the specified level.
* if never dumped below the current level, *time is set to NULL.
*
*/
extern bool_t
inv_lasttime_level_lessthan(
inv_idbtoken_t tok,
u_char level,
time32_t **time );/* out */
extern bool_t
inv_lastsession_level_lessthan(
inv_idbtoken_t tok,
u_char level,
inv_session_t **ses );/* out */
extern bool_t
inv_lastsession_level_equalto(
inv_idbtoken_t tok,
u_char level,
inv_session_t **ses );/* out */
extern bool_t
inv_get_inolist(
inv_inolist_t **inolist );
/* For dumping the inventory once a dump is done. */
extern bool_t
inv_get_session(
inv_sestoken_t tok,
void **bufpp, /* out */
size_t *bufszp ); /* out */
/* To reconstruct a compelete inventory from dumped inventories */
extern bool_t
inv_put_session(
inv_idbtoken_t tok,
void *bufp,
size_t bufsz );
#ifdef DEBUG
bool_t
inv_DEBUG_printallsessions(
inv_idbtoken_t tok,
inv_session_t **ses );
#endif /* ifdef DEBUG */
extern int
inv_setup_base( void );
extern char *
inv_dirpath( void );
extern char *
inv_fstab( void );
extern char *
inv_lockfile( void );
#endif /* INVENTORY_H */