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} |