Deleted Added
full compact
geom_shsec.c (143586) geom_shsec.c (153190)
1/*-
2 * Copyright (c) 2004-2005 Pawel Jakub Dawidek <pjd@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2004-2005 Pawel Jakub Dawidek <pjd@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: head/sbin/geom/class/shsec/geom_shsec.c 143586 2005-03-14 14:25:47Z pjd $");
28__FBSDID("$FreeBSD: head/sbin/geom/class/shsec/geom_shsec.c 153190 2005-12-07 01:38:27Z pjd $");
29
30#include <sys/param.h>
31#include <errno.h>
32#include <paths.h>
33#include <stdio.h>
34#include <stdlib.h>
35#include <stdint.h>
36#include <string.h>

--- 43 unchanged lines hidden (view full) ---

80static void
81shsec_main(struct gctl_req *req, unsigned flags)
82{
83 const char *name;
84
85 if ((flags & G_FLAG_VERBOSE) != 0)
86 verbose = 1;
87
29
30#include <sys/param.h>
31#include <errno.h>
32#include <paths.h>
33#include <stdio.h>
34#include <stdlib.h>
35#include <stdint.h>
36#include <string.h>

--- 43 unchanged lines hidden (view full) ---

80static void
81shsec_main(struct gctl_req *req, unsigned flags)
82{
83 const char *name;
84
85 if ((flags & G_FLAG_VERBOSE) != 0)
86 verbose = 1;
87
88 name = gctl_get_asciiparam(req, "verb");
88 name = gctl_get_ascii(req, "verb");
89 if (name == NULL) {
90 gctl_error(req, "No '%s' argument.", "verb");
91 return;
92 }
93 if (strcmp(name, "label") == 0)
94 shsec_label(req);
95 else if (strcmp(name, "clear") == 0)
96 shsec_clear(req);

--- 4 unchanged lines hidden (view full) ---

101}
102
103static void
104shsec_label(struct gctl_req *req)
105{
106 struct g_shsec_metadata md;
107 off_t compsize, msize;
108 u_char sector[512];
89 if (name == NULL) {
90 gctl_error(req, "No '%s' argument.", "verb");
91 return;
92 }
93 if (strcmp(name, "label") == 0)
94 shsec_label(req);
95 else if (strcmp(name, "clear") == 0)
96 shsec_clear(req);

--- 4 unchanged lines hidden (view full) ---

101}
102
103static void
104shsec_label(struct gctl_req *req)
105{
106 struct g_shsec_metadata md;
107 off_t compsize, msize;
108 u_char sector[512];
109 unsigned i, ssize, secsize;
109 unsigned ssize, secsize;
110 const char *name;
110 const char *name;
111 char param[16];
112 int *hardcode, *nargs, error;
111 int error, i, nargs, hardcode;
113
112
114 nargs = gctl_get_paraml(req, "nargs", sizeof(*nargs));
115 if (nargs == NULL) {
116 gctl_error(req, "No '%s' argument.", "nargs");
117 return;
118 }
119 if (*nargs <= 2) {
113 nargs = gctl_get_int(req, "nargs");
114 if (nargs <= 2) {
120 gctl_error(req, "Too few arguments.");
121 return;
122 }
115 gctl_error(req, "Too few arguments.");
116 return;
117 }
123 hardcode = gctl_get_paraml(req, "hardcode", sizeof(*hardcode));
124 if (hardcode == NULL) {
125 gctl_error(req, "No '%s' argument.", "hardcode");
126 return;
127 }
118 hardcode = gctl_get_int(req, "hardcode");
128
129 /*
130 * Clear last sector first to spoil all components if device exists.
131 */
132 compsize = 0;
133 secsize = 0;
119
120 /*
121 * Clear last sector first to spoil all components if device exists.
122 */
123 compsize = 0;
124 secsize = 0;
134 for (i = 1; i < (unsigned)*nargs; i++) {
135 snprintf(param, sizeof(param), "arg%u", i);
136 name = gctl_get_asciiparam(req, param);
137
125 for (i = 1; i < nargs; i++) {
126 name = gctl_get_ascii(req, "arg%d", i);
138 msize = g_get_mediasize(name);
139 ssize = g_get_sectorsize(name);
140 if (msize == 0 || ssize == 0) {
141 gctl_error(req, "Can't get informations about %s: %s.",
142 name, strerror(errno));
143 return;
144 }
145 msize -= ssize;

--- 9 unchanged lines hidden (view full) ---

155 gctl_error(req, "Can't store metadata on %s: %s.", name,
156 strerror(error));
157 return;
158 }
159 }
160
161 strlcpy(md.md_magic, G_SHSEC_MAGIC, sizeof(md.md_magic));
162 md.md_version = G_SHSEC_VERSION;
127 msize = g_get_mediasize(name);
128 ssize = g_get_sectorsize(name);
129 if (msize == 0 || ssize == 0) {
130 gctl_error(req, "Can't get informations about %s: %s.",
131 name, strerror(errno));
132 return;
133 }
134 msize -= ssize;

