1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-10-28 03:27:58 +03:00

o flags.c reads and writes a status bitset

This commit is contained in:
Joe Thornber 2001-12-11 12:18:56 +00:00
parent d96dea9abf
commit 57ba050c58
2 changed files with 143 additions and 1 deletions

View File

@ -4,7 +4,7 @@
* This file is released under the LGPL.
*/
#include "text-rep.h"
#include "import-export.h"
#include "metadata.h"
#include "log.h"
#include "hash.h"

142
lib/format_text/flags.c Normal file
View File

@ -0,0 +1,142 @@
/*
* Copyright (C) 2001 Sistina Software (UK) Limited.
*
* This file is released under the LGPL.
*/
#include "metadata.h"
#include "import-export.h"
/*
* Bitsets held in the 'status' flags get
* converted into arrays of strings.
*/
struct flag {
int mask;
char *description;
};
static struct flag _vg_flags[] = {
{ACTIVE, "ACTIVE"},
{EXPORTED_VG, "EXPORTED"},
{EXTENDABLE_VG, "EXTENDABLE"},
{CLUSTERED, "CLUSTERED"},
{SHARED, "SHARED"},
{0, NULL}
};
static struct flag _pv_flags[] = {
{ACTIVE, "ACTIVE"},
{ALLOCATED_PV, "ALLOCATED"},
{0, NULL}
};
static struct flag _lv_flags[] = {
{ACTIVE, "ACTIVE"},
{READ, "READ"},
{WRITE, "WRITE"},
{ALLOC_SIMPLE, "ALLOC_SIMPLE"},
{ALLOC_STRICT, "ALLOC_STRICT"},
{ALLOC_CONTIGUOUS, "ALLOC_CONTIGUOUS"},
{SNAPSHOT, "SNASHOT"},
{SNAPSHOT_ORG, "SNAPSHOT_ORIGIN"},
{0, NULL}
};
static struct flags *_get_flags(int type)
{
switch (type) {
case VG_FLAGS:
return _vg_flags;
case PV_FLAGS:
return _pv_flags;
case LV_FLAGS:
return _lv_flags;
}
log_err("Unknown flag set requested.");
return NULL;
}
/*
* Converts a bitset to an array of string values,
* using one of the tables defined at the top of
* the file.
*/
int print_flags(uint32_t status, int type, char *buffer, size_t size)
{
int f, first = 1, n;
struct flag *flags;
if (!(flags = _get_flags(type))) {
stack;
return 0;
}
if ((n = snprintf(buffer, size, "[")))
return 0;
size -= n;
for (f = 0; flags[f].mask; f++) {
if (status & flags[f].mask) {
if (!first)
fprintf(fp, ", ");
else
first = 0;
n = snprintf(buffer, size, "\"%s\"", flags[f].name);
if (n < 0)
return 0;
size -= n;
status &= ~flags[f].mask;
}
}
if (snprintf(buffer, size, "]"))
return 0;
if (status)
/* FIXME: agk is this the correct log level ? */
log_print("Not all flags were successfully exported, "
"possible bug.");
return 1;
}
int read_flags(uint32_t *status, int type, struct config_value *cv)
{
int f;
uint32_t s = 0;
struct flag *flags;
if (!(flags = _get_flags(type))) {
stack;
return 0;
}
while (cv) {
if (cv != CFG_STRING) {
log_err("Status value is not a string.");
return 0;
}
for (f = 0; flags[f].description; f++)
if (!strcmp(flags[f].description, cv.v.str)) {
status &= flags[f].mask;
break;
}
if (!flags[f].description) {
log_err("Unknown status flag.");
return 0;
}
cv = cv->next;
}
*status = s;
return 1;
}