xref: /dflybsd-src/contrib/lvm2/dist/test/api/test.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
1*86d7f5d3SJohn Marino /*	$NetBSD: test.c,v 1.1.1.2 2009/12/02 00:26:03 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-2009 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 #include <stdio.h>
18*86d7f5d3SJohn Marino #include <string.h>
19*86d7f5d3SJohn Marino #include <stdlib.h>
20*86d7f5d3SJohn Marino #include <readline/readline.h>
21*86d7f5d3SJohn Marino 
22*86d7f5d3SJohn Marino #include "lvm2app.h"
23*86d7f5d3SJohn Marino 
24*86d7f5d3SJohn Marino #define MAX_ARGS 64
25*86d7f5d3SJohn Marino 
lvm_split(char * str,int * argc,char ** argv,int max)26*86d7f5d3SJohn Marino static int lvm_split(char *str, int *argc, char **argv, int max)
27*86d7f5d3SJohn Marino {
28*86d7f5d3SJohn Marino 	char *b = str, *e;
29*86d7f5d3SJohn Marino 	*argc = 0;
30*86d7f5d3SJohn Marino 
31*86d7f5d3SJohn Marino 	while (*b) {
32*86d7f5d3SJohn Marino 		while (*b && isspace(*b))
33*86d7f5d3SJohn Marino 			b++;
34*86d7f5d3SJohn Marino 
35*86d7f5d3SJohn Marino 		if ((!*b) || ((*argc == 0)&&(*b == '#')))
36*86d7f5d3SJohn Marino 			break;
37*86d7f5d3SJohn Marino 
38*86d7f5d3SJohn Marino 		e = b;
39*86d7f5d3SJohn Marino 		while (*e && !isspace(*e))
40*86d7f5d3SJohn Marino 			e++;
41*86d7f5d3SJohn Marino 
42*86d7f5d3SJohn Marino 		argv[(*argc)++] = b;
43*86d7f5d3SJohn Marino 		if (!*e)
44*86d7f5d3SJohn Marino 			break;
45*86d7f5d3SJohn Marino 		*e++ = '\0';
46*86d7f5d3SJohn Marino 		b = e;
47*86d7f5d3SJohn Marino 		if (*argc == max)
48*86d7f5d3SJohn Marino 			break;
49*86d7f5d3SJohn Marino 	}
50*86d7f5d3SJohn Marino 
51*86d7f5d3SJohn Marino 	return *argc;
52*86d7f5d3SJohn Marino }
53*86d7f5d3SJohn Marino 
_show_help(void)54*86d7f5d3SJohn Marino static void _show_help(void)
55*86d7f5d3SJohn Marino {
56*86d7f5d3SJohn Marino 	printf("'lv_activate vgname lvname: "
57*86d7f5d3SJohn Marino 	       "Activate an LV\n");
58*86d7f5d3SJohn Marino 	printf("'lv_deactivate vgname lvname: "
59*86d7f5d3SJohn Marino 	       "Deactivate an LV\n");
60*86d7f5d3SJohn Marino 	printf("'vg_remove_lv vgname lvname': "
61*86d7f5d3SJohn Marino 	       "Remove a LV\n");
62*86d7f5d3SJohn Marino 	printf("'vg_create_lv_linear vgname lvname size_in_bytes': "
63*86d7f5d3SJohn Marino 	       "Create a linear LV\n");
64*86d7f5d3SJohn Marino 	printf("'scan_vgs': "
65*86d7f5d3SJohn Marino 	       "Scan the system for LVM metadata\n");
66*86d7f5d3SJohn Marino 	printf("'list_vg_names': "
67*86d7f5d3SJohn Marino 	       "List the names of the VGs that exist in the system\n");
68*86d7f5d3SJohn Marino 	printf("'list_vg_ids': "
69*86d7f5d3SJohn Marino 	       "List the uuids of the VGs that exist in the system\n");
70*86d7f5d3SJohn Marino 	printf("'vg_list_pvs vgname': "
71*86d7f5d3SJohn Marino 	       "List the PVs that exist in VG vgname\n");
72*86d7f5d3SJohn Marino 	printf("'vg_list_lvs vgname': "
73*86d7f5d3SJohn Marino 	       "List the LVs that exist in VG vgname\n");
74*86d7f5d3SJohn Marino 	printf("'vgs_open': "
75*86d7f5d3SJohn Marino 	       "List the VGs that are currently open\n");
76*86d7f5d3SJohn Marino 	printf("'vgs': "
77*86d7f5d3SJohn Marino 	       "List all VGs known to the system\n");
78*86d7f5d3SJohn Marino 	printf("'vg_extend vgname device: "
79*86d7f5d3SJohn Marino 	       "Issue a lvm_vg_extend() API call on VG 'vgname'\n");
80*86d7f5d3SJohn Marino 	printf("'vg_reduce vgname device: "
81*86d7f5d3SJohn Marino 	       "Issue a lvm_vg_reduce() API call on VG 'vgname'\n");
82*86d7f5d3SJohn Marino 	printf("'vg_open vgname ['r' | 'w']': "
83*86d7f5d3SJohn Marino 	       "Issue a lvm_vg_open() API call on VG 'vgname'\n");
84*86d7f5d3SJohn Marino 	printf("'vg_close vgname': "
85*86d7f5d3SJohn Marino 	       "Issue a lvm_vg_close() API call on VG 'vgname'\n");
86*86d7f5d3SJohn Marino 	printf("'vg_create vgname: "
87*86d7f5d3SJohn Marino 	       "Issue a lvm_vg_create() to create VG 'vgname'\n");
88*86d7f5d3SJohn Marino 	printf("'vg_remove vgname: "
89*86d7f5d3SJohn Marino 	       "Issue a lvm_vg_remove() to remove VG 'vgname'\n");
90*86d7f5d3SJohn Marino 	printf("'config_reload': "
91*86d7f5d3SJohn Marino 	       "Issue a lvm_config_reload() API to reload LVM config\n");
92*86d7f5d3SJohn Marino 	printf("'config_override' device: "
93*86d7f5d3SJohn Marino 	       "Issue a lvm_config_override() with accept device filter\n");
94*86d7f5d3SJohn Marino 	printf("'quit': exit the program\n");
95*86d7f5d3SJohn Marino }
96*86d7f5d3SJohn Marino 
97*86d7f5d3SJohn Marino static struct dm_hash_table *_vgid_hash = NULL;
98*86d7f5d3SJohn Marino static struct dm_hash_table *_vgname_hash = NULL;
99*86d7f5d3SJohn Marino static struct dm_hash_table *_pvname_hash = NULL;
100*86d7f5d3SJohn Marino static struct dm_hash_table *_lvname_hash = NULL;
101*86d7f5d3SJohn Marino 
_hash_destroy_single(struct dm_hash_table ** htable)102*86d7f5d3SJohn Marino static void _hash_destroy_single(struct dm_hash_table **htable)
103*86d7f5d3SJohn Marino {
104*86d7f5d3SJohn Marino 	if (htable && *htable) {
105*86d7f5d3SJohn Marino 		dm_hash_destroy(*htable);
106*86d7f5d3SJohn Marino 		*htable = NULL;
107*86d7f5d3SJohn Marino 	}
108*86d7f5d3SJohn Marino }
109*86d7f5d3SJohn Marino 
_hash_destroy(void)110*86d7f5d3SJohn Marino static void _hash_destroy(void)
111*86d7f5d3SJohn Marino {
112*86d7f5d3SJohn Marino 	_hash_destroy_single(&_vgname_hash);
113*86d7f5d3SJohn Marino 	_hash_destroy_single(&_vgid_hash);
114*86d7f5d3SJohn Marino 	_hash_destroy_single(&_pvname_hash);
115*86d7f5d3SJohn Marino 	_hash_destroy_single(&_lvname_hash);
116*86d7f5d3SJohn Marino }
117*86d7f5d3SJohn Marino 
_hash_create(void)118*86d7f5d3SJohn Marino static int _hash_create(void)
119*86d7f5d3SJohn Marino {
120*86d7f5d3SJohn Marino 	if (!(_vgname_hash = dm_hash_create(128)))
121*86d7f5d3SJohn Marino 		return 0;
122*86d7f5d3SJohn Marino 	if (!(_pvname_hash = dm_hash_create(128))) {
123*86d7f5d3SJohn Marino 		_hash_destroy_single(&_vgname_hash);
124*86d7f5d3SJohn Marino 		return 0;
125*86d7f5d3SJohn Marino 	}
126*86d7f5d3SJohn Marino 	if (!(_lvname_hash = dm_hash_create(128))) {
127*86d7f5d3SJohn Marino 		_hash_destroy_single(&_vgname_hash);
128*86d7f5d3SJohn Marino 		_hash_destroy_single(&_pvname_hash);
129*86d7f5d3SJohn Marino 		return 0;
130*86d7f5d3SJohn Marino 	}
131*86d7f5d3SJohn Marino 	if (!(_vgid_hash = dm_hash_create(128))) {
132*86d7f5d3SJohn Marino 		_hash_destroy_single(&_vgname_hash);
133*86d7f5d3SJohn Marino 		_hash_destroy_single(&_pvname_hash);
134*86d7f5d3SJohn Marino 		_hash_destroy_single(&_lvname_hash);
135*86d7f5d3SJohn Marino 		return 0;
136*86d7f5d3SJohn Marino 	}
137*86d7f5d3SJohn Marino 	return 1;
138*86d7f5d3SJohn Marino }
139*86d7f5d3SJohn Marino 
140*86d7f5d3SJohn Marino /* FIXME: this should be per vg */
_lookup_lv_by_name(const char * name)141*86d7f5d3SJohn Marino static lv_t _lookup_lv_by_name(const char *name)
142*86d7f5d3SJohn Marino {
143*86d7f5d3SJohn Marino 	lv_t lv;
144*86d7f5d3SJohn Marino 
145*86d7f5d3SJohn Marino 	if (!name) {
146*86d7f5d3SJohn Marino 		printf ("Invalid LV name\n");
147*86d7f5d3SJohn Marino 		return NULL;
148*86d7f5d3SJohn Marino 	}
149*86d7f5d3SJohn Marino 	if (!(lv = dm_hash_lookup(_lvname_hash, name))) {
150*86d7f5d3SJohn Marino 		printf ("Can't find %s in LVs - run vg_create_lv first\n",
151*86d7f5d3SJohn Marino 			name);
152*86d7f5d3SJohn Marino 		return NULL;
153*86d7f5d3SJohn Marino 	}
154*86d7f5d3SJohn Marino 	return lv;
155*86d7f5d3SJohn Marino }
156*86d7f5d3SJohn Marino 
_lookup_vg_by_name(char ** argv,int argc)157*86d7f5d3SJohn Marino static vg_t _lookup_vg_by_name(char **argv, int argc)
158*86d7f5d3SJohn Marino {
159*86d7f5d3SJohn Marino 	vg_t vg;
160*86d7f5d3SJohn Marino 
161*86d7f5d3SJohn Marino 	if (argc < 2) {
162*86d7f5d3SJohn Marino 		printf ("Please enter vg_name\n");
163*86d7f5d3SJohn Marino 		return NULL;
164*86d7f5d3SJohn Marino 	}
165*86d7f5d3SJohn Marino 	if (!(vg = dm_hash_lookup(_vgid_hash, argv[1])) &&
166*86d7f5d3SJohn Marino 	    !(vg = dm_hash_lookup(_vgname_hash, argv[1]))) {
167*86d7f5d3SJohn Marino 		printf ("Can't find %s in open VGs - run vg_open first\n",
168*86d7f5d3SJohn Marino 			argv[1]);
169*86d7f5d3SJohn Marino 		return NULL;
170*86d7f5d3SJohn Marino 	}
171*86d7f5d3SJohn Marino 	return vg;
172*86d7f5d3SJohn Marino }
_add_lvs_to_lvname_hash(struct dm_list * lvs)173*86d7f5d3SJohn Marino static void _add_lvs_to_lvname_hash(struct dm_list *lvs)
174*86d7f5d3SJohn Marino {
175*86d7f5d3SJohn Marino 	struct lvm_lv_list *lvl;
176*86d7f5d3SJohn Marino 	dm_list_iterate_items(lvl, lvs) {
177*86d7f5d3SJohn Marino 		/* Concatenate VG name with LV name */
178*86d7f5d3SJohn Marino 		dm_hash_insert(_lvname_hash, lvm_lv_get_name(lvl->lv), lvl->lv);
179*86d7f5d3SJohn Marino 	}
180*86d7f5d3SJohn Marino }
181*86d7f5d3SJohn Marino 
_add_pvs_to_pvname_hash(struct dm_list * pvs)182*86d7f5d3SJohn Marino static void _add_pvs_to_pvname_hash(struct dm_list *pvs)
183*86d7f5d3SJohn Marino {
184*86d7f5d3SJohn Marino 	struct lvm_pv_list *pvl;
185*86d7f5d3SJohn Marino 	dm_list_iterate_items(pvl, pvs) {
186*86d7f5d3SJohn Marino 		dm_hash_insert(_pvname_hash, lvm_pv_get_name(pvl->pv), pvl->pv);
187*86d7f5d3SJohn Marino 	}
188*86d7f5d3SJohn Marino }
189*86d7f5d3SJohn Marino 
_remove_device_from_pvname_hash(struct dm_list * pvs,const char * name)190*86d7f5d3SJohn Marino static void _remove_device_from_pvname_hash(struct dm_list *pvs, const char *name)
191*86d7f5d3SJohn Marino {
192*86d7f5d3SJohn Marino 	struct lvm_pv_list *pvl;
193*86d7f5d3SJohn Marino 	dm_list_iterate_items(pvl, pvs) {
194*86d7f5d3SJohn Marino 		if (!strncmp(lvm_pv_get_name(pvl->pv), name, strlen(name)))
195*86d7f5d3SJohn Marino 			dm_hash_remove(_pvname_hash, name);
196*86d7f5d3SJohn Marino 	}
197*86d7f5d3SJohn Marino }
_add_device_to_pvname_hash(struct dm_list * pvs,const char * name)198*86d7f5d3SJohn Marino static void _add_device_to_pvname_hash(struct dm_list *pvs, const char *name)
199*86d7f5d3SJohn Marino {
200*86d7f5d3SJohn Marino 	struct lvm_pv_list *pvl;
201*86d7f5d3SJohn Marino 	dm_list_iterate_items(pvl, pvs) {
202*86d7f5d3SJohn Marino 		if (!strncmp(lvm_pv_get_name(pvl->pv), name, strlen(name)))
203*86d7f5d3SJohn Marino 			dm_hash_insert(_pvname_hash, name, pvl->pv);
204*86d7f5d3SJohn Marino 	}
205*86d7f5d3SJohn Marino }
_vg_reduce(char ** argv,int argc,lvm_t libh)206*86d7f5d3SJohn Marino static void _vg_reduce(char **argv, int argc, lvm_t libh)
207*86d7f5d3SJohn Marino {
208*86d7f5d3SJohn Marino 	vg_t vg;
209*86d7f5d3SJohn Marino 	struct dm_list *pvs;
210*86d7f5d3SJohn Marino 
211*86d7f5d3SJohn Marino 	if (argc < 2) {
212*86d7f5d3SJohn Marino 		printf ("Please enter vg_name\n");
213*86d7f5d3SJohn Marino 		return;
214*86d7f5d3SJohn Marino 	}
215*86d7f5d3SJohn Marino 	if (!(vg = dm_hash_lookup(_vgid_hash, argv[1])) &&
216*86d7f5d3SJohn Marino 	    !(vg = dm_hash_lookup(_vgname_hash, argv[1]))) {
217*86d7f5d3SJohn Marino 		printf ("VG not open\n");
218*86d7f5d3SJohn Marino 		return;
219*86d7f5d3SJohn Marino 	}
220*86d7f5d3SJohn Marino 	if (lvm_vg_reduce(vg, argv[2])) {
221*86d7f5d3SJohn Marino 		printf("Error reducing %s by %s\n", argv[1], argv[2]);
222*86d7f5d3SJohn Marino 		return;
223*86d7f5d3SJohn Marino 	}
224*86d7f5d3SJohn Marino 
225*86d7f5d3SJohn Marino 	printf("Success reducing vg %s by %s\n", argv[1], argv[2]);
226*86d7f5d3SJohn Marino 
227*86d7f5d3SJohn Marino 	/*
228*86d7f5d3SJohn Marino 	 * Add the device into the hashes for lookups
229*86d7f5d3SJohn Marino 	 */
230*86d7f5d3SJohn Marino 	pvs = lvm_vg_list_pvs(vg);
231*86d7f5d3SJohn Marino 	if (pvs && !dm_list_empty(pvs))
232*86d7f5d3SJohn Marino 		_remove_device_from_pvname_hash(pvs, argv[2]);
233*86d7f5d3SJohn Marino }
234*86d7f5d3SJohn Marino 
235*86d7f5d3SJohn Marino /* Print "Error" or "Success" depending on lvm status */
_lvm_status_to_pass_fail(int rc)236*86d7f5d3SJohn Marino static int _lvm_status_to_pass_fail(int rc)
237*86d7f5d3SJohn Marino {
238*86d7f5d3SJohn Marino 	if (rc)
239*86d7f5d3SJohn Marino 		printf("Error ");
240*86d7f5d3SJohn Marino 	else
241*86d7f5d3SJohn Marino 		printf("Success ");
242*86d7f5d3SJohn Marino 	return rc;
243*86d7f5d3SJohn Marino }
_config_override(char ** argv,int argc,lvm_t libh)244*86d7f5d3SJohn Marino static void _config_override(char **argv, int argc, lvm_t libh)
245*86d7f5d3SJohn Marino {
246*86d7f5d3SJohn Marino 	int rc;
247*86d7f5d3SJohn Marino 	char tmp[64];
248*86d7f5d3SJohn Marino 
249*86d7f5d3SJohn Marino 	if (argc < 2) {
250*86d7f5d3SJohn Marino 		printf ("Please enter device\n");
251*86d7f5d3SJohn Marino 		return;
252*86d7f5d3SJohn Marino 	}
253*86d7f5d3SJohn Marino 	snprintf(tmp, 63, "devices{filter=[\"a|%s|\", \"r|.*|\"]}", argv[1]);
254*86d7f5d3SJohn Marino 	rc = lvm_config_override(libh, tmp);
255*86d7f5d3SJohn Marino 	_lvm_status_to_pass_fail(rc);
256*86d7f5d3SJohn Marino 	printf("overriding LVM configuration\n");
257*86d7f5d3SJohn Marino }
258*86d7f5d3SJohn Marino 
_config_reload(char ** argv,int argc,lvm_t libh)259*86d7f5d3SJohn Marino static void _config_reload(char **argv, int argc, lvm_t libh)
260*86d7f5d3SJohn Marino {
261*86d7f5d3SJohn Marino 	int rc;
262*86d7f5d3SJohn Marino 	rc = lvm_config_reload(libh);
263*86d7f5d3SJohn Marino 	_lvm_status_to_pass_fail(rc);
264*86d7f5d3SJohn Marino 	printf("reloading LVM configuration\n");
265*86d7f5d3SJohn Marino }
266*86d7f5d3SJohn Marino 
_vg_extend(char ** argv,int argc,lvm_t libh)267*86d7f5d3SJohn Marino static void _vg_extend(char **argv, int argc, lvm_t libh)
268*86d7f5d3SJohn Marino {
269*86d7f5d3SJohn Marino 	vg_t vg;
270*86d7f5d3SJohn Marino 	struct dm_list *pvs;
271*86d7f5d3SJohn Marino 
272*86d7f5d3SJohn Marino 	if (argc < 2) {
273*86d7f5d3SJohn Marino 		printf ("Please enter vg_name\n");
274*86d7f5d3SJohn Marino 		return;
275*86d7f5d3SJohn Marino 	}
276*86d7f5d3SJohn Marino 	if (!(vg = dm_hash_lookup(_vgid_hash, argv[1])) &&
277*86d7f5d3SJohn Marino 	    !(vg = dm_hash_lookup(_vgname_hash, argv[1]))) {
278*86d7f5d3SJohn Marino 		printf ("VG not open\n");
279*86d7f5d3SJohn Marino 		return;
280*86d7f5d3SJohn Marino 	}
281*86d7f5d3SJohn Marino 	if (lvm_vg_extend(vg, argv[2])) {
282*86d7f5d3SJohn Marino 		printf("Error extending %s with %s\n", argv[1], argv[2]);
283*86d7f5d3SJohn Marino 		return;
284*86d7f5d3SJohn Marino 	}
285*86d7f5d3SJohn Marino 
286*86d7f5d3SJohn Marino 	printf("Success extending vg %s with %s\n", argv[1], argv[2]);
287*86d7f5d3SJohn Marino 
288*86d7f5d3SJohn Marino 	/*
289*86d7f5d3SJohn Marino 	 * Add the device into the hashes for lookups
290*86d7f5d3SJohn Marino 	 */
291*86d7f5d3SJohn Marino 	pvs = lvm_vg_list_pvs(vg);
292*86d7f5d3SJohn Marino 	if (pvs && !dm_list_empty(pvs))
293*86d7f5d3SJohn Marino 		_add_device_to_pvname_hash(pvs, argv[2]);
294*86d7f5d3SJohn Marino }
295*86d7f5d3SJohn Marino 
_vg_open(char ** argv,int argc,lvm_t libh)296*86d7f5d3SJohn Marino static void _vg_open(char **argv, int argc, lvm_t libh)
297*86d7f5d3SJohn Marino {
298*86d7f5d3SJohn Marino 	vg_t vg;
299*86d7f5d3SJohn Marino 	struct dm_list *lvs;
300*86d7f5d3SJohn Marino 	struct dm_list *pvs;
301*86d7f5d3SJohn Marino 
302*86d7f5d3SJohn Marino 	if (argc < 2) {
303*86d7f5d3SJohn Marino 		printf ("Please enter vg_name\n");
304*86d7f5d3SJohn Marino 		return;
305*86d7f5d3SJohn Marino 	}
306*86d7f5d3SJohn Marino 	if ((vg = dm_hash_lookup(_vgid_hash, argv[1])) ||
307*86d7f5d3SJohn Marino 	    (vg = dm_hash_lookup(_vgname_hash, argv[1]))) {
308*86d7f5d3SJohn Marino 		printf ("VG already open\n");
309*86d7f5d3SJohn Marino 		return;
310*86d7f5d3SJohn Marino 	}
311*86d7f5d3SJohn Marino 	if (argc < 3)
312*86d7f5d3SJohn Marino 		vg = lvm_vg_open(libh, argv[1], "r", 0);
313*86d7f5d3SJohn Marino 	else
314*86d7f5d3SJohn Marino 		vg = lvm_vg_open(libh, argv[1], argv[2], 0);
315*86d7f5d3SJohn Marino 	if (!vg || !lvm_vg_get_name(vg)) {
316*86d7f5d3SJohn Marino 		printf("Error opening %s\n", argv[1]);
317*86d7f5d3SJohn Marino 		return;
318*86d7f5d3SJohn Marino 	}
319*86d7f5d3SJohn Marino 
320*86d7f5d3SJohn Marino 	printf("Success opening vg %s\n", argv[1]);
321*86d7f5d3SJohn Marino 	dm_hash_insert(_vgname_hash, lvm_vg_get_name(vg), vg);
322*86d7f5d3SJohn Marino 	dm_hash_insert(_vgid_hash, lvm_vg_get_uuid(vg), vg);
323*86d7f5d3SJohn Marino 
324*86d7f5d3SJohn Marino 	/*
325*86d7f5d3SJohn Marino 	 * Add the LVs and PVs into the hashes for lookups
326*86d7f5d3SJohn Marino 	 */
327*86d7f5d3SJohn Marino 	lvs = lvm_vg_list_lvs(vg);
328*86d7f5d3SJohn Marino 	if (lvs && !dm_list_empty(lvs))
329*86d7f5d3SJohn Marino 		_add_lvs_to_lvname_hash(lvs);
330*86d7f5d3SJohn Marino 	pvs = lvm_vg_list_pvs(vg);
331*86d7f5d3SJohn Marino 	if (pvs && !dm_list_empty(pvs))
332*86d7f5d3SJohn Marino 		_add_pvs_to_pvname_hash(pvs);
333*86d7f5d3SJohn Marino }
334*86d7f5d3SJohn Marino /* Lookup the vg and remove it from the vgname and vgid hashes */
_lookup_and_remove_vg(const char * vgname)335*86d7f5d3SJohn Marino static vg_t _lookup_and_remove_vg(const char *vgname)
336*86d7f5d3SJohn Marino {
337*86d7f5d3SJohn Marino 	vg_t vg=NULL;
338*86d7f5d3SJohn Marino 
339*86d7f5d3SJohn Marino 	if ((vg = dm_hash_lookup(_vgname_hash, vgname))) {
340*86d7f5d3SJohn Marino 		dm_hash_remove(_vgid_hash, lvm_vg_get_uuid(vg));
341*86d7f5d3SJohn Marino 		dm_hash_remove(_vgname_hash, lvm_vg_get_name(vg));
342*86d7f5d3SJohn Marino 	}
343*86d7f5d3SJohn Marino 	if (!vg && (vg = dm_hash_lookup(_vgid_hash, vgname))) {
344*86d7f5d3SJohn Marino 		dm_hash_remove(_vgid_hash, lvm_vg_get_uuid(vg));
345*86d7f5d3SJohn Marino 		dm_hash_remove(_vgname_hash, lvm_vg_get_name(vg));
346*86d7f5d3SJohn Marino 	}
347*86d7f5d3SJohn Marino 	return vg;
348*86d7f5d3SJohn Marino }
349*86d7f5d3SJohn Marino 
_vg_write(char ** argv,int argc)350*86d7f5d3SJohn Marino static void _vg_write(char **argv, int argc)
351*86d7f5d3SJohn Marino {
352*86d7f5d3SJohn Marino 	vg_t vg;
353*86d7f5d3SJohn Marino 	int rc = 0;
354*86d7f5d3SJohn Marino 
355*86d7f5d3SJohn Marino 	if (argc < 2) {
356*86d7f5d3SJohn Marino 		printf ("Please enter vg_name\n");
357*86d7f5d3SJohn Marino 		return;
358*86d7f5d3SJohn Marino 	}
359*86d7f5d3SJohn Marino 	vg = _lookup_vg_by_name(argv, argc);
360*86d7f5d3SJohn Marino 	if (!vg) {
361*86d7f5d3SJohn Marino 		printf("Can't find vg_name %s\n", argv[1]);
362*86d7f5d3SJohn Marino 		return;
363*86d7f5d3SJohn Marino 	}
364*86d7f5d3SJohn Marino 	rc = lvm_vg_write(vg);
365*86d7f5d3SJohn Marino 	_lvm_status_to_pass_fail(rc);
366*86d7f5d3SJohn Marino 	printf("writing VG %s\n", lvm_vg_get_name(vg));
367*86d7f5d3SJohn Marino }
368*86d7f5d3SJohn Marino 
_vg_create(char ** argv,int argc,lvm_t libh)369*86d7f5d3SJohn Marino static void _vg_create(char **argv, int argc, lvm_t libh)
370*86d7f5d3SJohn Marino {
371*86d7f5d3SJohn Marino 	vg_t vg;
372*86d7f5d3SJohn Marino 
373*86d7f5d3SJohn Marino 	if (argc < 2) {
374*86d7f5d3SJohn Marino 		printf ("Please enter vg_name\n");
375*86d7f5d3SJohn Marino 		return;
376*86d7f5d3SJohn Marino 	}
377*86d7f5d3SJohn Marino 	vg = lvm_vg_create(libh, argv[1]);
378*86d7f5d3SJohn Marino 	if (!vg || !lvm_vg_get_name(vg)) {
379*86d7f5d3SJohn Marino 		printf("Error creating %s\n", argv[1]);
380*86d7f5d3SJohn Marino 		return;
381*86d7f5d3SJohn Marino 	}
382*86d7f5d3SJohn Marino 
383*86d7f5d3SJohn Marino 	printf("Success creating vg %s\n", argv[1]);
384*86d7f5d3SJohn Marino 	dm_hash_insert(_vgname_hash, lvm_vg_get_name(vg), vg);
385*86d7f5d3SJohn Marino 	dm_hash_insert(_vgid_hash, lvm_vg_get_uuid(vg), vg);
386*86d7f5d3SJohn Marino }
387*86d7f5d3SJohn Marino 
_vg_remove(char ** argv,int argc)388*86d7f5d3SJohn Marino static void _vg_remove(char **argv, int argc)
389*86d7f5d3SJohn Marino {
390*86d7f5d3SJohn Marino 	vg_t vg;
391*86d7f5d3SJohn Marino 	int rc = 0;
392*86d7f5d3SJohn Marino 
393*86d7f5d3SJohn Marino 	if (argc < 2) {
394*86d7f5d3SJohn Marino 		printf ("Please enter vg_name\n");
395*86d7f5d3SJohn Marino 		return;
396*86d7f5d3SJohn Marino 	}
397*86d7f5d3SJohn Marino 	vg = _lookup_vg_by_name(argv, argc);
398*86d7f5d3SJohn Marino 	if (!vg) {
399*86d7f5d3SJohn Marino 		printf("Can't find vg_name %s\n", argv[1]);
400*86d7f5d3SJohn Marino 		return;
401*86d7f5d3SJohn Marino 	}
402*86d7f5d3SJohn Marino 	rc = lvm_vg_remove(vg);
403*86d7f5d3SJohn Marino 	_lvm_status_to_pass_fail(rc);
404*86d7f5d3SJohn Marino 	printf("removing VG\n");
405*86d7f5d3SJohn Marino }
406*86d7f5d3SJohn Marino 
_vg_close(char ** argv,int argc)407*86d7f5d3SJohn Marino static void _vg_close(char **argv, int argc)
408*86d7f5d3SJohn Marino {
409*86d7f5d3SJohn Marino 	vg_t vg;
410*86d7f5d3SJohn Marino 	int rc = 0;
411*86d7f5d3SJohn Marino 
412*86d7f5d3SJohn Marino 	if (argc < 2) {
413*86d7f5d3SJohn Marino 		printf ("Please enter vg_name\n");
414*86d7f5d3SJohn Marino 		return;
415*86d7f5d3SJohn Marino 	}
416*86d7f5d3SJohn Marino 	vg = _lookup_and_remove_vg(argv[1]);
417*86d7f5d3SJohn Marino 	if (!vg) {
418*86d7f5d3SJohn Marino 		printf("Can't find vg_name %s\n", argv[1]);
419*86d7f5d3SJohn Marino 		return;
420*86d7f5d3SJohn Marino 	}
421*86d7f5d3SJohn Marino 	rc = lvm_vg_close(vg);
422*86d7f5d3SJohn Marino 	_lvm_status_to_pass_fail(rc);
423*86d7f5d3SJohn Marino 	printf("closing VG\n");
424*86d7f5d3SJohn Marino }
425*86d7f5d3SJohn Marino 
_show_one_vg(vg_t vg)426*86d7f5d3SJohn Marino static void _show_one_vg(vg_t vg)
427*86d7f5d3SJohn Marino {
428*86d7f5d3SJohn Marino 	printf("%s (%s): sz=%"PRIu64", free=%"PRIu64", #pv=%"PRIu64
429*86d7f5d3SJohn Marino 		", seq#=%"PRIu64"\n",
430*86d7f5d3SJohn Marino 		lvm_vg_get_name(vg), lvm_vg_get_uuid(vg),
431*86d7f5d3SJohn Marino 		lvm_vg_get_size(vg), lvm_vg_get_free_size(vg),
432*86d7f5d3SJohn Marino 		lvm_vg_get_pv_count(vg), lvm_vg_get_seqno(vg));
433*86d7f5d3SJohn Marino }
434*86d7f5d3SJohn Marino 
_list_open_vgs(void)435*86d7f5d3SJohn Marino static void _list_open_vgs(void)
436*86d7f5d3SJohn Marino {
437*86d7f5d3SJohn Marino 	dm_hash_iter(_vgid_hash, (dm_hash_iterate_fn) _show_one_vg);
438*86d7f5d3SJohn Marino }
439*86d7f5d3SJohn Marino 
_pvs_in_vg(char ** argv,int argc)440*86d7f5d3SJohn Marino static void _pvs_in_vg(char **argv, int argc)
441*86d7f5d3SJohn Marino {
442*86d7f5d3SJohn Marino 	struct dm_list *pvs;
443*86d7f5d3SJohn Marino 	struct lvm_pv_list *pvl;
444*86d7f5d3SJohn Marino 	vg_t vg;
445*86d7f5d3SJohn Marino 
446*86d7f5d3SJohn Marino 	if (!(vg = _lookup_vg_by_name(argv, argc)))
447*86d7f5d3SJohn Marino 		return;
448*86d7f5d3SJohn Marino 	pvs = lvm_vg_list_pvs(vg);
449*86d7f5d3SJohn Marino 	if (!pvs || dm_list_empty(pvs)) {
450*86d7f5d3SJohn Marino 		printf("No PVs in VG %s\n", lvm_vg_get_name(vg));
451*86d7f5d3SJohn Marino 		return;
452*86d7f5d3SJohn Marino 	}
453*86d7f5d3SJohn Marino 	printf("PVs in VG %s:\n", lvm_vg_get_name(vg));
454*86d7f5d3SJohn Marino 	dm_list_iterate_items(pvl, pvs) {
455*86d7f5d3SJohn Marino 		printf("%s (%s): mda_count=%"PRIu64"\n",
456*86d7f5d3SJohn Marino 		       lvm_pv_get_name(pvl->pv), lvm_pv_get_uuid(pvl->pv),
457*86d7f5d3SJohn Marino 			lvm_pv_get_mda_count(pvl->pv));
458*86d7f5d3SJohn Marino 	}
459*86d7f5d3SJohn Marino }
460*86d7f5d3SJohn Marino 
_scan_vgs(lvm_t libh)461*86d7f5d3SJohn Marino static void _scan_vgs(lvm_t libh)
462*86d7f5d3SJohn Marino {
463*86d7f5d3SJohn Marino 	lvm_scan(libh);
464*86d7f5d3SJohn Marino }
465*86d7f5d3SJohn Marino 
_list_vg_names(lvm_t libh)466*86d7f5d3SJohn Marino static void _list_vg_names(lvm_t libh)
467*86d7f5d3SJohn Marino {
468*86d7f5d3SJohn Marino 	struct dm_list *list;
469*86d7f5d3SJohn Marino 	struct lvm_str_list *strl;
470*86d7f5d3SJohn Marino 	const char *tmp;
471*86d7f5d3SJohn Marino 
472*86d7f5d3SJohn Marino 	list = lvm_list_vg_names(libh);
473*86d7f5d3SJohn Marino 	printf("VG names:\n");
474*86d7f5d3SJohn Marino 	dm_list_iterate_items(strl, list) {
475*86d7f5d3SJohn Marino 		tmp = strl->str;
476*86d7f5d3SJohn Marino 		printf("%s\n", tmp);
477*86d7f5d3SJohn Marino 	}
478*86d7f5d3SJohn Marino }
479*86d7f5d3SJohn Marino 
_list_vg_ids(lvm_t libh)480*86d7f5d3SJohn Marino static void _list_vg_ids(lvm_t libh)
481*86d7f5d3SJohn Marino {
482*86d7f5d3SJohn Marino 	struct dm_list *list;
483*86d7f5d3SJohn Marino 	struct lvm_str_list *strl;
484*86d7f5d3SJohn Marino 	const char *tmp;
485*86d7f5d3SJohn Marino 
486*86d7f5d3SJohn Marino 	list = lvm_list_vg_uuids(libh);
487*86d7f5d3SJohn Marino 	printf("VG uuids:\n");
488*86d7f5d3SJohn Marino 	dm_list_iterate_items(strl, list) {
489*86d7f5d3SJohn Marino 		tmp = strl->str;
490*86d7f5d3SJohn Marino 		printf("%s\n", tmp);
491*86d7f5d3SJohn Marino 	}
492*86d7f5d3SJohn Marino }
493*86d7f5d3SJohn Marino 
494*86d7f5d3SJohn Marino 
_lvs_in_vg(char ** argv,int argc)495*86d7f5d3SJohn Marino static void _lvs_in_vg(char **argv, int argc)
496*86d7f5d3SJohn Marino {
497*86d7f5d3SJohn Marino 	struct dm_list *lvs;
498*86d7f5d3SJohn Marino 	struct lvm_lv_list *lvl;
499*86d7f5d3SJohn Marino 	vg_t vg;
500*86d7f5d3SJohn Marino 
501*86d7f5d3SJohn Marino 	if (!(vg = _lookup_vg_by_name(argv, argc)))
502*86d7f5d3SJohn Marino 		return;
503*86d7f5d3SJohn Marino 	lvs = lvm_vg_list_lvs(vg);
504*86d7f5d3SJohn Marino 	if (!lvs || dm_list_empty(lvs)) {
505*86d7f5d3SJohn Marino 		printf("No LVs in VG %s\n", lvm_vg_get_name(vg));
506*86d7f5d3SJohn Marino 		return;
507*86d7f5d3SJohn Marino 	}
508*86d7f5d3SJohn Marino 	printf("LVs in VG %s:\n", lvm_vg_get_name(vg));
509*86d7f5d3SJohn Marino 	dm_list_iterate_items(lvl, lvs) {
510*86d7f5d3SJohn Marino 		printf("%s/%s (%s): size=%"PRIu64", %sACTIVE / %sSUSPENDED\n",
511*86d7f5d3SJohn Marino 			lvm_vg_get_name(vg),
512*86d7f5d3SJohn Marino 			lvm_lv_get_name(lvl->lv), lvm_lv_get_uuid(lvl->lv),
513*86d7f5d3SJohn Marino 			lvm_lv_get_size(lvl->lv),
514*86d7f5d3SJohn Marino 			lvm_lv_is_active(lvl->lv) ? "" : "IN",
515*86d7f5d3SJohn Marino 			lvm_lv_is_suspended(lvl->lv) ? "" : "NOT ");
516*86d7f5d3SJohn Marino 	}
517*86d7f5d3SJohn Marino }
518*86d7f5d3SJohn Marino 
_lv_deactivate(char ** argv,int argc)519*86d7f5d3SJohn Marino static void _lv_deactivate(char **argv, int argc)
520*86d7f5d3SJohn Marino {
521*86d7f5d3SJohn Marino 	lv_t lv;
522*86d7f5d3SJohn Marino 	int rc=0;
523*86d7f5d3SJohn Marino 
524*86d7f5d3SJohn Marino 	if (argc < 3) {
525*86d7f5d3SJohn Marino 		printf("Please enter vgname, lvname\n");
526*86d7f5d3SJohn Marino 		return;
527*86d7f5d3SJohn Marino 	}
528*86d7f5d3SJohn Marino 	if (!(lv = _lookup_lv_by_name(argv[2])))
529*86d7f5d3SJohn Marino 		return;
530*86d7f5d3SJohn Marino 	rc = lvm_lv_deactivate(lv);
531*86d7f5d3SJohn Marino 	_lvm_status_to_pass_fail(rc);
532*86d7f5d3SJohn Marino 	printf("De-activating LV %s in VG %s\n",
533*86d7f5d3SJohn Marino 		argv[2], argv[1]);
534*86d7f5d3SJohn Marino }
_lv_activate(char ** argv,int argc)535*86d7f5d3SJohn Marino static void _lv_activate(char **argv, int argc)
536*86d7f5d3SJohn Marino {
537*86d7f5d3SJohn Marino 	lv_t lv;
538*86d7f5d3SJohn Marino 	int rc=0;
539*86d7f5d3SJohn Marino 
540*86d7f5d3SJohn Marino 	if (argc < 3) {
541*86d7f5d3SJohn Marino 		printf("Please enter vgname, lvname\n");
542*86d7f5d3SJohn Marino 		return;
543*86d7f5d3SJohn Marino 	}
544*86d7f5d3SJohn Marino 	if (!(lv = _lookup_lv_by_name(argv[2])))
545*86d7f5d3SJohn Marino 		return;
546*86d7f5d3SJohn Marino 	rc = lvm_lv_activate(lv);
547*86d7f5d3SJohn Marino 	_lvm_status_to_pass_fail(rc);
548*86d7f5d3SJohn Marino 	printf("activating LV %s in VG %s\n",
549*86d7f5d3SJohn Marino 		argv[2], argv[1]);
550*86d7f5d3SJohn Marino }
_vg_remove_lv(char ** argv,int argc)551*86d7f5d3SJohn Marino static void _vg_remove_lv(char **argv, int argc)
552*86d7f5d3SJohn Marino {
553*86d7f5d3SJohn Marino 	lv_t lv;
554*86d7f5d3SJohn Marino 
555*86d7f5d3SJohn Marino 	if (argc < 3) {
556*86d7f5d3SJohn Marino 		printf("Please enter vgname, lvname\n");
557*86d7f5d3SJohn Marino 		return;
558*86d7f5d3SJohn Marino 	}
559*86d7f5d3SJohn Marino 	if (!(lv = _lookup_lv_by_name(argv[2])))
560*86d7f5d3SJohn Marino 		return;
561*86d7f5d3SJohn Marino 	if (lvm_vg_remove_lv(lv))
562*86d7f5d3SJohn Marino 		printf("Error ");
563*86d7f5d3SJohn Marino 	else {
564*86d7f5d3SJohn Marino 		printf("Success ");
565*86d7f5d3SJohn Marino 		dm_hash_remove(_lvname_hash, argv[2]);
566*86d7f5d3SJohn Marino 	}
567*86d7f5d3SJohn Marino 	printf("removing LV %s in VG %s\n",
568*86d7f5d3SJohn Marino 		argv[2], argv[1]);
569*86d7f5d3SJohn Marino }
570*86d7f5d3SJohn Marino 
_vg_create_lv_linear(char ** argv,int argc)571*86d7f5d3SJohn Marino static void _vg_create_lv_linear(char **argv, int argc)
572*86d7f5d3SJohn Marino {
573*86d7f5d3SJohn Marino 	vg_t vg;
574*86d7f5d3SJohn Marino 	lv_t lv;
575*86d7f5d3SJohn Marino 
576*86d7f5d3SJohn Marino 	if (argc < 4) {
577*86d7f5d3SJohn Marino 		printf("Please enter vgname, lvname, and size\n");
578*86d7f5d3SJohn Marino 		return;
579*86d7f5d3SJohn Marino 	}
580*86d7f5d3SJohn Marino 	if (!(vg = _lookup_vg_by_name(argv, argc)))
581*86d7f5d3SJohn Marino 		return;
582*86d7f5d3SJohn Marino 	lv = lvm_vg_create_lv_linear(vg, argv[2], atol(argv[3]));
583*86d7f5d3SJohn Marino 	if (!lv)
584*86d7f5d3SJohn Marino 		printf("Error ");
585*86d7f5d3SJohn Marino 	else {
586*86d7f5d3SJohn Marino 		printf("Success ");
587*86d7f5d3SJohn Marino 		dm_hash_insert(_lvname_hash, argv[2], lv);
588*86d7f5d3SJohn Marino 	}
589*86d7f5d3SJohn Marino 	printf("creating LV %s in VG %s\n",
590*86d7f5d3SJohn Marino 		argv[2], argv[1]);
591*86d7f5d3SJohn Marino }
592*86d7f5d3SJohn Marino 
lvmapi_test_shell(lvm_t libh)593*86d7f5d3SJohn Marino static int lvmapi_test_shell(lvm_t libh)
594*86d7f5d3SJohn Marino {
595*86d7f5d3SJohn Marino 	int argc;
596*86d7f5d3SJohn Marino 	char *input = NULL, *args[MAX_ARGS], **argv;
597*86d7f5d3SJohn Marino 
598*86d7f5d3SJohn Marino 	_hash_create();
599*86d7f5d3SJohn Marino 	argc=0;
600*86d7f5d3SJohn Marino 	while (1) {
601*86d7f5d3SJohn Marino 		free(input);
602*86d7f5d3SJohn Marino 		input = readline("liblvm> ");
603*86d7f5d3SJohn Marino 
604*86d7f5d3SJohn Marino 		/* EOF */
605*86d7f5d3SJohn Marino 		if (!input) {
606*86d7f5d3SJohn Marino 			printf("\n");
607*86d7f5d3SJohn Marino 			break;
608*86d7f5d3SJohn Marino 		}
609*86d7f5d3SJohn Marino 
610*86d7f5d3SJohn Marino 		/* empty line */
611*86d7f5d3SJohn Marino 		if (!*input)
612*86d7f5d3SJohn Marino 			continue;
613*86d7f5d3SJohn Marino 
614*86d7f5d3SJohn Marino 		argv = args;
615*86d7f5d3SJohn Marino 
616*86d7f5d3SJohn Marino 		if (lvm_split(input, &argc, argv, MAX_ARGS) == MAX_ARGS) {
617*86d7f5d3SJohn Marino 			printf("Too many arguments, sorry.");
618*86d7f5d3SJohn Marino 			continue;
619*86d7f5d3SJohn Marino 		}
620*86d7f5d3SJohn Marino 
621*86d7f5d3SJohn Marino 		if (!strcmp(argv[0], "lvm")) {
622*86d7f5d3SJohn Marino 			argv++;
623*86d7f5d3SJohn Marino 			argc--;
624*86d7f5d3SJohn Marino 		}
625*86d7f5d3SJohn Marino 
626*86d7f5d3SJohn Marino 		if (!argc)
627*86d7f5d3SJohn Marino 			continue;
628*86d7f5d3SJohn Marino 
629*86d7f5d3SJohn Marino 		if (!strcmp(argv[0], "quit") || !strcmp(argv[0], "exit")) {
630*86d7f5d3SJohn Marino 			printf("Exiting.\n");
631*86d7f5d3SJohn Marino 			break;
632*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "?") || !strcmp(argv[0], "help")) {
633*86d7f5d3SJohn Marino 			_show_help();
634*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "config_reload")) {
635*86d7f5d3SJohn Marino 			_config_reload(argv, argc, libh);
636*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "config_override")) {
637*86d7f5d3SJohn Marino 			_config_override(argv, argc, libh);
638*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "vg_extend")) {
639*86d7f5d3SJohn Marino 			_vg_extend(argv, argc, libh);
640*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "vg_reduce")) {
641*86d7f5d3SJohn Marino 			_vg_reduce(argv, argc, libh);
642*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "vg_write")) {
643*86d7f5d3SJohn Marino 			_vg_write(argv, argc);
644*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "vg_open")) {
645*86d7f5d3SJohn Marino 			_vg_open(argv, argc, libh);
646*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "vg_close")) {
647*86d7f5d3SJohn Marino 			_vg_close(argv, argc);
648*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "vg_create")) {
649*86d7f5d3SJohn Marino 			_vg_create(argv, argc, libh);
650*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "vg_remove")) {
651*86d7f5d3SJohn Marino 			_vg_remove(argv, argc);
652*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "lv_activate")) {
653*86d7f5d3SJohn Marino 			_lv_activate(argv, argc);
654*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "lv_deactivate")) {
655*86d7f5d3SJohn Marino 			_lv_deactivate(argv, argc);
656*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "vg_remove_lv")) {
657*86d7f5d3SJohn Marino 			_vg_remove_lv(argv, argc);
658*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "vgs_open")) {
659*86d7f5d3SJohn Marino 			_list_open_vgs();
660*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "vg_list_pvs")) {
661*86d7f5d3SJohn Marino 			_pvs_in_vg(argv, argc);
662*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "vg_list_lvs")) {
663*86d7f5d3SJohn Marino 			_lvs_in_vg(argv, argc);
664*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "list_vg_names")) {
665*86d7f5d3SJohn Marino 			_list_vg_names(libh);
666*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "list_vg_ids")) {
667*86d7f5d3SJohn Marino 			_list_vg_ids(libh);
668*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "scan_vgs")) {
669*86d7f5d3SJohn Marino 			_scan_vgs(libh);
670*86d7f5d3SJohn Marino 		} else if (!strcmp(argv[0], "vg_create_lv_linear")) {
671*86d7f5d3SJohn Marino 			_vg_create_lv_linear(argv, argc);
672*86d7f5d3SJohn Marino 		} else {
673*86d7f5d3SJohn Marino 			printf ("Unrecognized command %s\n", argv[0]);
674*86d7f5d3SJohn Marino 		}
675*86d7f5d3SJohn Marino 	}
676*86d7f5d3SJohn Marino 
677*86d7f5d3SJohn Marino 	dm_hash_iter(_vgname_hash, (dm_hash_iterate_fn) lvm_vg_close);
678*86d7f5d3SJohn Marino 	_hash_destroy();
679*86d7f5d3SJohn Marino 	free(input);
680*86d7f5d3SJohn Marino 	return 0;
681*86d7f5d3SJohn Marino }
682*86d7f5d3SJohn Marino 
main(int argc,char * argv[])683*86d7f5d3SJohn Marino int main (int argc, char *argv[])
684*86d7f5d3SJohn Marino {
685*86d7f5d3SJohn Marino 	lvm_t libh;
686*86d7f5d3SJohn Marino 
687*86d7f5d3SJohn Marino 	libh = lvm_init(NULL);
688*86d7f5d3SJohn Marino 	if (!libh) {
689*86d7f5d3SJohn Marino 		printf("Unable to open lvm library instance\n");
690*86d7f5d3SJohn Marino 		return 1;
691*86d7f5d3SJohn Marino 	}
692*86d7f5d3SJohn Marino 
693*86d7f5d3SJohn Marino 	printf("Library version: %s\n", lvm_library_get_version());
694*86d7f5d3SJohn Marino 	lvmapi_test_shell(libh);
695*86d7f5d3SJohn Marino 
696*86d7f5d3SJohn Marino 	lvm_quit(libh);
697*86d7f5d3SJohn Marino 	return 0;
698*86d7f5d3SJohn Marino }
699*86d7f5d3SJohn Marino 
700