--- 9 unchanged lines hidden (view full) ---

144 gctl_error(req, "Can't store metadata on %s: %s.", name,
145 strerror(error));
146 return;
147 }
148 }
149
150 strlcpy(md.md_magic, G_SHSEC_MAGIC, sizeof(md.md_magic));
151 md.md_version = G_SHSEC_VERSION;
163 name = gctl_get_asciiparam(req, "arg0");
164 if (name == NULL) {
165 gctl_error(req, "No 'arg%u' argument.", 0);
166 return;
167 }
152 name = gctl_get_ascii(req, "arg0");
168 strlcpy(md.md_name, name, sizeof(md.md_name));
169 md.md_id = arc4random();
153 strlcpy(md.md_name, name, sizeof(md.md_name));
154 md.md_id = arc4random();
170 md.md_all = *nargs - 1;
155 md.md_all = nargs - 1;
171
172 /*
173 * Ok, store metadata.
174 */
156
157 /*
158 * Ok, store metadata.
159 */
175 for (i = 1; i < (unsigned)*nargs; i++) {
176 snprintf(param, sizeof(param), "arg%u", i);
177 name = gctl_get_asciiparam(req, param);
178
160 for (i = 1; i < nargs; i++) {
161 name = gctl_get_ascii(req, "arg%d", i);
179 msize = g_get_mediasize(name);
180 ssize = g_get_sectorsize(name);
181 if (compsize < msize - ssize) {
182 fprintf(stderr,
183 "warning: %s: only %jd bytes from %jd bytes used.\n",
184 name, (intmax_t)compsize, (intmax_t)(msize - ssize));
185 }
186
187 md.md_no = i - 1;
188 md.md_provsize = msize;
162 msize = g_get_mediasize(name);
163 ssize = g_get_sectorsize(name);
164 if (compsize < msize - ssize) {
165 fprintf(stderr,
166 "warning: %s: only %jd bytes from %jd bytes used.\n",
167 name, (intmax_t)compsize, (intmax_t)(msize - ssize));
168 }
169
170 md.md_no = i - 1;
171 md.md_provsize = msize;
189 if (!*hardcode)
172 if (!hardcode)
190 bzero(md.md_provider, sizeof(md.md_provider));
191 else {
192 if (strncmp(name, _PATH_DEV, strlen(_PATH_DEV)) == 0)
193 name += strlen(_PATH_DEV);
194 strlcpy(md.md_provider, name, sizeof(md.md_provider));
195 }
196 shsec_metadata_encode(&md, sector);
197 error = g_metadata_store(name, sector, sizeof(sector));

--- 7 unchanged lines hidden (view full) ---

205 printf("Metadata value stored on %s.\n", name);
206 }
207}
208
209static void
210shsec_clear(struct gctl_req *req)
211{
212 const char *name;
173 bzero(md.md_provider, sizeof(md.md_provider));
174 else {
175 if (strncmp(name, _PATH_DEV, strlen(_PATH_DEV)) == 0)
176 name += strlen(_PATH_DEV);
177 strlcpy(md.md_provider, name, sizeof(md.md_provider));
178 }
179 shsec_metadata_encode(&md, sector);
180 error = g_metadata_store(name, sector, sizeof(sector));

--- 7 unchanged lines hidden (view full) ---

188 printf("Metadata value stored on %s.\n", name);
189 }
190}
191
192static void
193shsec_clear(struct gctl_req *req)
194{
195 const char *name;
213 char param[16];
214 unsigned i;
215 int *nargs, error;
196 int error, i, nargs;
216
197
217 nargs = gctl_get_paraml(req, "nargs", sizeof(*nargs));
218 if (nargs == NULL) {
219 gctl_error(req, "No '%s' argument.", "nargs");
220 return;
221 }
222 if (*nargs < 1) {
198 nargs = gctl_get_int(req, "nargs");
199 if (nargs < 1) {
223 gctl_error(req, "Too few arguments.");
224 return;
225 }
226
200 gctl_error(req, "Too few arguments.");
201 return;
202 }
203
227 for (i = 0; i < (unsigned)*nargs; i++) {
228 snprintf(param, sizeof(param), "arg%u", i);
229 name = gctl_get_asciiparam(req, param);
230
204 for (i = 0; i < nargs; i++) {
205 name = gctl_get_ascii(req, "arg%d", i);
231 error = g_metadata_clear(name, G_SHSEC_MAGIC);
232 if (error != 0) {
233 fprintf(stderr, "Can't clear metadata on %s: %s.\n",
234 name, strerror(error));
235 gctl_error(req, "Not fully done.");
236 continue;
237 }
238 if (verbose)

--- 14 unchanged lines hidden (view full) ---

253 printf(" Hardcoded provider: %s\n", md->md_provider);
254}
255
256static void
257shsec_dump(struct gctl_req *req)
258{
259 struct g_shsec_metadata md, tmpmd;
260 const char *name;
206 error = g_metadata_clear(name, G_SHSEC_MAGIC);
207 if (error != 0) {
208 fprintf(stderr, "Can't clear metadata on %s: %s.\n",
209 name, strerror(error));
210 gctl_error(req, "Not fully done.");
211 continue;
212 }
213 if (verbose)

--- 14 unchanged lines hidden (view full) ---

228 printf(" Hardcoded provider: %s\n", md->md_provider);
229}
230
231static void
232shsec_dump(struct gctl_req *req)
233{
234 struct g_shsec_metadata md, tmpmd;
235 const char *name;
261 char param[16];
262 int *nargs, error, i;
236 int error, i, nargs;
263
237
264 nargs = gctl_get_paraml(req, "nargs", sizeof(*nargs));
265 if (nargs == NULL) {
266 gctl_error(req, "No '%s' argument.", "nargs");
267 return;
268 }
269 if (*nargs < 1) {
238 nargs = gctl_get_int(req, "nargs");
239 if (nargs < 1) {
270 gctl_error(req, "Too few arguments.");
271 return;
272 }
273
240 gctl_error(req, "Too few arguments.");
241 return;
242 }
243
274 for (i = 0; i < *nargs; i++) {
275 snprintf(param, sizeof(param), "arg%u", i);
276 name = gctl_get_asciiparam(req, param);
277
244 for (i = 0; i < nargs; i++) {
245 name = gctl_get_ascii(req, "arg%d", i);
278 error = g_metadata_read(name, (u_char *)&tmpmd, sizeof(tmpmd),
279 G_SHSEC_MAGIC);
280 if (error != 0) {
281 fprintf(stderr, "Can't read metadata from %s: %s.\n",
282 name, strerror(error));
283 gctl_error(req, "Not fully done.");
284 continue;
285 }
286 shsec_metadata_decode((u_char *)&tmpmd, &md);
287 printf("Metadata on %s:\n", name);
288 shsec_metadata_dump(&md);
289 printf("\n");
290 }
291}
246 error = g_metadata_read(name, (u_char *)&tmpmd, sizeof(tmpmd),
247 G_SHSEC_MAGIC);
248 if (error != 0) {
249 fprintf(stderr, "Can't read metadata from %s: %s.\n",
250 name, strerror(error));
251 gctl_error(req, "Not fully done.");
252 continue;
253 }
254 shsec_metadata_decode((u_char *)&tmpmd, &md);
255 printf("Metadata on %s:\n", name);
256 shsec_metadata_dump(&md);
257 printf("\n");
258 }
259}