labelit.c (7c478bd9) | labelit.c (0e42dee6) |
---|---|
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the | 1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the |
5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. | 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. |
8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22/* | 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21/* |
23 * Copyright (c) 1999-2000 by Sun Microsystems, Inc. 24 * All rights reserved. | 22 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. |
25 */ 26 27#pragma ident "%Z%%M% %I% %E% SMI" 28 29/* 30 * Label a file system volume. 31 */ 32 --- 32 unchanged lines hidden (view full) --- 65 66typedef unsigned short unicode_t; 67 68#define FSNAME_STR_LEN (8 + 2) 69#define VOLNAME_STR_LEN 32 70#define INFO_STR_LEN 36 71 72static void usage(); | 24 */ 25 26#pragma ident "%Z%%M% %I% %E% SMI" 27 28/* 29 * Label a file system volume. 30 */ 31 --- 32 unchanged lines hidden (view full) --- 64 65typedef unsigned short unicode_t; 66 67#define FSNAME_STR_LEN (8 + 2) 68#define VOLNAME_STR_LEN 32 69#define INFO_STR_LEN 36 70 71static void usage(); |
73static void label(int32_t, uint32_t); 74static void print_info(struct vds *, char *, int32_t); 75static void label_vds(struct vds *, uint32_t, int32_t); | 72static void label(ud_handle_t, uint32_t); 73static void print_info(struct vds *, char *, ud_handle_t); 74static void label_vds(struct vds *, uint32_t, ud_handle_t); |
76static int32_t convert_string(int8_t *, int8_t *, int32_t, int32_t, int8_t *); 77static int32_t ud_convert2unicode(int8_t *, int8_t *, int32_t); 78 79 80int8_t *labelit_subopts[] = { 81#define LVINFO1 0x00 82 "lvinfo1", 83#define LVINFO2 0x01 84 "lvinfo2", 85#define LVINFO3 0x02 86 "lvinfo3", 87 NULL}; 88 89 90int 91main(int32_t argc, char *argv[]) 92{ 93 int32_t opt = 0; | 75static int32_t convert_string(int8_t *, int8_t *, int32_t, int32_t, int8_t *); 76static int32_t ud_convert2unicode(int8_t *, int8_t *, int32_t); 77 78 79int8_t *labelit_subopts[] = { 80#define LVINFO1 0x00 81 "lvinfo1", 82#define LVINFO2 0x01 83 "lvinfo2", 84#define LVINFO3 0x02 85 "lvinfo3", 86 NULL}; 87 88 89int 90main(int32_t argc, char *argv[]) 91{ 92 int32_t opt = 0; |
94 int32_t fd = 0; | |
95 int32_t flags = 0; 96 int32_t ret = 0; 97 int8_t *options = NULL; 98 int8_t *value = NULL; 99 uint32_t set_flags = 0; | 93 int32_t flags = 0; 94 int32_t ret = 0; 95 int8_t *options = NULL; 96 int8_t *value = NULL; 97 uint32_t set_flags = 0; |
98 ud_handle_t udh; |
|
100 101 (void) setlocale(LC_ALL, ""); 102 103#if !defined(TEXT_DOMAIN) 104#define TEXT_DOMAIN "SYS_TEST" 105#endif 106 107 (void) textdomain(TEXT_DOMAIN); --- 76 unchanged lines hidden (view full) --- 184 "compressed unicode dstring\n")); 185 set_flags |= SET_FSNAME | SET_VOLNAME; 186 } else { 187 if ((argc - optind) != 1) { 188 usage(); 189 } 190 } 191 | 99 100 (void) setlocale(LC_ALL, ""); 101 102#if !defined(TEXT_DOMAIN) 103#define TEXT_DOMAIN "SYS_TEST" 104#endif 105 106 (void) textdomain(TEXT_DOMAIN); --- 76 unchanged lines hidden (view full) --- 183 "compressed unicode dstring\n")); 184 set_flags |= SET_FSNAME | SET_VOLNAME; 185 } else { 186 if ((argc - optind) != 1) { 187 usage(); 188 } 189 } 190 |
191 if (ud_init(-1, &udh) != 0) { 192 (void) fprintf(stderr, 193 gettext("udfs labelit: cannot initialize ud_lib\n")); 194 exit(1); 195 } 196 |
|
192 /* 193 * Open special device 194 */ 195 if (set_flags == 0) { 196 flags = O_RDONLY; 197 } else { 198 flags = O_RDWR; 199 } | 197 /* 198 * Open special device 199 */ 200 if (set_flags == 0) { 201 flags = O_RDONLY; 202 } else { 203 flags = O_RDWR; 204 } |
200 if ((fd = ud_open_dev(argv[optind], flags)) < 0) { | 205 if (ud_open_dev(udh, argv[optind], flags) != 0) { |
201 (void) fprintf(stderr, 202 gettext("udfs labelit: cannot open <%s> errorno <%d>\n"), 203 argv[optind], errno); 204 exit(1); 205 } 206 | 206 (void) fprintf(stderr, 207 gettext("udfs labelit: cannot open <%s> errorno <%d>\n"), 208 argv[optind], errno); 209 exit(1); 210 } 211 |
207 if ((ret = ud_fill_udfs_info(fd)) != 0) { | 212 if ((ret = ud_fill_udfs_info(udh)) != 0) { |
208 goto close_dev; 209 } 210 | 213 goto close_dev; 214 } 215 |
211 if ((udfs.flags & VALID_UDFS) == 0) { | 216 if ((udh->udfs.flags & VALID_UDFS) == 0) { |
212 ret = 1; 213 goto close_dev; 214 } 215 | 217 ret = 1; 218 goto close_dev; 219 } 220 |
216 label(fd, set_flags); | 221 label(udh, set_flags); |
217 218close_dev: | 222 223close_dev: |
219 ud_close_dev(fd); | 224 ud_close_dev(udh); 225 ud_fini(udh); |
220 221 return (ret); 222} 223 224static void 225usage() 226{ 227 (void) fprintf(stderr, gettext( --- 4 unchanged lines hidden (view full) --- 232 "[lvinfo2=string],[lvinfo3=string]\n")); 233 (void) fprintf(stderr, 234 gettext("NOTE that all -o suboptions: must" 235 " be separated only by commas.\n")); 236 exit(1); 237} 238 239static void | 226 227 return (ret); 228} 229 230static void 231usage() 232{ 233 (void) fprintf(stderr, gettext( --- 4 unchanged lines hidden (view full) --- 238 "[lvinfo2=string],[lvinfo3=string]\n")); 239 (void) fprintf(stderr, 240 gettext("NOTE that all -o suboptions: must" 241 " be separated only by commas.\n")); 242 exit(1); 243} 244 245static void |
240label(int32_t fd, uint32_t set_flags) | 246label(ud_handle_t udh, uint32_t set_flags) |
241{ 242 if (set_flags == 0) { | 247{ 248 if (set_flags == 0) { |
243 if (udfs.flags & VALID_MVDS) { 244 print_info(&udfs.mvds, "mvds", fd); | 249 if (udh->udfs.flags & VALID_MVDS) { 250 print_info(&udh->udfs.mvds, "mvds", udh); |
245 } | 251 } |
246 if (udfs.flags & VALID_RVDS) { 247 print_info(&udfs.rvds, "rvds", fd); | 252 if (udh->udfs.flags & VALID_RVDS) { 253 print_info(&udh->udfs.rvds, "rvds", udh); |
248 } 249 return; 250 } else { 251 | 254 } 255 return; 256 } else { 257 |
252 if (udfs.flags & VALID_MVDS) { 253 label_vds(&udfs.mvds, set_flags, fd); | 258 if (udh->udfs.flags & VALID_MVDS) { 259 label_vds(&udh->udfs.mvds, set_flags, udh); |
254 } | 260 } |
255 if (udfs.flags & VALID_RVDS) { 256 label_vds(&udfs.rvds, set_flags, fd); | 261 if (udh->udfs.flags & VALID_RVDS) { 262 label_vds(&udh->udfs.rvds, set_flags, udh); |
257 } 258 if (((set_flags & (SET_FSNAME | SET_VOLNAME)) == 259 (SET_FSNAME | SET_VOLNAME)) && | 263 } 264 if (((set_flags & (SET_FSNAME | SET_VOLNAME)) == 265 (SET_FSNAME | SET_VOLNAME)) && |
260 (udfs.fsd_len != 0)) { | 266 (udh->udfs.fsd_len != 0)) { |
261 struct file_set_desc *fsd; 262 | 267 struct file_set_desc *fsd; 268 |
263 off = udfs.fsd_loc * udfs.lbsize; 264 if (ud_read_dev(fd, off, buf, udfs.fsd_len) != 0) { | 269 off = udh->udfs.fsd_loc * udh->udfs.lbsize; 270 if (ud_read_dev(udh, off, buf, 271 udh->udfs.fsd_len) != 0) { |
265 return; 266 } 267 268 /* LINTED */ 269 fsd = (struct file_set_desc *)buf; 270 271 set_dstring(fsd->fsd_lvid, 272 volname, sizeof (fsd->fsd_lvid)); 273 set_dstring(fsd->fsd_fsi, 274 volname, sizeof (fsd->fsd_fsi)); 275 | 272 return; 273 } 274 275 /* LINTED */ 276 fsd = (struct file_set_desc *)buf; 277 278 set_dstring(fsd->fsd_lvid, 279 volname, sizeof (fsd->fsd_lvid)); 280 set_dstring(fsd->fsd_fsi, 281 volname, sizeof (fsd->fsd_fsi)); 282 |
276 ud_make_tag(&fsd->fsd_tag, UD_FILE_SET_DESC, | 283 ud_make_tag(udh, &fsd->fsd_tag, UD_FILE_SET_DESC, |
277 SWAP_32(fsd->fsd_tag.tag_loc), 278 SWAP_16(fsd->fsd_tag.tag_crc_len)); 279 | 284 SWAP_32(fsd->fsd_tag.tag_loc), 285 SWAP_16(fsd->fsd_tag.tag_crc_len)); 286 |
280 (void) ud_write_dev(fd, off, buf, udfs.fsd_len); | 287 (void) ud_write_dev(udh, off, buf, udh->udfs.fsd_len); |
281 } 282 } 283} 284 285static void | 288 } 289 } 290} 291 292static void |
286print_info(struct vds *v, char *name, int32_t fd) | 293print_info(struct vds *v, char *name, ud_handle_t udh) |
287{ 288 uint8_t outbuf[BUF_LEN]; 289 290 if (v->pvd_len != 0) { | 294{ 295 uint8_t outbuf[BUF_LEN]; 296 297 if (v->pvd_len != 0) { |
291 off = v->pvd_loc * udfs.lbsize; 292 if (ud_read_dev(fd, off, buf, | 298 off = v->pvd_loc * udh->udfs.lbsize; 299 if (ud_read_dev(udh, off, buf, |
293 sizeof (struct pri_vol_desc)) == 0) { 294 295 struct pri_vol_desc *pvd; 296 297 /* LINTED */ 298 pvd = (struct pri_vol_desc *)buf; 299 300 bzero(outbuf, BUF_LEN); --- 12 unchanged lines hidden (view full) --- 313 strlen(pvd->pvd_vol_id)); 314 (void) fprintf(stdout, 315 gettext("volume label in %s : %s\n"), 316 name, outbuf); 317 } 318 } 319 320 if (v->iud_len != 0) { | 300 sizeof (struct pri_vol_desc)) == 0) { 301 302 struct pri_vol_desc *pvd; 303 304 /* LINTED */ 305 pvd = (struct pri_vol_desc *)buf; 306 307 bzero(outbuf, BUF_LEN); --- 12 unchanged lines hidden (view full) --- 320 strlen(pvd->pvd_vol_id)); 321 (void) fprintf(stdout, 322 gettext("volume label in %s : %s\n"), 323 name, outbuf); 324 } 325 } 326 327 if (v->iud_len != 0) { |
321 off = v->iud_loc * udfs.lbsize; 322 if (ud_read_dev(fd, off, buf, | 328 off = v->iud_loc * udh->udfs.lbsize; 329 if (ud_read_dev(udh, off, buf, |
323 sizeof (struct iuvd_desc)) == 0) { 324 325 struct iuvd_desc *iud; 326 327 /* LINTED */ 328 iud = (struct iuvd_desc *)buf; 329 bzero(outbuf, BUF_LEN); 330 iud->iuvd_ifo1[35] = '\0'; --- 25 unchanged lines hidden (view full) --- 356 gettext("LVInfo3 in %s : %s\n"), 357 name, outbuf); 358 } 359 } 360} 361 362/* ARGSUSED */ 363static void | 330 sizeof (struct iuvd_desc)) == 0) { 331 332 struct iuvd_desc *iud; 333 334 /* LINTED */ 335 iud = (struct iuvd_desc *)buf; 336 bzero(outbuf, BUF_LEN); 337 iud->iuvd_ifo1[35] = '\0'; --- 25 unchanged lines hidden (view full) --- 363 gettext("LVInfo3 in %s : %s\n"), 364 name, outbuf); 365 } 366 } 367} 368 369/* ARGSUSED */ 370static void |
364label_vds(struct vds *v, uint32_t set_flags, int32_t fd) | 371label_vds(struct vds *v, uint32_t set_flags, ud_handle_t udh) |
365{ 366 367 if (((set_flags & (SET_FSNAME | SET_VOLNAME)) == 368 (SET_FSNAME | SET_VOLNAME)) && 369 (v->pvd_len)) { 370 | 372{ 373 374 if (((set_flags & (SET_FSNAME | SET_VOLNAME)) == 375 (SET_FSNAME | SET_VOLNAME)) && 376 (v->pvd_len)) { 377 |
371 off = v->pvd_loc * udfs.lbsize; 372 if (ud_read_dev(fd, off, buf, | 378 off = v->pvd_loc * udh->udfs.lbsize; 379 if (ud_read_dev(udh, off, buf, |
373 sizeof (struct pri_vol_desc)) == 0) { 374 375 struct pri_vol_desc *pvd; 376 377 /* LINTED */ 378 pvd = (struct pri_vol_desc *)buf; 379 bzero((int8_t *)&pvd->pvd_vsi[9], 119); 380 (void) strncpy((int8_t *)&pvd->pvd_vsi[9], 381 &fsname[1], fsname_len - 1); 382 383 set_dstring(pvd->pvd_vol_id, 384 volname, sizeof (pvd->pvd_vol_id)); 385 | 380 sizeof (struct pri_vol_desc)) == 0) { 381 382 struct pri_vol_desc *pvd; 383 384 /* LINTED */ 385 pvd = (struct pri_vol_desc *)buf; 386 bzero((int8_t *)&pvd->pvd_vsi[9], 119); 387 (void) strncpy((int8_t *)&pvd->pvd_vsi[9], 388 &fsname[1], fsname_len - 1); 389 390 set_dstring(pvd->pvd_vol_id, 391 volname, sizeof (pvd->pvd_vol_id)); 392 |
386 ud_make_tag(&pvd->pvd_tag, | 393 ud_make_tag(udh, &pvd->pvd_tag, |
387 SWAP_16(pvd->pvd_tag.tag_id), 388 SWAP_32(pvd->pvd_tag.tag_loc), 389 SWAP_16(pvd->pvd_tag.tag_crc_len)); 390 | 394 SWAP_16(pvd->pvd_tag.tag_id), 395 SWAP_32(pvd->pvd_tag.tag_loc), 396 SWAP_16(pvd->pvd_tag.tag_crc_len)); 397 |
391 (void) ud_write_dev(fd, off, buf, | 398 (void) ud_write_dev(udh, off, buf, |
392 sizeof (struct pri_vol_desc)); 393 } 394 } 395 396 if (set_flags && v->iud_len) { 397 | 399 sizeof (struct pri_vol_desc)); 400 } 401 } 402 403 if (set_flags && v->iud_len) { 404 |
398 off = v->iud_loc * udfs.lbsize; 399 if (ud_read_dev(fd, off, buf, | 405 off = v->iud_loc * udh->udfs.lbsize; 406 if (ud_read_dev(udh, off, buf, |
400 sizeof (struct iuvd_desc)) == 0) { 401 402 struct iuvd_desc *iuvd; 403 404 /* LINTED */ 405 iuvd = (struct iuvd_desc *)buf; 406 407 if ((set_flags & SET_VOLNAME) == SET_VOLNAME) { --- 8 unchanged lines hidden (view full) --- 416 set_dstring(iuvd->iuvd_ifo2, 417 lvinfo2_buf, sizeof (iuvd->iuvd_ifo2)); 418 } 419 if ((set_flags & SET_LVINFO3) == SET_LVINFO3) { 420 set_dstring(iuvd->iuvd_ifo3, 421 lvinfo3_buf, sizeof (iuvd->iuvd_ifo3)); 422 } 423 | 407 sizeof (struct iuvd_desc)) == 0) { 408 409 struct iuvd_desc *iuvd; 410 411 /* LINTED */ 412 iuvd = (struct iuvd_desc *)buf; 413 414 if ((set_flags & SET_VOLNAME) == SET_VOLNAME) { --- 8 unchanged lines hidden (view full) --- 423 set_dstring(iuvd->iuvd_ifo2, 424 lvinfo2_buf, sizeof (iuvd->iuvd_ifo2)); 425 } 426 if ((set_flags & SET_LVINFO3) == SET_LVINFO3) { 427 set_dstring(iuvd->iuvd_ifo3, 428 lvinfo3_buf, sizeof (iuvd->iuvd_ifo3)); 429 } 430 |
424 ud_make_tag(&iuvd->iuvd_tag, | 431 ud_make_tag(udh, &iuvd->iuvd_tag, |
425 SWAP_16(iuvd->iuvd_tag.tag_id), 426 SWAP_32(iuvd->iuvd_tag.tag_loc), 427 SWAP_16(iuvd->iuvd_tag.tag_crc_len)); 428 | 432 SWAP_16(iuvd->iuvd_tag.tag_id), 433 SWAP_32(iuvd->iuvd_tag.tag_loc), 434 SWAP_16(iuvd->iuvd_tag.tag_crc_len)); 435 |
429 (void) ud_write_dev(fd, off, buf, | 436 (void) ud_write_dev(udh, off, buf, |
430 sizeof (struct iuvd_desc)); 431 } 432 } 433 434 if (((set_flags & (SET_FSNAME | SET_VOLNAME)) == 435 (SET_FSNAME | SET_VOLNAME)) && 436 (v->lvd_len)) { 437 | 437 sizeof (struct iuvd_desc)); 438 } 439 } 440 441 if (((set_flags & (SET_FSNAME | SET_VOLNAME)) == 442 (SET_FSNAME | SET_VOLNAME)) && 443 (v->lvd_len)) { 444 |
438 off = v->lvd_loc * udfs.lbsize; 439 if (ud_read_dev(fd, off, buf, | 445 off = v->lvd_loc * udh->udfs.lbsize; 446 if (ud_read_dev(udh, off, buf, |
440 sizeof (struct log_vol_desc)) == 0) { 441 442 struct log_vol_desc *lvd; 443 444 /* LINTED */ 445 lvd = (struct log_vol_desc *)buf; 446 set_dstring(lvd->lvd_lvid, 447 volname, sizeof (lvd->lvd_lvid)); 448 | 447 sizeof (struct log_vol_desc)) == 0) { 448 449 struct log_vol_desc *lvd; 450 451 /* LINTED */ 452 lvd = (struct log_vol_desc *)buf; 453 set_dstring(lvd->lvd_lvid, 454 volname, sizeof (lvd->lvd_lvid)); 455 |
449 ud_make_tag(&lvd->lvd_tag, | 456 ud_make_tag(udh, &lvd->lvd_tag, |
450 SWAP_16(lvd->lvd_tag.tag_id), 451 SWAP_32(lvd->lvd_tag.tag_loc), 452 SWAP_16(lvd->lvd_tag.tag_crc_len)); 453 | 457 SWAP_16(lvd->lvd_tag.tag_id), 458 SWAP_32(lvd->lvd_tag.tag_loc), 459 SWAP_16(lvd->lvd_tag.tag_crc_len)); 460 |
454 (void) ud_write_dev(fd, off, buf, | 461 (void) ud_write_dev(udh, off, buf, |
455 sizeof (struct log_vol_desc)); 456 } 457 } 458} 459 460 461int32_t 462convert_string(int8_t *value, int8_t *out_buf, int32_t out_len, --- 43 unchanged lines hidden --- | 462 sizeof (struct log_vol_desc)); 463 } 464 } 465} 466 467 468int32_t 469convert_string(int8_t *value, int8_t *out_buf, int32_t out_len, --- 43 unchanged lines hidden --- |