xref: /dflybsd-src/contrib/lvm2/dist/lib/format_text/import.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
1*86d7f5d3SJohn Marino /*	$NetBSD: import.c,v 1.1.1.1 2008/12/22 00:18:16 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-2008 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 "display.h"
22*86d7f5d3SJohn Marino #include "toolcontext.h"
23*86d7f5d3SJohn Marino #include "lvmcache.h"
24*86d7f5d3SJohn Marino 
25*86d7f5d3SJohn Marino /* FIXME Use tidier inclusion method */
26*86d7f5d3SJohn Marino static struct text_vg_version_ops *(_text_vsn_list[2]);
27*86d7f5d3SJohn Marino 
28*86d7f5d3SJohn Marino static int _text_import_initialised = 0;
29*86d7f5d3SJohn Marino 
_init_text_import()30*86d7f5d3SJohn Marino static void _init_text_import()
31*86d7f5d3SJohn Marino {
32*86d7f5d3SJohn Marino 	if (_text_import_initialised)
33*86d7f5d3SJohn Marino 		return;
34*86d7f5d3SJohn Marino 
35*86d7f5d3SJohn Marino 	_text_vsn_list[0] = text_vg_vsn1_init();
36*86d7f5d3SJohn Marino 	_text_vsn_list[1] = NULL;
37*86d7f5d3SJohn Marino 	_text_import_initialised = 1;
38*86d7f5d3SJohn Marino }
39*86d7f5d3SJohn Marino 
text_vgname_import(const struct format_type * fmt,struct device * dev,off_t offset,uint32_t size,off_t offset2,uint32_t size2,checksum_fn_t checksum_fn,uint32_t checksum,struct id * vgid,uint32_t * vgstatus,char ** creation_host)40*86d7f5d3SJohn Marino const char *text_vgname_import(const struct format_type *fmt,
41*86d7f5d3SJohn Marino 			       struct device *dev,
42*86d7f5d3SJohn Marino 			       off_t offset, uint32_t size,
43*86d7f5d3SJohn Marino 			       off_t offset2, uint32_t size2,
44*86d7f5d3SJohn Marino 			       checksum_fn_t checksum_fn, uint32_t checksum,
45*86d7f5d3SJohn Marino 			       struct id *vgid, uint32_t *vgstatus,
46*86d7f5d3SJohn Marino 			       char **creation_host)
47*86d7f5d3SJohn Marino {
48*86d7f5d3SJohn Marino 	struct config_tree *cft;
49*86d7f5d3SJohn Marino 	struct text_vg_version_ops **vsn;
50*86d7f5d3SJohn Marino 	const char *vgname = NULL;
51*86d7f5d3SJohn Marino 
52*86d7f5d3SJohn Marino 	_init_text_import();
53*86d7f5d3SJohn Marino 
54*86d7f5d3SJohn Marino 	if (!(cft = create_config_tree(NULL, 0)))
55*86d7f5d3SJohn Marino 		return_NULL;
56*86d7f5d3SJohn Marino 
57*86d7f5d3SJohn Marino 	if ((!dev && !read_config_file(cft)) ||
58*86d7f5d3SJohn Marino 	    (dev && !read_config_fd(cft, dev, offset, size,
59*86d7f5d3SJohn Marino 				    offset2, size2, checksum_fn, checksum)))
60*86d7f5d3SJohn Marino 		goto_out;
61*86d7f5d3SJohn Marino 
62*86d7f5d3SJohn Marino 	/*
63*86d7f5d3SJohn Marino 	 * Find a set of version functions that can read this file
64*86d7f5d3SJohn Marino 	 */
65*86d7f5d3SJohn Marino 	for (vsn = &_text_vsn_list[0]; *vsn; vsn++) {
66*86d7f5d3SJohn Marino 		if (!(*vsn)->check_version(cft))
67*86d7f5d3SJohn Marino 			continue;
68*86d7f5d3SJohn Marino 
69*86d7f5d3SJohn Marino 		if (!(vgname = (*vsn)->read_vgname(fmt, cft, vgid, vgstatus,
70*86d7f5d3SJohn Marino 						   creation_host)))
71*86d7f5d3SJohn Marino 			goto_out;
72*86d7f5d3SJohn Marino 
73*86d7f5d3SJohn Marino 		break;
74*86d7f5d3SJohn Marino 	}
75*86d7f5d3SJohn Marino 
76*86d7f5d3SJohn Marino       out:
77*86d7f5d3SJohn Marino 	destroy_config_tree(cft);
78*86d7f5d3SJohn Marino 	return vgname;
79*86d7f5d3SJohn Marino }
80*86d7f5d3SJohn Marino 
text_vg_import_fd(struct format_instance * fid,const char * file,struct device * dev,off_t offset,uint32_t size,off_t offset2,uint32_t size2,checksum_fn_t checksum_fn,uint32_t checksum,time_t * when,char ** desc)81*86d7f5d3SJohn Marino struct volume_group *text_vg_import_fd(struct format_instance *fid,
82*86d7f5d3SJohn Marino 				       const char *file,
83*86d7f5d3SJohn Marino 				       struct device *dev,
84*86d7f5d3SJohn Marino 				       off_t offset, uint32_t size,
85*86d7f5d3SJohn Marino 				       off_t offset2, uint32_t size2,
86*86d7f5d3SJohn Marino 				       checksum_fn_t checksum_fn,
87*86d7f5d3SJohn Marino 				       uint32_t checksum,
88*86d7f5d3SJohn Marino 				       time_t *when, char **desc)
89*86d7f5d3SJohn Marino {
90*86d7f5d3SJohn Marino 	struct volume_group *vg = NULL;
91*86d7f5d3SJohn Marino 	struct config_tree *cft;
92*86d7f5d3SJohn Marino 	struct text_vg_version_ops **vsn;
93*86d7f5d3SJohn Marino 
94*86d7f5d3SJohn Marino 	_init_text_import();
95*86d7f5d3SJohn Marino 
96*86d7f5d3SJohn Marino 	*desc = NULL;
97*86d7f5d3SJohn Marino 	*when = 0;
98*86d7f5d3SJohn Marino 
99*86d7f5d3SJohn Marino 	if (!(cft = create_config_tree(file, 0)))
100*86d7f5d3SJohn Marino 		return_NULL;
101*86d7f5d3SJohn Marino 
102*86d7f5d3SJohn Marino 	if ((!dev && !read_config_file(cft)) ||
103*86d7f5d3SJohn Marino 	    (dev && !read_config_fd(cft, dev, offset, size,
104*86d7f5d3SJohn Marino 				    offset2, size2, checksum_fn, checksum))) {
105*86d7f5d3SJohn Marino 		log_error("Couldn't read volume group metadata.");
106*86d7f5d3SJohn Marino 		goto out;
107*86d7f5d3SJohn Marino 	}
108*86d7f5d3SJohn Marino 
109*86d7f5d3SJohn Marino 	/*
110*86d7f5d3SJohn Marino 	 * Find a set of version functions that can read this file
111*86d7f5d3SJohn Marino 	 */
112*86d7f5d3SJohn Marino 	for (vsn = &_text_vsn_list[0]; *vsn; vsn++) {
113*86d7f5d3SJohn Marino 		if (!(*vsn)->check_version(cft))
114*86d7f5d3SJohn Marino 			continue;
115*86d7f5d3SJohn Marino 
116*86d7f5d3SJohn Marino 		if (!(vg = (*vsn)->read_vg(fid, cft)))
117*86d7f5d3SJohn Marino 			goto_out;
118*86d7f5d3SJohn Marino 
119*86d7f5d3SJohn Marino 		(*vsn)->read_desc(fid->fmt->cmd->mem, cft, when, desc);
120*86d7f5d3SJohn Marino 		break;
121*86d7f5d3SJohn Marino 	}
122*86d7f5d3SJohn Marino 
123*86d7f5d3SJohn Marino       out:
124*86d7f5d3SJohn Marino 	destroy_config_tree(cft);
125*86d7f5d3SJohn Marino 	return vg;
126*86d7f5d3SJohn Marino }
127*86d7f5d3SJohn Marino 
text_vg_import_file(struct format_instance * fid,const char * file,time_t * when,char ** desc)128*86d7f5d3SJohn Marino struct volume_group *text_vg_import_file(struct format_instance *fid,
129*86d7f5d3SJohn Marino 					 const char *file,
130*86d7f5d3SJohn Marino 					 time_t *when, char **desc)
131*86d7f5d3SJohn Marino {
132*86d7f5d3SJohn Marino 	return text_vg_import_fd(fid, file, NULL, (off_t)0, 0, (off_t)0, 0, NULL, 0,
133*86d7f5d3SJohn Marino 				 when, desc);
134*86d7f5d3SJohn Marino }
135*86d7f5d3SJohn Marino 
import_vg_from_buffer(char * buf,struct format_instance * fid)136*86d7f5d3SJohn Marino struct volume_group *import_vg_from_buffer(char *buf,
137*86d7f5d3SJohn Marino                                            struct format_instance *fid)
138*86d7f5d3SJohn Marino {
139*86d7f5d3SJohn Marino 	struct volume_group *vg = NULL;
140*86d7f5d3SJohn Marino 	struct config_tree *cft;
141*86d7f5d3SJohn Marino 	struct text_vg_version_ops **vsn;
142*86d7f5d3SJohn Marino 
143*86d7f5d3SJohn Marino 	_init_text_import();
144*86d7f5d3SJohn Marino 
145*86d7f5d3SJohn Marino 	if (!(cft = create_config_tree_from_string(fid->fmt->cmd, buf)))
146*86d7f5d3SJohn Marino 		return_NULL;
147*86d7f5d3SJohn Marino 
148*86d7f5d3SJohn Marino 	for (vsn = &_text_vsn_list[0]; *vsn; vsn++) {
149*86d7f5d3SJohn Marino 		if (!(*vsn)->check_version(cft))
150*86d7f5d3SJohn Marino 			continue;
151*86d7f5d3SJohn Marino 		if (!(vg = (*vsn)->read_vg(fid, cft)))
152*86d7f5d3SJohn Marino 			stack;
153*86d7f5d3SJohn Marino 		break;
154*86d7f5d3SJohn Marino 	}
155*86d7f5d3SJohn Marino 
156*86d7f5d3SJohn Marino 	destroy_config_tree(cft);
157*86d7f5d3SJohn Marino 	return vg;
158*86d7f5d3SJohn Marino }
159