2010-02-24 21:16:54 +03:00
/*
2013-07-13 00:40:10 +04:00
* Copyright ( C ) 2008 - 2013 Red Hat , Inc . All rights reserved .
2010-02-24 21:16:54 +03:00
*
* This file is part of LVM2 .
*
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v .2 .1 .
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program ; if not , write to the Free Software Foundation ,
2016-01-21 13:49:46 +03:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
2010-02-24 21:16:54 +03:00
*/
2018-05-14 12:30:20 +03:00
# include "lib/misc/lib.h"
# include "lib/report/properties.h"
2010-12-15 02:20:58 +03:00
# include "lvm_misc.h"
2018-05-14 12:30:20 +03:00
# include "liblvm/lvm2app.h"
2013-07-13 00:40:10 +04:00
# include "lvm_prop.h"
2010-02-24 21:16:54 +03:00
struct dm_list * tag_list_copy ( struct dm_pool * p , struct dm_list * tag_list )
{
struct dm_list * list ;
lvm_str_list_t * lsl ;
2014-05-29 11:41:03 +04:00
struct dm_str_list * sl ;
2010-02-24 21:16:54 +03:00
if ( ! ( list = dm_pool_zalloc ( p , sizeof ( * list ) ) ) ) {
log_errno ( ENOMEM , " Memory allocation fail for dm_list. " ) ;
return NULL ;
}
dm_list_init ( list ) ;
dm_list_iterate_items ( sl , tag_list ) {
if ( ! ( lsl = dm_pool_zalloc ( p , sizeof ( * lsl ) ) ) ) {
log_errno ( ENOMEM ,
" Memory allocation fail for lvm_lv_list. " ) ;
return NULL ;
}
if ( ! ( lsl - > str = dm_pool_strdup ( p , sl - > str ) ) ) {
log_errno ( ENOMEM ,
" Memory allocation fail for lvm_lv_list->str. " ) ;
return NULL ;
}
dm_list_add ( list , & lsl - > list ) ;
}
return list ;
}
2010-10-25 18:08:43 +04:00
struct lvm_property_value get_property ( const pv_t pv , const vg_t vg ,
2013-07-13 00:40:10 +04:00
const lv_t lv ,
const lvseg_t lvseg ,
const pvseg_t pvseg ,
const struct lvcreate_params * lvcp ,
2013-09-11 03:01:28 +04:00
const struct pvcreate_params * pvcp ,
2013-07-13 00:40:10 +04:00
const char * name )
2010-10-25 18:08:43 +04:00
{
struct lvm_property_type prop ;
2012-06-21 23:19:28 +04:00
struct lvm_property_value v = { 0 } ;
2010-10-25 18:08:43 +04:00
prop . id = name ;
2011-01-10 16:07:58 +03:00
2010-10-25 18:08:43 +04:00
if ( pv ) {
2011-01-10 16:07:58 +03:00
if ( ! pv_get_property ( pv , & prop ) )
2010-10-25 18:08:43 +04:00
return v ;
} else if ( vg ) {
2011-01-10 16:07:58 +03:00
if ( ! vg_get_property ( vg , & prop ) )
2010-10-25 18:08:43 +04:00
return v ;
} else if ( lv ) {
2011-01-10 16:07:58 +03:00
if ( ! lv_get_property ( lv , & prop ) )
2010-10-25 18:08:43 +04:00
return v ;
2010-11-17 23:09:42 +03:00
} else if ( lvseg ) {
2011-01-10 16:07:58 +03:00
if ( ! lvseg_get_property ( lvseg , & prop ) )
2010-11-17 23:09:42 +03:00
return v ;
2010-11-17 23:12:39 +03:00
} else if ( pvseg ) {
2011-01-10 16:07:58 +03:00
if ( ! pvseg_get_property ( pvseg , & prop ) )
2010-11-17 23:12:39 +03:00
return v ;
2013-07-13 00:40:10 +04:00
} else if ( lvcp ) {
if ( ! lv_create_param_get_property ( lvcp , & prop ) )
return v ;
2013-09-11 03:01:28 +04:00
} else if ( pvcp ) {
if ( ! pv_create_param_get_property ( pvcp , & prop ) )
return v ;
2011-01-10 16:07:58 +03:00
} else {
log_errno ( EINVAL , " Invalid NULL handle passed to library function. " ) ;
return v ;
2010-10-25 18:08:43 +04:00
}
2011-01-10 16:07:58 +03:00
2010-10-25 18:08:43 +04:00
v . is_settable = prop . is_settable ;
v . is_string = prop . is_string ;
v . is_integer = prop . is_integer ;
2015-05-04 22:51:41 +03:00
v . is_signed = prop . is_signed ;
2010-10-25 18:08:43 +04:00
if ( v . is_string )
v . value . string = prop . value . string ;
if ( v . is_integer )
v . value . integer = prop . value . integer ;
v . is_valid = 1 ;
return v ;
}
2010-11-17 22:16:05 +03:00
int set_property ( const pv_t pv , const vg_t vg , const lv_t lv ,
2013-07-13 00:40:10 +04:00
struct lvcreate_params * lvcp ,
2013-09-11 03:01:28 +04:00
struct pvcreate_params * pvcp ,
2013-07-13 00:40:10 +04:00
const char * name ,
struct lvm_property_value * v )
2010-11-17 22:16:05 +03:00
{
struct lvm_property_type prop ;
prop . id = name ;
if ( v - > is_string )
prop . value . string = v - > value . string ;
else
prop . value . integer = v - > value . integer ;
if ( pv ) {
if ( ! pv_set_property ( pv , & prop ) ) {
v - > is_valid = 0 ;
return - 1 ;
}
} else if ( vg ) {
if ( ! vg_set_property ( vg , & prop ) ) {
v - > is_valid = 0 ;
return - 1 ;
}
} else if ( lv ) {
if ( ! lv_set_property ( lv , & prop ) ) {
v - > is_valid = 0 ;
return - 1 ;
}
2013-07-13 00:40:10 +04:00
} else if ( lvcp ) {
if ( ! lv_create_param_set_property ( lvcp , & prop ) ) {
v - > is_valid = 0 ;
return - 1 ;
}
2013-09-11 03:01:28 +04:00
} else if ( pvcp ) {
if ( ! pv_create_param_set_property ( pvcp , & prop ) ) {
v - > is_valid = 0 ;
return - 1 ;
}
2013-07-13 00:40:10 +04:00
} else {
return - 1 ;
2010-11-17 22:16:05 +03:00
}
return 0 ;
}
2013-12-18 02:51:11 +04:00
/*
* Store anything that may need to be restored back to the user on library
* call exit . Currently the only thing we are preserving is the users umask .
*/
struct saved_env store_user_env ( struct cmd_context * cmd )
{
struct saved_env env = { 0 } ;
if ( cmd ) {
env . user_umask = umask ( cmd - > default_settings . umask ) ;
} else {
env . user_umask = umask ( 0 ) ;
umask ( env . user_umask ) ;
}
return env ;
}
void restore_user_env ( const struct saved_env * env )
{
if ( env ) {
umask ( env - > user_umask ) ;
}
}