2001-12-17 22:46:10 +03:00
/*
* Copyright ( C ) 2001 Sistina Software ( UK ) Limited .
*
* This file is released under the LGPL .
*/
2002-11-18 17:04:08 +03:00
# include "lib.h"
2002-01-11 02:21:07 +03:00
# include "metadata.h"
2001-12-17 22:46:10 +03:00
# include "import-export.h"
2002-01-10 19:48:28 +03:00
# include "pool.h"
2002-11-18 17:04:08 +03:00
# include "display.h"
2002-01-11 14:09:12 +03:00
# include "hash.h"
2002-02-11 23:50:53 +03:00
# include "toolcontext.h"
2002-11-18 17:04:08 +03:00
# include "cache.h"
/* FIXME Use tidier inclusion method */
static struct text_vg_version_ops * ( _text_vsn_list [ 2 ] ) ;
struct volume_group * text_vg_import_fd ( struct format_instance * fid ,
const char * file ,
int fd ,
off_t offset , uint32_t size ,
off_t offset2 , uint32_t size2 ,
checksum_fn_t checksum_fn ,
uint32_t checksum ,
time_t * when , char * * desc )
2002-01-10 14:18:08 +03:00
{
2002-11-18 17:04:08 +03:00
struct volume_group * vg = NULL ;
struct config_tree * cf ;
struct text_vg_version_ops * * vsn ;
2002-01-10 14:18:08 +03:00
2002-11-18 17:04:08 +03:00
static int _initialised = 0 ;
2002-01-10 14:18:08 +03:00
2002-11-18 17:04:08 +03:00
if ( ! _initialised ) {
_text_vsn_list [ 0 ] = text_vg_vsn1_init ( ) ;
_text_vsn_list [ 1 ] = NULL ;
_initialised = 1 ;
2002-01-10 14:18:08 +03:00
}
2002-11-18 17:04:08 +03:00
* desc = NULL ;
* when = 0 ;
2002-01-10 19:48:28 +03:00
2002-11-18 17:04:08 +03:00
if ( ! ( cf = create_config_tree ( ) ) ) {
2002-01-10 14:18:08 +03:00
stack ;
2002-11-18 17:04:08 +03:00
goto out ;
2002-01-10 14:18:08 +03:00
}
2002-11-18 17:04:08 +03:00
if ( ( fd = = - 1 & & ! read_config_file ( cf , file ) ) | |
( fd ! = - 1 & & ! read_config_fd ( cf , fd , file , offset , size ,
offset2 , size2 , checksum_fn ,
checksum ) ) ) {
log_error ( " Couldn't read volume group metadata. " ) ;
goto out ;
2002-02-01 20:54:39 +03:00
}
2002-11-18 17:04:08 +03:00
/*
* Find a set of version functions that can read this file
2002-07-11 18:21:49 +04:00
*/
2002-11-18 17:04:08 +03:00
for ( vsn = & _text_vsn_list [ 0 ] ; * vsn ; vsn + + ) {
if ( ! ( * vsn ) - > check_version ( cf ) )
continue ;
2002-02-13 16:29:16 +03:00
2002-11-18 17:04:08 +03:00
if ( ! ( vg = ( * vsn ) - > read_vg ( fid , cf ) ) ) {
2002-01-10 14:18:08 +03:00
stack ;
2002-11-18 17:04:08 +03:00
goto out ;
2002-01-10 14:18:08 +03:00
}
2001-12-17 22:46:10 +03:00
2002-11-18 17:04:08 +03:00
( * vsn ) - > read_desc ( fid - > fmt - > cmd - > mem , cf , when , desc ) ;
break ;
2001-12-17 22:46:10 +03:00
}
2002-04-24 22:20:51 +04:00
2002-11-18 17:04:08 +03:00
out :
destroy_config_tree ( cf ) ;
2002-01-10 14:18:08 +03:00
return vg ;
2001-12-17 22:46:10 +03:00
}
2002-11-18 17:04:08 +03:00
struct volume_group * text_vg_import_file ( struct format_instance * fid ,
const char * file ,
time_t * when , char * * desc )
2002-02-11 14:43:17 +03:00
{
2002-11-18 17:04:08 +03:00
return text_vg_import_fd ( fid , file , - 1 , 0 , 0 , 0 , 0 , NULL , 0 ,
when , desc ) ;
2001-12-17 22:46:10 +03:00
}