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. 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 /* @(#)labelit.c 1.1 90/01/22 SMI */ 23 /* 24 * Copyright (c) 1989, 1990 by Sun Microsystems, Inc. 25 * 26 */ 27 /* 28 * labelit [option=value ...] cdimage 29 * where options are: 30 sysid system identifier (a characters, 32 max) 31 volid: volume identifier (d-characters, 32 max) 32 volsetid: volume set identifier (d-characters, 128 max) 33 pubid: publisher identifier (d-characters, 128 max) 34 prepid: data preparer identifier (d-charcter, 128 max) 35 applid: application identifier (d-charcter, 128 max) 36 copyfile: copyright file identifier (d-characters, 128 max) 37 absfile: abstract file identifier (d-characters, 37 max) 38 bibfile: bibliographic file identifier (d-charcters, 37 max) 39 */ 40 41 #pragma ident "%Z%%M% %I% %E% SMI" 42 43 44 #include <fcntl.h> 45 #include <stdio.h> 46 #include <sys/param.h> 47 #include <sys/stat.h> 48 #include <sys/time.h> 49 #include <sys/types.h> 50 #include <sys/file.h> 51 #include <dirent.h> 52 #include "hsfs_spec.h" 53 #include "iso_spec.h" 54 #include "iso_impl.h" 55 56 #define PUTSECTOR(buf, secno, nosec) (putdisk(buf, (secno)*ISO_SECTOR_SIZE, \ 57 (nosec)*ISO_SECTOR_SIZE)) 58 #define GETSECTOR(buf, secno, nosec) (getdisk(buf, (secno)*ISO_SECTOR_SIZE, \ 59 (nosec)*ISO_SECTOR_SIZE)) 60 61 char *string; 62 #define MAXERRSTRNG 80 63 char errstrng[MAXERRSTRNG]; 64 char callname[160]; 65 66 int cdfd; 67 int cd_type; 68 char hs_buf[ISO_SECTOR_SIZE]; 69 int hs_pvd_sec_no; 70 char iso_buf[ISO_SECTOR_SIZE]; 71 int iso_pvd_sec_no; 72 char unix_buf[ISO_SECTOR_SIZE]; 73 int unix_pvd_sec_no; 74 char *vdp; 75 char *sysid; 76 char *volid; 77 char *volsetid; 78 char *pubid; 79 char *prepid; 80 char *applid; 81 char *copyfile; 82 char *absfile; 83 char *bibfile; 84 int volsetsize; 85 int volsetseq; 86 int blksize; 87 int volsize; 88 89 main(argc, argv) 90 int argc; 91 char **argv; 92 { 93 register c; 94 int openopt; 95 96 strcpy(callname, argv[0]); 97 for(c=1; c<argc; c++) { 98 string = argv[c]; 99 if(match("sysid=")) { 100 sysid = string; 101 continue; 102 } 103 if(match("volid=")) { 104 volid = string; 105 continue; 106 } 107 if(match("volsetid=")) { 108 volsetid = string; 109 continue; 110 } 111 if (match("pubid=")) { 112 pubid = string; 113 continue; 114 } 115 if(match("prepid=")) { 116 prepid = string; 117 continue; 118 } 119 if(match("applid=")) { 120 applid = string; 121 continue; 122 } 123 if(match("copyfile=")) { 124 copyfile = string; 125 continue; 126 } 127 if(match("absfile=")) { 128 absfile = string; 129 continue; 130 } 131 if(match("bibfile=")) { 132 bibfile = string; 133 continue; 134 } 135 break; 136 } 137 /* the last argument must be the cdrom iamge file */ 138 if (argc != c+1) { 139 if (argc > 1) 140 fprintf(stderr, "%s: Illegal option %s in input\n", 141 callname, string); 142 usage(); 143 } 144 145 /* open image file in read write only if necessary */ 146 if (argc == 2) openopt = O_RDONLY; 147 else openopt = O_RDWR; 148 149 if ((cdfd = open(argv[c], openopt)) < 0) { 150 if (strchr(argv[c], '=') || 151 strchr(argv[c], '-')) usage(); 152 sprintf(errstrng, "%s: main: open(): ", callname); 153 perror(errstrng); 154 exit(32); 155 } 156 157 /* check volume descriptor */ 158 (void) ckvoldesc(); 159 160 if (cd_type < 0) { 161 fprintf(stderr, "%s: unknown cdrom format label\n", callname); 162 exit(32); 163 } 164 165 /* update label, if needed */ 166 if (argc != 2) updatelabel(); 167 168 /* print the (updated) image label */ 169 prntlabel(); 170 171 close(cdfd); 172 exit(0); 173 } 174 175 usage() 176 { 177 fprintf(stderr, "usage: %s [-F ufs] [option=value ...] cdimage\n", 178 callname); 179 exit(32); 180 } 181 182 /* 183 * findhsvol: check if the disk is in high sierra format 184 * return(1) if found, (0) otherwise 185 * if found, volp will point to the descriptor 186 * 187 */ 188 int 189 findhsvol(volp) 190 char *volp; 191 { 192 int secno; 193 int i; 194 195 secno = HS_VOLDESC_SEC; 196 GETSECTOR(volp, secno++, 1); 197 while (HSV_DESC_TYPE(volp) != VD_EOV) { 198 for (i = 0; i < HSV_ID_STRLEN; i++) 199 if (HSV_STD_ID(volp)[i] != HSV_ID_STRING[i]) 200 goto cantfind; 201 if (HSV_STD_VER(volp) != HSV_ID_VER) 202 goto cantfind; 203 switch (HSV_DESC_TYPE(volp)) { 204 case VD_SFS: 205 hs_pvd_sec_no = secno-1; 206 return (1); 207 case VD_EOV: 208 goto cantfind; 209 } 210 GETSECTOR(volp, secno++, 1); 211 } 212 cantfind: 213 return (0); 214 } 215 216 /* 217 * findisovol: check if the disk is in ISO 9660 format 218 * return(1) if found, (0) otherwise 219 * if found, volp will point to the descriptor 220 * 221 */ 222 int 223 findisovol(volp) 224 char *volp; 225 { 226 int secno; 227 int i; 228 229 secno = ISO_VOLDESC_SEC; 230 GETSECTOR(volp, secno++, 1); 231 while (ISO_DESC_TYPE(volp) != ISO_VD_EOV) { 232 for (i = 0; i < ISO_ID_STRLEN; i++) 233 if (ISO_STD_ID(volp)[i] != ISO_ID_STRING[i]) 234 goto cantfind; 235 if (ISO_STD_VER(volp) != ISO_ID_VER) 236 goto cantfind; 237 switch (ISO_DESC_TYPE(volp)) { 238 case ISO_VD_PVD: 239 iso_pvd_sec_no = secno-1; 240 return (1); 241 case ISO_VD_EOV: 242 goto cantfind; 243 } 244 GETSECTOR(volp, secno++, 1); 245 } 246 cantfind: 247 return (0); 248 } 249 250 /* 251 * findunixvol: check if the disk is in UNIX extension format 252 * return(1) if found, (0) otherwise 253 * if found, volp will point to the descriptor 254 * 255 */ 256 int 257 findunixvol(volp) 258 char *volp; 259 { 260 int secno; 261 int i; 262 263 secno = ISO_VOLDESC_SEC; 264 GETSECTOR(volp, secno++, 1); 265 while (ISO_DESC_TYPE(volp) != ISO_VD_EOV) { 266 for (i = 0; i < ISO_ID_STRLEN; i++) 267 if (ISO_STD_ID(volp)[i] != ISO_ID_STRING[i]) 268 goto cantfind; 269 if (ISO_STD_VER(volp) != ISO_ID_VER) 270 goto cantfind; 271 switch (ISO_DESC_TYPE(volp)) { 272 case ISO_VD_UNIX: 273 unix_pvd_sec_no = secno-1; 274 return (1); 275 case ISO_VD_EOV: 276 goto cantfind; 277 } 278 GETSECTOR(volp, secno++, 1); 279 } 280 cantfind: 281 return (0); 282 } 283 284 ckvoldesc() 285 { 286 if (findhsvol(hs_buf)) 287 cd_type = 0; 288 else if (findisovol(iso_buf)) { 289 if (findunixvol(unix_buf)) 290 cd_type = 2; 291 else cd_type = 1; 292 } 293 else cd_type = -1; 294 } 295 296 updatelabel() 297 { 298 switch (cd_type) { 299 case 0: 300 copystring(sysid, HSV_sys_id(hs_buf), 32); 301 copystring(volid, HSV_vol_id(hs_buf), 32); 302 copystring(volsetid, HSV_vol_set_id(hs_buf), 128); 303 copystring(pubid, HSV_pub_id(hs_buf), 128); 304 copystring(prepid, HSV_prep_id(hs_buf), 128); 305 copystring(applid, HSV_appl_id(hs_buf), 128); 306 copystring(copyfile, HSV_copyr_id(hs_buf), 37); 307 copystring(absfile, HSV_abstr_id(hs_buf), 37); 308 PUTSECTOR(hs_buf, hs_pvd_sec_no, 1); 309 break; 310 case 2: 311 copystring(sysid, ISO_sys_id(unix_buf), 32); 312 copystring(volid, ISO_vol_id(unix_buf), 32); 313 copystring(volsetid, ISO_vol_set_id(unix_buf), 128); 314 copystring(pubid, ISO_pub_id(unix_buf), 128); 315 copystring(prepid, ISO_prep_id(unix_buf), 128); 316 copystring(applid, ISO_appl_id(unix_buf), 128); 317 copystring(copyfile, ISO_copyr_id(unix_buf), 37); 318 copystring(absfile, ISO_abstr_id(unix_buf), 37); 319 copystring(bibfile, ISO_bibli_id(unix_buf), 37); 320 PUTSECTOR(unix_buf, unix_pvd_sec_no, 1); 321 /* after update unix volume descriptor, 322 fall thru to update the iso primary vol descriptor */ 323 case 1: 324 copystring(sysid, ISO_sys_id(iso_buf), 32); 325 copystring(volid, ISO_vol_id(iso_buf), 32); 326 copystring(volsetid, ISO_vol_set_id(iso_buf), 128); 327 copystring(pubid, ISO_pub_id(iso_buf), 128); 328 copystring(prepid, ISO_prep_id(iso_buf), 128); 329 copystring(applid, ISO_appl_id(iso_buf), 128); 330 copystring(copyfile, ISO_copyr_id(iso_buf), 37); 331 copystring(absfile, ISO_abstr_id(iso_buf), 37); 332 copystring(bibfile, ISO_bibli_id(iso_buf), 37); 333 PUTSECTOR(iso_buf, iso_pvd_sec_no, 1); 334 break; 335 } 336 } 337 338 prntlabel() 339 { 340 int i; 341 switch (cd_type) { 342 case 0: 343 printf("CD-ROM is in High Sierra format\n"); 344 sysid=(char *)HSV_sys_id(hs_buf); 345 volid=(char *)HSV_vol_id(hs_buf); 346 volsetid=(char *)HSV_vol_set_id(hs_buf); 347 pubid=(char *)HSV_pub_id(hs_buf); 348 prepid=(char *)HSV_prep_id(hs_buf); 349 applid=(char *)HSV_appl_id(hs_buf); 350 copyfile=(char *)HSV_copyr_id(hs_buf); 351 absfile=(char *)HSV_abstr_id(hs_buf); 352 bibfile=NULL; 353 volsetsize= HSV_SET_SIZE(hs_buf); 354 volsetseq= HSV_SET_SEQ(hs_buf); 355 blksize= HSV_BLK_SIZE(hs_buf); 356 volsize= HSV_VOL_SIZE(hs_buf); 357 break; 358 case 1: 359 printf("CD-ROM is in ISO 9660 format\n"); 360 sysid=(char *) ISO_sys_id(iso_buf); 361 volid=(char *)ISO_vol_id(iso_buf); 362 volsetid=(char *)ISO_vol_set_id(iso_buf); 363 pubid=(char *)ISO_pub_id(iso_buf); 364 prepid=(char *)ISO_prep_id(iso_buf); 365 applid=(char *)ISO_appl_id(iso_buf); 366 copyfile=(char *)ISO_copyr_id(iso_buf); 367 absfile=(char *)ISO_abstr_id(iso_buf); 368 bibfile=(char *)ISO_bibli_id(iso_buf); 369 volsetsize=ISO_SET_SIZE(iso_buf); 370 volsetseq=ISO_SET_SEQ(iso_buf); 371 blksize=ISO_BLK_SIZE(iso_buf); 372 volsize=ISO_VOL_SIZE(iso_buf); 373 break; 374 case 2: 375 printf("CD-ROM is in ISO 9660 format with UNIX extension\n"); 376 sysid=(char *)ISO_sys_id(unix_buf); 377 volid=(char *)ISO_vol_id(unix_buf); 378 volsetid=(char *)ISO_vol_set_id(unix_buf); 379 pubid=(char *)ISO_pub_id(unix_buf); 380 prepid=(char *)ISO_prep_id(unix_buf); 381 applid=(char *)ISO_appl_id(unix_buf); 382 copyfile=(char *)ISO_copyr_id(unix_buf); 383 absfile=(char *)ISO_abstr_id(unix_buf); 384 bibfile=(char *)ISO_bibli_id(unix_buf); 385 volsetsize=ISO_SET_SIZE(unix_buf); 386 volsetseq=ISO_SET_SEQ(unix_buf); 387 blksize=ISO_BLK_SIZE(unix_buf); 388 volsize=ISO_VOL_SIZE(unix_buf); 389 break; 390 default: 391 return; 392 } 393 /* system id */ 394 prntstring("System id", sysid, 32); 395 /* read volume id */ 396 prntstring("Volume id", volid, 32); 397 /* read volume set id */ 398 prntstring("Volume set id", volsetid, 128); 399 /* publisher id */ 400 prntstring("Publisher id", pubid, 128); 401 /* data preparer id */ 402 prntstring("Data preparer id", prepid, 128); 403 /* application id */ 404 prntstring("Application id", applid, 128); 405 /* copyright file identifier */ 406 prntstring("Copyright File id", copyfile, 37); 407 /* Abstract file identifier */ 408 prntstring("Abstract File id", absfile, 37); 409 /* Bibliographic file identifier */ 410 prntstring("Bibliographic File id", bibfile, 37); 411 /* print volume set size */ 412 printf("Volume set size is %d\n", volsetsize); 413 /* print volume set sequnce number */ 414 printf("Volume set sequence number is %d\n", volsetseq); 415 /* print logical block size */ 416 printf("Logical block size is %d\n", blksize); 417 /* print volume size */ 418 printf("Volume size is %d\n", volsize); 419 } 420 421 copystring (from, to, size) 422 char *from; 423 char *to; 424 int size; 425 { 426 int i; 427 428 if (from == NULL) return; 429 for (i=0;i<size;i++) { 430 if (*from == '\0') break; 431 else *to++=*from++; 432 } 433 for (;i<size;i++) *to++=' '; 434 } 435 436 prntstring(heading, s, maxlen) 437 char * heading; 438 char *s; 439 int maxlen; 440 { 441 int i; 442 if (maxlen < 1) return; 443 if (heading == NULL || s == NULL) return; 444 /* print heading */ 445 printf("%s: ", heading); 446 447 /* strip off trailing zeros */ 448 for (i=maxlen-1;i >= 0; i--) 449 if (s[i] != ' ') break; 450 451 maxlen = i+1; 452 for (i=0;i<maxlen;i++) printf("%c", s[i]); 453 printf("\n"); 454 } 455 456 match(s) 457 char *s; 458 { 459 register char *cs; 460 461 cs = string; 462 while(*cs++ == *s) 463 if(*s++ == '\0') 464 goto true; 465 if(*s != '\0') 466 return(0); 467 468 true: 469 cs--; 470 string = cs; 471 return(1); 472 } 473 474 /*readdisk - read from cdrom image file */ 475 getdisk(buf, daddr, size) 476 char *buf; /* buffer area */ 477 int daddr; /* disk addr */ 478 int size; /* no. of byte */ 479 { 480 481 if (lseek(cdfd, daddr, L_SET) == -1) { 482 sprintf(errstrng, "%s: getdisk: lseek()", callname); 483 perror(errstrng); 484 exit(32); 485 } 486 if (read(cdfd, buf, size) != size) { 487 sprintf(errstrng, "%s: getdisk: read()", callname ); 488 perror(errstrng); 489 exit(32); 490 } 491 492 } 493 494 /*putdisk - write to cdrom image file */ 495 putdisk(buf, daddr, size) 496 char *buf; /* buffer area */ 497 int daddr; /* disk addr */ 498 int size; /* no. of byte */ 499 { 500 501 if (lseek(cdfd, daddr, L_SET) == -1) { 502 sprintf(errstrng, "%s: putdisk: lseek()", callname); 503 perror(errstrng); 504 exit(32); 505 } 506 if (write(cdfd, buf, size) != size) { 507 sprintf(errstrng, "%s: putdisk: write()", callname); 508 perror(errstrng); 509 exit(32); 510 } 511 } 512 513