xref: /dflybsd-src/contrib/lvm2/dist/lib/format_text/flags.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
1*86d7f5d3SJohn Marino /*	$NetBSD: flags.c,v 1.1.1.2 2009/12/02 00:26:29 haad Exp $	*/
2*86d7f5d3SJohn Marino 
3*86d7f5d3SJohn Marino /*
4*86d7f5d3SJohn Marino  * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
5*86d7f5d3SJohn Marino  * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
6*86d7f5d3SJohn Marino  *
7*86d7f5d3SJohn Marino  * This file is part of LVM2.
8*86d7f5d3SJohn Marino  *
9*86d7f5d3SJohn Marino  * This copyrighted material is made available to anyone wishing to use,
10*86d7f5d3SJohn Marino  * modify, copy, or redistribute it subject to the terms and conditions
11*86d7f5d3SJohn Marino  * of the GNU Lesser General Public License v.2.1.
12*86d7f5d3SJohn Marino  *
13*86d7f5d3SJohn Marino  * You should have received a copy of the GNU Lesser General Public License
14*86d7f5d3SJohn Marino  * along with this program; if not, write to the Free Software Foundation,
15*86d7f5d3SJohn Marino  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16*86d7f5d3SJohn Marino  */
17*86d7f5d3SJohn Marino 
18*86d7f5d3SJohn Marino #include "lib.h"
19*86d7f5d3SJohn Marino #include "metadata.h"
20*86d7f5d3SJohn Marino #include "import-export.h"
21*86d7f5d3SJohn Marino #include "lvm-string.h"
22*86d7f5d3SJohn Marino 
23*86d7f5d3SJohn Marino /*
24*86d7f5d3SJohn Marino  * Bitsets held in the 'status' flags get
25*86d7f5d3SJohn Marino  * converted into arrays of strings.
26*86d7f5d3SJohn Marino  */
27*86d7f5d3SJohn Marino struct flag {
28*86d7f5d3SJohn Marino 	const int mask;
29*86d7f5d3SJohn Marino 	const char *description;
30*86d7f5d3SJohn Marino 	int kind;
31*86d7f5d3SJohn Marino };
32*86d7f5d3SJohn Marino 
33*86d7f5d3SJohn Marino static struct flag _vg_flags[] = {
34*86d7f5d3SJohn Marino 	{EXPORTED_VG, "EXPORTED", STATUS_FLAG},
35*86d7f5d3SJohn Marino 	{RESIZEABLE_VG, "RESIZEABLE", STATUS_FLAG},
36*86d7f5d3SJohn Marino 	{PVMOVE, "PVMOVE", STATUS_FLAG},
37*86d7f5d3SJohn Marino 	{LVM_READ, "READ", STATUS_FLAG},
38*86d7f5d3SJohn Marino 	{LVM_WRITE, "WRITE", STATUS_FLAG},
39*86d7f5d3SJohn Marino 	{CLUSTERED, "CLUSTERED", STATUS_FLAG},
40*86d7f5d3SJohn Marino 	{SHARED, "SHARED", STATUS_FLAG},
41*86d7f5d3SJohn Marino 	{PARTIAL_VG, NULL, 0},
42*86d7f5d3SJohn Marino 	{PRECOMMITTED, NULL, 0},
43*86d7f5d3SJohn Marino 	{0, NULL, 0}
44*86d7f5d3SJohn Marino };
45*86d7f5d3SJohn Marino 
46*86d7f5d3SJohn Marino static struct flag _pv_flags[] = {
47*86d7f5d3SJohn Marino 	{ALLOCATABLE_PV, "ALLOCATABLE", STATUS_FLAG},
48*86d7f5d3SJohn Marino 	{EXPORTED_VG, "EXPORTED", STATUS_FLAG},
49*86d7f5d3SJohn Marino 	{MISSING_PV, "MISSING", COMPATIBLE_FLAG},
50*86d7f5d3SJohn Marino 	{0, NULL, 0}
51*86d7f5d3SJohn Marino };
52*86d7f5d3SJohn Marino 
53*86d7f5d3SJohn Marino static struct flag _lv_flags[] = {
54*86d7f5d3SJohn Marino 	{LVM_READ, "READ", STATUS_FLAG},
55*86d7f5d3SJohn Marino 	{LVM_WRITE, "WRITE", STATUS_FLAG},
56*86d7f5d3SJohn Marino 	{FIXED_MINOR, "FIXED_MINOR", STATUS_FLAG},
57*86d7f5d3SJohn Marino 	{VISIBLE_LV, "VISIBLE", STATUS_FLAG},
58*86d7f5d3SJohn Marino 	{PVMOVE, "PVMOVE", STATUS_FLAG},
59*86d7f5d3SJohn Marino 	{LOCKED, "LOCKED", STATUS_FLAG},
60*86d7f5d3SJohn Marino 	{MIRROR_NOTSYNCED, "NOTSYNCED", STATUS_FLAG},
61*86d7f5d3SJohn Marino 	{MIRROR_IMAGE, NULL, 0},
62*86d7f5d3SJohn Marino 	{MIRROR_LOG, NULL, 0},
63*86d7f5d3SJohn Marino 	{MIRRORED, NULL, 0},
64*86d7f5d3SJohn Marino 	{VIRTUAL, NULL, 0},
65*86d7f5d3SJohn Marino 	{SNAPSHOT, NULL, 0},
66*86d7f5d3SJohn Marino 	{ACTIVATE_EXCL, NULL, 0},
67*86d7f5d3SJohn Marino 	{CONVERTING, NULL, 0},
68*86d7f5d3SJohn Marino 	{PARTIAL_LV, NULL, 0},
69*86d7f5d3SJohn Marino 	{POSTORDER_FLAG, NULL, 0},
70*86d7f5d3SJohn Marino 	{VIRTUAL_ORIGIN, NULL, 0},
71*86d7f5d3SJohn Marino 	{0, NULL, 0}
72*86d7f5d3SJohn Marino };
73*86d7f5d3SJohn Marino 
_get_flags(int type)74*86d7f5d3SJohn Marino static struct flag *_get_flags(int type)
75*86d7f5d3SJohn Marino {
76*86d7f5d3SJohn Marino 	switch (type & ~STATUS_FLAG) {
77*86d7f5d3SJohn Marino 	case VG_FLAGS:
78*86d7f5d3SJohn Marino 		return _vg_flags;
79*86d7f5d3SJohn Marino 
80*86d7f5d3SJohn Marino 	case PV_FLAGS:
81*86d7f5d3SJohn Marino 		return _pv_flags;
82*86d7f5d3SJohn Marino 
83*86d7f5d3SJohn Marino 	case LV_FLAGS:
84*86d7f5d3SJohn Marino 		return _lv_flags;
85*86d7f5d3SJohn Marino 	}
86*86d7f5d3SJohn Marino 
87*86d7f5d3SJohn Marino 	log_error("Unknown flag set requested.");
88*86d7f5d3SJohn Marino 	return NULL;
89*86d7f5d3SJohn Marino }
90*86d7f5d3SJohn Marino 
91*86d7f5d3SJohn Marino /*
92*86d7f5d3SJohn Marino  * Converts a bitset to an array of string values,
93*86d7f5d3SJohn Marino  * using one of the tables defined at the top of
94*86d7f5d3SJohn Marino  * the file.
95*86d7f5d3SJohn Marino  */
print_flags(uint32_t status,int type,char * buffer,size_t size)96*86d7f5d3SJohn Marino int print_flags(uint32_t status, int type, char *buffer, size_t size)
97*86d7f5d3SJohn Marino {
98*86d7f5d3SJohn Marino 	int f, first = 1;
99*86d7f5d3SJohn Marino 	struct flag *flags;
100*86d7f5d3SJohn Marino 
101*86d7f5d3SJohn Marino 	if (!(flags = _get_flags(type)))
102*86d7f5d3SJohn Marino 		return_0;
103*86d7f5d3SJohn Marino 
104*86d7f5d3SJohn Marino 	if (!emit_to_buffer(&buffer, &size, "["))
105*86d7f5d3SJohn Marino 		return 0;
106*86d7f5d3SJohn Marino 
107*86d7f5d3SJohn Marino 	for (f = 0; flags[f].mask; f++) {
108*86d7f5d3SJohn Marino 		if (status & flags[f].mask) {
109*86d7f5d3SJohn Marino 			status &= ~flags[f].mask;
110*86d7f5d3SJohn Marino 
111*86d7f5d3SJohn Marino 			if ((type & STATUS_FLAG) != flags[f].kind)
112*86d7f5d3SJohn Marino 				continue;
113*86d7f5d3SJohn Marino 
114*86d7f5d3SJohn Marino 			/* Internal-only flag? */
115*86d7f5d3SJohn Marino 			if (!flags[f].description)
116*86d7f5d3SJohn Marino 				continue;
117*86d7f5d3SJohn Marino 
118*86d7f5d3SJohn Marino 			if (!first) {
119*86d7f5d3SJohn Marino 				if (!emit_to_buffer(&buffer, &size, ", "))
120*86d7f5d3SJohn Marino 					return 0;
121*86d7f5d3SJohn Marino 			} else
122*86d7f5d3SJohn Marino 				first = 0;
123*86d7f5d3SJohn Marino 
124*86d7f5d3SJohn Marino 			if (!emit_to_buffer(&buffer, &size, "\"%s\"",
125*86d7f5d3SJohn Marino 			    flags[f].description))
126*86d7f5d3SJohn Marino 				return 0;
127*86d7f5d3SJohn Marino 		}
128*86d7f5d3SJohn Marino 	}
129*86d7f5d3SJohn Marino 
130*86d7f5d3SJohn Marino 	if (!emit_to_buffer(&buffer, &size, "]"))
131*86d7f5d3SJohn Marino 		return 0;
132*86d7f5d3SJohn Marino 
133*86d7f5d3SJohn Marino 	if (status)
134*86d7f5d3SJohn Marino 		log_error("Metadata inconsistency: Not all flags successfully "
135*86d7f5d3SJohn Marino 			  "exported.");
136*86d7f5d3SJohn Marino 
137*86d7f5d3SJohn Marino 	return 1;
138*86d7f5d3SJohn Marino }
139*86d7f5d3SJohn Marino 
read_flags(uint32_t * status,int type,struct config_value * cv)140*86d7f5d3SJohn Marino int read_flags(uint32_t *status, int type, struct config_value *cv)
141*86d7f5d3SJohn Marino {
142*86d7f5d3SJohn Marino 	int f;
143*86d7f5d3SJohn Marino 	uint32_t s = 0;
144*86d7f5d3SJohn Marino 	struct flag *flags;
145*86d7f5d3SJohn Marino 
146*86d7f5d3SJohn Marino 	if (!(flags = _get_flags(type)))
147*86d7f5d3SJohn Marino 		return_0;
148*86d7f5d3SJohn Marino 
149*86d7f5d3SJohn Marino 	if (cv->type == CFG_EMPTY_ARRAY)
150*86d7f5d3SJohn Marino 		goto out;
151*86d7f5d3SJohn Marino 
152*86d7f5d3SJohn Marino 	while (cv) {
153*86d7f5d3SJohn Marino 		if (cv->type != CFG_STRING) {
154*86d7f5d3SJohn Marino 			log_error("Status value is not a string.");
155*86d7f5d3SJohn Marino 			return 0;
156*86d7f5d3SJohn Marino 		}
157*86d7f5d3SJohn Marino 
158*86d7f5d3SJohn Marino 		for (f = 0; flags[f].description; f++)
159*86d7f5d3SJohn Marino 			if (!strcmp(flags[f].description, cv->v.str)) {
160*86d7f5d3SJohn Marino 				s |= flags[f].mask;
161*86d7f5d3SJohn Marino 				break;
162*86d7f5d3SJohn Marino 			}
163*86d7f5d3SJohn Marino 
164*86d7f5d3SJohn Marino 		if (type == VG_FLAGS && !strcmp(cv->v.str, "PARTIAL")) {
165*86d7f5d3SJohn Marino 			/*
166*86d7f5d3SJohn Marino 			 * Exception: We no longer write this flag out, but it
167*86d7f5d3SJohn Marino 			 * might be encountered in old backup files, so restore
168*86d7f5d3SJohn Marino 			 * it in that case. It is never part of live metadata
169*86d7f5d3SJohn Marino 			 * though, so only vgcfgrestore needs to be concerned
170*86d7f5d3SJohn Marino 			 * by this case.
171*86d7f5d3SJohn Marino 			 */
172*86d7f5d3SJohn Marino 			s |= PARTIAL_VG;
173*86d7f5d3SJohn Marino 		} else if (!flags[f].description && (type & STATUS_FLAG)) {
174*86d7f5d3SJohn Marino 			log_error("Unknown status flag '%s'.", cv->v.str);
175*86d7f5d3SJohn Marino 			return 0;
176*86d7f5d3SJohn Marino 		}
177*86d7f5d3SJohn Marino 
178*86d7f5d3SJohn Marino 		cv = cv->next;
179*86d7f5d3SJohn Marino 	}
180*86d7f5d3SJohn Marino 
181*86d7f5d3SJohn Marino       out:
182*86d7f5d3SJohn Marino 	*status |= s;
183*86d7f5d3SJohn Marino 	return 1;
184*86d7f5d3SJohn Marino }
185