aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBill Kendall <wkendall@sgi.com>2011-08-15 13:55:06 +0000
committerAlex Elder <aelder@sgi.com>2011-08-26 10:15:59 -0500
commit8663c54360f985674c571beb3645252f66ec354b (patch)
treed1a689a008ea19408f1fd1638ed7bd4b2b157a8d
parent7061a25aff6054de63d5254d42f2f0b2350636d1 (diff)
downloadxfsdump-dev-8663c54360f985674c571beb3645252f66ec354b.tar.gz
xfsdump: refactor inventory session creation
Move the inventory session creation out of content_init and into a new function, create_inv_session, in order to simplify restoration of the signal mask. TTY-related signals are blocked prior to calling create_inv_session and restored afterwards. Signed-off-by: Bill Kendall <wkendall@sgi.com> Signed-off-by: Alex Elder <aelder@sgi.com>
-rw-r--r--dump/content.c175
1 files changed, 92 insertions, 83 deletions
diff --git a/dump/content.c b/dump/content.c
index fcc952eb..9905c88f 100644
--- a/dump/content.c
+++ b/dump/content.c
@@ -507,7 +507,13 @@ static quota_info_t quotas[] = {
/* definition of locally defined static functions ****************************/
-
+static bool_t create_inv_session(
+ global_hdr_t *gwhdrtemplatep,
+ uuid_t *fsidp,
+ const char *mntpnt,
+ const char *fsdevice,
+ ix_t subtreecnt,
+ size_t strmix);
bool_t
content_init( intgen_t argc,
@@ -1695,100 +1701,27 @@ baseuuidbypass:
}
/* open the dump inventory and a dump inventory write session
- * if an inventory update is to be done. first create a cleanup
- * handler, to close the inventory on exit.
+ * if an inventory update is to be done.
*/
if ( sc_inv_updatepr ) {
- char *qmntpnt;
- char *qfsdevice;
+ bool_t result;
sigset_t tty_set, orig_set;
- rval = atexit( inv_cleanup );
- ASSERT( ! rval );
- sc_inv_idbtoken = inv_open( ( inv_predicate_t )INV_BY_UUID,
- INV_SEARCH_N_MOD,
- ( void * )&fsid );
- if ( sc_inv_idbtoken == INV_TOKEN_NULL ) {
- return BOOL_FALSE;
- }
- qmntpnt = ( char * )calloc( 1, strlen( gwhdrtemplatep->gh_hostname )
- +
- 1
- +
- strlen( mntpnt )
- +
- 1 );
- ASSERT( qmntpnt );
- ASSERT( strlen( gwhdrtemplatep->gh_hostname ));
- ( void )sprintf( qmntpnt,
- "%s:%s",
- gwhdrtemplatep->gh_hostname,
- mntpnt );
- qfsdevice = ( char * )calloc( 1, strlen( gwhdrtemplatep->gh_hostname )
- +
- 1
- +
- strlen( fsdevice )
- +
- 1 );
- ASSERT( qfsdevice );
- ( void )sprintf( qfsdevice,
- "%s:%s",
- gwhdrtemplatep->gh_hostname,
- fsdevice );
-
- /* hold tty signals while creating a new inventory session
- */
+ /* hold tty signals while creating a new inventory session */
sigemptyset( &tty_set );
sigaddset( &tty_set, SIGINT );
sigaddset( &tty_set, SIGQUIT );
sigaddset( &tty_set, SIGHUP );
sigprocmask( SIG_BLOCK, &tty_set, &orig_set );
- sc_inv_sestoken = inv_writesession_open( sc_inv_idbtoken,
- &fsid,
- &gwhdrtemplatep->gh_dumpid,
- gwhdrtemplatep->gh_dumplabel,
- subtreecnt ? BOOL_TRUE
- : BOOL_FALSE,
- sc_resumepr,
- ( u_char_t )sc_level,
- drivecnt,
- gwhdrtemplatep->gh_timestamp,
- qmntpnt,
- qfsdevice );
- if( sc_inv_sestoken == INV_TOKEN_NULL ) {
- sigprocmask( SIG_SETMASK, &orig_set, NULL );
- return BOOL_FALSE;
- }
-
- /* open an inventory stream for each stream
- */
- sc_inv_stmtokenp = ( inv_stmtoken_t * )calloc( drivecnt,
- sizeof( inv_stmtoken_t ));
- ASSERT( sc_inv_stmtokenp );
- for ( strmix = 0 ; strmix < drivecnt ; strmix++ ) {
- drive_t *drivep = drivepp[ strmix ];
- char *drvpath;
-
- if ( strcmp( drivep->d_pathname, "stdio" )) {
- drvpath = path_reltoabs( drivep->d_pathname,
- homedir );
- } else {
- drvpath = drivep->d_pathname;
- }
- sc_inv_stmtokenp[ strmix ] = inv_stream_open( sc_inv_sestoken,
- drvpath );
- if ( strcmp( drivep->d_pathname, "stdio" )) {
- free( ( void * )drvpath );
- }
- if ( sc_inv_stmtokenp[ strmix ] == INV_TOKEN_NULL ) {
- sigprocmask( SIG_SETMASK, &orig_set, NULL );
- return BOOL_FALSE;
- }
- }
+ result = create_inv_session( gwhdrtemplatep, &fsid, mntpnt,
+ fsdevice, subtreecnt, strmix );
sigprocmask( SIG_SETMASK, &orig_set, NULL );
+
+ if ( !result ) {
+ return BOOL_FALSE;
+ }
}
/* set media change flags to FALSE;
@@ -2012,6 +1945,82 @@ content_statline( char **linespp[ ] )
return statlinecnt;
}
+static bool_t
+create_inv_session(
+ global_hdr_t *gwhdrtemplatep,
+ uuid_t *fsidp,
+ const char *mntpnt,
+ const char *fsdevice,
+ ix_t subtreecnt,
+ size_t strmix)
+{
+ intgen_t rval;
+ char *qmntpnt;
+ char *qfsdevice;
+
+ /* create a cleanup handler to close the inventory on exit. */
+ rval = atexit( inv_cleanup );
+ ASSERT( ! rval );
+
+ sc_inv_idbtoken = inv_open( ( inv_predicate_t )INV_BY_UUID,
+ INV_SEARCH_N_MOD,
+ ( void * )fsidp );
+ if ( sc_inv_idbtoken == INV_TOKEN_NULL ) {
+ return BOOL_FALSE;
+ }
+ qmntpnt = ( char * )calloc( 1, strlen( gwhdrtemplatep->gh_hostname )
+ + 1 + strlen( mntpnt ) + 1 );
+ ASSERT( qmntpnt );
+ ASSERT( strlen( gwhdrtemplatep->gh_hostname ));
+ sprintf( qmntpnt, "%s:%s", gwhdrtemplatep->gh_hostname, mntpnt );
+ qfsdevice = ( char * )calloc( 1, strlen( gwhdrtemplatep->gh_hostname )
+ + 1 + strlen( fsdevice ) + 1 );
+ ASSERT( qfsdevice );
+ sprintf( qfsdevice, "%s:%s", gwhdrtemplatep->gh_hostname, fsdevice );
+
+ sc_inv_sestoken = inv_writesession_open( sc_inv_idbtoken,
+ fsidp,
+ &gwhdrtemplatep->gh_dumpid,
+ gwhdrtemplatep->gh_dumplabel,
+ subtreecnt ? BOOL_TRUE
+ : BOOL_FALSE,
+ sc_resumepr,
+ ( u_char_t )sc_level,
+ drivecnt,
+ gwhdrtemplatep->gh_timestamp,
+ qmntpnt,
+ qfsdevice );
+ if ( sc_inv_sestoken == INV_TOKEN_NULL ) {
+ return BOOL_FALSE;
+ }
+
+ /* open an inventory stream for each stream
+ */
+ sc_inv_stmtokenp = ( inv_stmtoken_t * )
+ calloc( drivecnt, sizeof( inv_stmtoken_t ));
+ ASSERT( sc_inv_stmtokenp );
+ for ( strmix = 0 ; strmix < drivecnt ; strmix++ ) {
+ drive_t *drivep = drivepp[ strmix ];
+ char *drvpath;
+
+ if ( strcmp( drivep->d_pathname, "stdio" )) {
+ drvpath = path_reltoabs( drivep->d_pathname, homedir );
+ } else {
+ drvpath = drivep->d_pathname;
+ }
+ sc_inv_stmtokenp[ strmix ] = inv_stream_open( sc_inv_sestoken,
+ drvpath );
+ if ( strcmp( drivep->d_pathname, "stdio" )) {
+ free( ( void * )drvpath );
+ }
+ if ( sc_inv_stmtokenp[ strmix ] == INV_TOKEN_NULL ) {
+ return BOOL_FALSE;
+ }
+ }
+
+ return BOOL_TRUE;
+}
+
static void
mark_set( drive_t *drivep, xfs_ino_t ino, off64_t offset, int32_t flags )
{