1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00
lvm2/lib/properties/prop_common.c
Tony Asleson 9775a19af1 lib/properties: Common code for handling properties.
The common bits from lib/report/properties.[c|h] have
been moved to lib/properties/prop_common.[c|h] to allow
re-use of property handling functionality without
polluting the report handling functionality.

Signed-off-by: Tony Asleson <tasleson@redhat.com>
2013-07-12 16:52:16 -05:00

93 lines
2.0 KiB
C

/*
* Copyright (C) 2013 Red Hat, Inc. All rights reserved.
*
* 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,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "lib.h"
#include "prop_common.h"
int prop_not_implemented_get(const void *obj, struct lvm_property_type *prop)
{
log_errno(ENOSYS, "Function not implemented");
return 0;
}
int prop_not_implemented_set(void *obj, struct lvm_property_type *prop)
{
log_errno(ENOSYS, "Function not implemented");
return 0;
}
int prop_get_property(struct lvm_property_type *p, const void *obj,
struct lvm_property_type *prop,
unsigned type)
{
while (p->id[0]) {
if (!strcmp(p->id, prop->id))
break;
p++;
}
if (!p->id[0]) {
log_errno(EINVAL, "Invalid property name %s", prop->id);
return 0;
}
if (!(p->type & type)) {
log_errno(EINVAL, "Property name %s does not match type %d",
prop->id, p->type);
return 0;
}
*prop = *p;
if (!p->get(obj, prop)) {
return 0;
}
return 1;
}
int prop_set_property(struct lvm_property_type *p, void *obj,
struct lvm_property_type *prop,
unsigned type)
{
while (p->id[0]) {
if (!strcmp(p->id, prop->id))
break;
p++;
}
if (!p->id[0]) {
log_errno(EINVAL, "Invalid property name %s", prop->id);
return 0;
}
if (!p->is_settable) {
log_errno(EINVAL, "Unable to set read-only property %s",
prop->id);
return 0;
}
if (!(p->type & type)) {
log_errno(EINVAL, "Property name %s does not match type %d",
prop->id, p->type);
return 0;
}
if (p->is_string)
p->value.string = prop->value.string;
else
p->value.integer = prop->value.integer;
if (!p->set(obj, p)) {
return 0;
}
return 1;
}