|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1996 The University of Utah and ! 3: * the Computer Systems Laboratory at the University of Utah (CSL). ! 4: * All rights reserved. ! 5: * ! 6: * Permission to use, copy, modify and distribute this software is hereby ! 7: * granted provided that (1) source code retains these copyright, permission, ! 8: * and disclaimer notices, and (2) redistributions including binaries ! 9: * reproduce the notices in supporting documentation, and (3) all advertising ! 10: * materials mentioning features or use of this software display the following ! 11: * acknowledgement: ``This product includes software developed by the ! 12: * Computer Systems Laboratory at the University of Utah.'' ! 13: * ! 14: * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS ! 15: * IS" CONDITION. THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF ! 16: * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 17: * ! 18: * CSL requests users of this software to return to [email protected] any ! 19: * improvements that they make and grant CSL redistribution rights. ! 20: * ! 21: * Author: Kevin T. Van Maren, University of Utah CSL ! 22: */ ! 23: ! 24: /* ! 25: * Mach Operating System ! 26: * Copyright (c) 1991,1990 Carnegie Mellon University ! 27: * All Rights Reserved. ! 28: * ! 29: * Permission to use, copy, modify and distribute this software and its ! 30: * documentation is hereby granted, provided that both the copyright ! 31: * notice and this permission notice appear in all copies of the ! 32: * software, derivative works or modified versions, and any portions ! 33: * thereof, and that both notices appear in supporting documentation. ! 34: * ! 35: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" ! 36: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR ! 37: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 38: * ! 39: * Carnegie Mellon requests users of this software to return to ! 40: * ! 41: * Software Distribution Coordinator or [email protected] ! 42: * School of Computer Science ! 43: * Carnegie Mellon University ! 44: * Pittsburgh PA 15213-3890 ! 45: * ! 46: * any improvements or extensions that they make and grant Carnegie Mellon ! 47: * the rights to redistribute these changes. ! 48: */ ! 49: ! 50: /* ! 51: * Copyright (c) 1994 Shantanu Goel ! 52: * All Rights Reserved. ! 53: * ! 54: * Permission to use, copy, modify and distribute this software and its ! 55: * documentation is hereby granted, provided that both the copyright ! 56: * notice and this permission notice appear in all copies of the ! 57: * software, derivative works or modified versions, and any portions ! 58: * thereof, and that both notices appear in supporting documentation. ! 59: * ! 60: * THE AUTHOR ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" ! 61: * CONDITION. THE AUTHOR DISCLAIMS ANY LIABILITY OF ANY KIND FOR ! 62: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 63: * ! 64: */ ! 65: ! 66: /* This file contains the partition code that is used by the Mach ! 67: * device drivers (ide & scsi). */ ! 68: ! 69: #include <scsi/compat_30.h> ! 70: #include <sys/types.h> ! 71: ! 72: #include <scsi/rz_labels.h> ! 73: #include <i386at/disk.h> /* combine & rename these... */ ! 74: ! 75: #define SECTOR_SIZE 512 /* BAD!!! */ ! 76: ! 77: #define DSLICE(dev) ((dev >> 4) & 0x3f) ! 78: #define DPART(dev) (dev & 0xf) ! 79: ! 80: /* note: 0 will supress ALL output; ! 81: 1 is 'normal' output; 2 is verbose; 3 is Very verbose */ ! 82: #define PARTITION_DEBUG 1 ! 83: ! 84: #define min(x,y) (x<y?x:y) ! 85: ! 86: /* ! 87: * Label that is filled in with extra info ! 88: */ ! 89: struct disklabel default_label = ! 90: { ! 91: DISKMAGIC, DTYPE_SCSI, 0, ! 92: "SCSI", "", ! 93: DEV_BSIZE, 1, 1, 1, 1, 1, 0, 0, 0, ! 94: 3600, 1, 1, 1, 0, 0, 0, ! 95: {0,}, {0,}, ! 96: DISKMAGIC, 0, ! 97: 8, 8192, 8192, ! 98: {{ -1, 0, 1024, FS_BSDFFS, 8, 3 }, ! 99: { -1, 0, 1024, FS_BSDFFS, 8, 3 }, ! 100: { -1, 0, 1024, FS_BSDFFS, 8, 3 }, ! 101: { -1, 0, 1024, FS_BSDFFS, 8, 3 }, ! 102: { -1, 0, 1024, FS_BSDFFS, 8, 3 }, ! 103: { -1, 0, 1024, FS_BSDFFS, 8, 3 }, ! 104: { -1, 0, 1024, FS_BSDFFS, 8, 3 }, ! 105: { -1, 0, 1024, FS_BSDFFS, 8, 3 }} ! 106: }; ! 107: ! 108: ! 109: ! 110: /* the device driver calls this just to save some info it got from the HW */ ! 111: /* This is a bad holdover from the disklabel days, and needs to go */ ! 112: fudge_bsd_label(struct disklabel *label, int type, int total_secs, int heads, int sectors, int sectorsize, int n) ! 113: { ! 114: *label=default_label; ! 115: ! 116: label->d_ncylinders = total_secs/(heads*sectors); ! 117: label->d_ntracks = heads; ! 118: label->d_nsectors = sectors; ! 119: ! 120: label->d_secpercyl = heads*sectors; ! 121: label->d_secperunit = total_secs; ! 122: ! 123: /* this is never used, but ... */ ! 124: label->d_partitions[MAXPARTITIONS].p_offset = 0; ! 125: label->d_partitions[MAXPARTITIONS].p_size = total_secs; ! 126: ! 127: /* ?? ! 128: */ ! 129: label->d_secsize = sectorsize; ! 130: label->d_type = type; ! 131: label->d_subtype = 0xa; /* ??? */ ! 132: ! 133: label->d_npartitions = n; /* up to 'c' */ ! 134: label->d_checksum = 0; ! 135: ! 136: /* should do a checksum on it now */ ! 137: } ! 138: ! 139: ! 140: ! 141: /* This is placed here to ! 142: a. provide comparability with existing servers ! 143: b. allow the use of FreeBSD-style slices to access ANY disk partition ! 144: c. provide an easy migration path to lites-based partition code ! 145: by only passing the drive name to get the entire disk (sd0). ! 146: ! 147: This will be called by every routine that needs to access partition info ! 148: based on a device number. It is slower than the old method of indexing ! 149: into a disklabel, but is more flexible, and reasonably fast in the (future) ! 150: case where Lites will access the whole disk. An array of disklabels ! 151: could have been used, but this is more compact and general. The underlying ! 152: structure does not limit it to 2-levels, but keeping the kernel interface ! 153: simple does. */ ! 154: ! 155: ! 156: /* this code and data structure based on conversation with Bryan Ford */ ! 157: /* Note: this is called ON EVERY read or write. It makes sense to ! 158: optimize this for the common case. Hopefully the common case ! 159: will become the '0,0' case, as partitioning is moved out of the ! 160: kernel. (Downside is kernel can't protect filesystems from each other). ! 161: It is slower than indexing into a 1-D array, but not much. */ ! 162: ! 163: struct diskpart *lookup_part(struct diskpart *array, int dev_number) ! 164: { ! 165: /* Note: 10 bit encoding to get partitions 0-15 (0,a-h typically), and slices ! 166: * 0-63 ! 167: */ ! 168: ! 169: int slice = DSLICE(dev_number); ! 170: int part = DPART(dev_number); ! 171: struct diskpart *s; ! 172: ! 173: if (slice == 0) /* compatability slice */ ! 174: { ! 175: if (part == 0) /* whole disk */ ! 176: return &array[0]; ! 177: ! 178: if (array[0].type == DISKPART_DOS) ! 179: { ! 180: int i; ! 181: for (i = 0; i < array[0].nsubs; i++) ! 182: { ! 183: s = &array[0].subs[i]; ! 184: if ( s->type == DISKPART_BSD ! 185: || s->type == DISKPART_VTOC) ! 186: { ! 187: if (part > s->nsubs) ! 188: return 0; ! 189: return (&s->subs[part-1]); ! 190: } ! 191: } ! 192: } ! 193: ! 194: if (part > array[0].nsubs) ! 195: return 0; ! 196: return(&array[0].subs[part-1]); ! 197: } ! 198: else ! 199: { ! 200: if ( array[0].type != DISKPART_DOS ! 201: || slice > array[0].nsubs) ! 202: return 0; ! 203: ! 204: s = &array[0].subs[slice-1]; ! 205: ! 206: if (part == 0) /* whole slice */ ! 207: return (s); ! 208: if (part > s->nsubs) ! 209: return 0; ! 210: ! 211: return (&s->subs[part-1]); ! 212: } ! 213: } ! 214: ! 215: ! 216: ! 217: ! 218: static inline void fill_array(struct diskpart *array, int start, int size, ! 219: struct diskpart *subs, int nsubs, short type, short fsys) ! 220: { ! 221: array->start=start; ! 222: array->size=size; ! 223: array->subs=subs; ! 224: array->nsubs=nsubs; ! 225: array->type=type; ! 226: array->fsys=fsys; ! 227: #if (PARTITION_DEBUG > 2) ! 228: printf("fill: type %d:%d, start %d, size %d, %d parts\n",type,fsys, ! 229: start,size,nsubs); ! 230: #endif ! 231: } ! 232: ! 233: ! 234: ! 235: ! 236: void print_array(struct diskpart *array, int level) ! 237: { ! 238: int i,j; ! 239: struct diskpart *subs; ! 240: ! 241: #if (PARTITION_DEBUG) ! 242: subs=array[0].subs; ! 243: ! 244: for (i=0;i<array[0].nsubs;i++) { ! 245: for (j=0;j<level;j++) ! 246: printf(" "); ! 247: printf("%c: %d, %d, %d, %d (%d subparts)\n",'a'+i, ! 248: subs[i].start, subs[i].size, subs[i].fsys, ! 249: subs[i].type, subs[i].nsubs); ! 250: if (subs[i].nsubs>0) ! 251: print_array(&subs[i], level+1); ! 252: } ! 253: #endif ! 254: } ! 255: ! 256: ! 257: ! 258: /* individual routines to find the drive labels. ! 259: There needs to be a function for every different method for partitioning ! 260: much of the following code is derived from the SCSI/IDE drivers */ ! 261: ! 262: int get_dos(struct diskpart *array, char *buff, int start, ! 263: void *driver_info, int (*bottom_read_fun)(), ! 264: char *name, int max_part) ! 265: { ! 266: ! 267: bios_label_t *mp; ! 268: struct bios_partition_info *pp; ! 269: ! 270: int count, i, j; ! 271: int pstart, psize; ! 272: int ext=-1, mystart=start, mybase; ! 273: int first=1; ! 274: ! 275: /* note: start is added, although a start != 0 is meaningless ! 276: to DOS and anything else... */ ! 277: ! 278: /* check the boot sector for a partition table. */ ! 279: (*bottom_read_fun)(driver_info, start, buff); /* always in sector 0 */ ! 280: ! 281: /* ! 282: * Check for valid partition table. ! 283: */ ! 284: mp = (bios_label_t *)&buff[BIOS_LABEL_BYTE_OFFSET]; ! 285: if (mp->magic != BIOS_LABEL_MAGIC) { ! 286: #if (PARTITION_DEBUG>1) ! 287: printf("%s invalid partition table\n", name); ! 288: #endif ! 289: return(0); /* didn't add any partitions */ ! 290: } ! 291: #if (PARTITION_DEBUG>1) ! 292: printf("DOS partition table found\n"); ! 293: #endif ! 294: ! 295: count=min(4,max_part); /* always 4 (primary) partitions */ ! 296: #if (PARTITION_DEBUG) ! 297: if (count<4) printf("More partitions than space!\n"); ! 298: #endif ! 299: ! 300: ! 301: /* fill the next 4 entries in the array */ ! 302: for (i=0, pp=(struct bios_partition_info *)mp->partitions; ! 303: i<count; i++,pp++) { ! 304: ! 305: fill_array(&array[i], pp->offset, pp->n_sectors, NULL, 0, ! 306: DISKPART_NONE, pp->systid); ! 307: if ((pp->systid == DOS_EXTENDED) &&(ext<0)) { ! 308: mystart+=pp->offset; ! 309: ext=i; ! 310: } ! 311: } ! 312: ! 313: /* if there is an extended partition, find all the logical partitions */ ! 314: /* note: logical start at '5' (extended is one of the numbered 1-4) */ ! 315: ! 316: /* logical partitions 'should' be nested inside the primary, but ! 317: then it would be impossible to NAME a disklabel inside a logical ! 318: partition, which would be nice to do */ ! 319: #if (PARTITION_DEBUG>1) ! 320: if (ext>=0) ! 321: printf("extended partition found: %d\n",ext); ! 322: #endif 0 ! 323: ! 324: while (ext>=0) { ! 325: pp = &(((struct bios_partition_info *)mp->partitions)[ext]); ! 326: ! 327: /* read the EXTENDED partition table */ ! 328: if (first) { ! 329: mybase=mystart; ! 330: first=0; ! 331: } else { ! 332: mybase=mystart+pp->offset; ! 333: } ! 334: ! 335: (*bottom_read_fun)(driver_info, mybase, buff); ! 336: ! 337: if (mp->magic != BIOS_LABEL_MAGIC) { ! 338: #if (PARTITION_DEBUG>1) ! 339: printf("%s invalid expanded magic\n", name); ! 340: #endif ! 341: return(count);/*don't add any more partitions*/ ! 342: } ! 343: ! 344: /* just in case more than one partition is there...*/ ! 345: /* search the EXTENDED partition table */ ! 346: ext=-1; ! 347: for (j=0,pp=(struct bios_partition_info *)mp->partitions; ! 348: j<4; j++,pp++) { ! 349: ! 350: if (pp->systid && (pp->systid!=DOS_EXTENDED)) { ! 351: if (count<max_part) { ! 352: fill_array(&array[count], ! 353: mybase +pp->offset, ! 354: pp->n_sectors, NULL, 0, DISKPART_NONE, ! 355: pp->systid); ! 356: count++; } ! 357: else { ! 358: #if (PARTITION_DEBUG) ! 359: printf("More partitions than space!\n"); ! 360: #endif ! 361: return(count); ! 362: } ! 363: } else if ((ext<0) &&(pp->systid==DOS_EXTENDED)) { ! 364: ext=j; ! 365: /* recursivly search the chain here */ ! 366: } ! 367: } ! 368: } ! 369: #if (PARTITION_DEBUG>1) ! 370: printf("%d dos partitions\n",count); ! 371: #endif 0 ! 372: return(count); /* number dos partitions found */ ! 373: ! 374: } ! 375: ! 376: ! 377: ! 378: /* this should work on the bare drive, or in a dos partition */ ! 379: int get_disklabel(struct diskpart *array, char *buff, int start, ! 380: void *driver_info, int (*bottom_read_fun)(), ! 381: char *name, int max_part) ! 382: { ! 383: struct disklabel *dlp; ! 384: int mybase = start + (512 * LBLLOC)/SECTOR_SIZE, i; ! 385: int count; ! 386: ! 387: (*bottom_read_fun)(driver_info, mybase, buff); ! 388: ! 389: dlp = (struct disklabel *)buff; ! 390: if (dlp->d_magic != DISKMAGIC || dlp->d_magic2 != DISKMAGIC) { ! 391: #if (PARTITION_DEBUG>1) ! 392: printf("%s no BSD label found\n",name); ! 393: #endif ! 394: return(0); /* no partitions added */ ! 395: } ! 396: #if (PARTITION_DEBUG>1) ! 397: printf(" BSD LABEL\n"); ! 398: #endif 0 ! 399: /* note: BSD disklabel offsets are from start of DRIVE -- uuggh */ ! 400: ! 401: count=min(8,max_part); /* always 8 in a disklabel */ ! 402: #if (PARTITION_DEBUG) ! 403: if (count<8) printf("More partitions than space!\n"); ! 404: #endif ! 405: /* COPY into the array */ ! 406: for (i=0;i<count;i++) ! 407: fill_array(&array[i], /* mybase + */ ! 408: dlp->d_partitions[i].p_offset, ! 409: dlp->d_partitions[i].p_size, ! 410: NULL, 0, DISKPART_NONE, dlp->d_partitions[i].p_fstype); ! 411: ! 412: /* note: p_fstype is not the same set as the DOS types */ ! 413: ! 414: return(count); /* 'always' 8 partitions in disklabel -- if space */ ! 415: ! 416: /* UNREACHED CODE FOLLOWS: (alternative method in scsi) */ ! 417: #if 0 ! 418: (*bottom_read_fun)(driver_info, (start)+LABELSECTOR, buff); ! 419: ! 420: register int j; ! 421: boolean_t found; ! 422: ! 423: for (j = LABELOFFSET, found = FALSE; ! 424: j < (SECTOR_SIZE-sizeof(struct disklabel)); ! 425: j += sizeof(int)) { ! 426: search = (struct disklabel *)&buff[j]; ! 427: if (search->d_magic == DISKMAGIC && ! 428: search->d_magic2 == DISKMAGIC) { ! 429: found = TRUE; ! 430: break; ! 431: } ! 432: } ! 433: if (found) { ! 434: #if (PARTITION_DEBUG>1) ! 435: printf("Label found in LABELSECTOR\n"); ! 436: #endif ! 437: } else { ! 438: search = 0; ! 439: } ! 440: ! 441: ! 442: #endif 0 ! 443: ! 444: } ! 445: ! 446: ! 447: /* NOT TESTED! */ ! 448: /* VTOC in sector 29 */ ! 449: int get_vtoc(struct diskpart *array, char *buff, int start, ! 450: void *driver_info, int (*bottom_read_fun)(), ! 451: char *name, int max_part) ! 452: { ! 453: struct evtoc *evp; ! 454: int n,i; ! 455: struct disklabel lpl; ! 456: struct disklabel *lp = &lpl; ! 457: ! 458: #if (PARTITION_DEBUG) ! 459: printf("Read VTOC.\n"); ! 460: #endif ! 461: (*bottom_read_fun)(driver_info, start +PDLOCATION, buff); ! 462: evp = (struct evtoc *)buff; ! 463: if (evp->sanity != VTOC_SANE) { ! 464: #if (PARTITION_DEBUG) ! 465: printf("%s evtoc corrupt or not found\n", name); ! 466: #endif ! 467: return(0); ! 468: } ! 469: n = min(evp->nparts,max_part); /* no longer DISKLABEL limitations... */ ! 470: #if 0 ! 471: n = (evp->nparts > MAXPARTITIONS) ? MAXPARTITIONS : evp->nparts; ! 472: #endif 0 ! 473: ! 474: for (i = 0; i < n; i++) ! 475: fill_array(&array[i], /* mybase + */ ! 476: evp->part[i].p_start, ! 477: evp->part[i].p_size, ! 478: NULL, 0, DISKPART_NONE, FS_BSDFFS); ! 479: ! 480: return(n); /* (evp->nparts) */ ! 481: } ! 482: ! 483: ! 484: /* NOT TESTED! */ ! 485: int get_omron(struct diskpart *array, char *buff, int start, ! 486: void *driver_info, int (*bottom_read_fun)(), ! 487: char *name, int max_part) ! 488: { ! 489: ! 490: struct disklabel *label; ! 491: ! 492: /* here look for an Omron label */ ! 493: register omron_label_t *part; ! 494: int i; ! 495: ! 496: #if (PARTITION_DEBUG) ! 497: printf("Looking for Omron label...\n"); ! 498: #endif ! 499: ! 500: (*bottom_read_fun)(driver_info, start+ ! 501: OMRON_LABEL_BYTE_OFFSET/SECTOR_SIZE, buff); ! 502: ! 503: part = (omron_label_t*)&buff[OMRON_LABEL_BYTE_OFFSET%SECTOR_SIZE]; ! 504: if (part->magic == OMRON_LABEL_MAGIC) { ! 505: #if (PARTITION_DEBUG) ! 506: printf("{Using OMRON label}"); ! 507: #endif ! 508: for (i = 0; i < 8; i++) { ! 509: label->d_partitions[i].p_size = part->partitions[i].n_sectors; ! 510: label->d_partitions[i].p_offset = part->partitions[i].offset; ! 511: } ! 512: bcopy(part->packname, label->d_packname, 16); ! 513: label->d_ncylinders = part->ncyl; ! 514: label->d_acylinders = part->acyl; ! 515: label->d_ntracks = part->nhead; ! 516: label->d_nsectors = part->nsect; ! 517: /* Many disks have this wrong, therefore.. */ ! 518: #if 0 ! 519: label->d_secperunit = part->maxblk; ! 520: #else ! 521: label->d_secperunit = label->d_ncylinders * label->d_ntracks * ! 522: label->d_nsectors; ! 523: #endif 0 ! 524: ! 525: return(8); ! 526: } ! 527: #if (PARTITION_DEBUG) ! 528: printf("No Omron label found.\n"); ! 529: #endif ! 530: return(0); ! 531: } ! 532: ! 533: ! 534: /* NOT TESTED! */ ! 535: int get_dec(struct diskpart *array, char *buff, int start, ! 536: void *driver_info, int (*bottom_read_fun)(), ! 537: char *name, int max_part) ! 538: { ! 539: struct disklabel *label; ! 540: ! 541: /* here look for a DEC label */ ! 542: register dec_label_t *part; ! 543: int i; ! 544: ! 545: #if (PARTITION_DEBUG) ! 546: printf("Checking for dec_label...\n"); ! 547: #endif ! 548: ! 549: (*bottom_read_fun)(driver_info, start + ! 550: DEC_LABEL_BYTE_OFFSET/SECTOR_SIZE, buff); ! 551: ! 552: if (part->magic == DEC_LABEL_MAGIC) { ! 553: #if (PARTITION_DEBUG) ! 554: printf("{Using DEC label}"); ! 555: #endif ! 556: for (i = 0; i < 8; i++) { ! 557: label->d_partitions[i].p_size = part->partitions[i].n_sectors; ! 558: label->d_partitions[i].p_offset = part->partitions[i].offset; ! 559: } ! 560: return(8); ! 561: } ! 562: #if (PARTITION_DEBUG) ! 563: printf("No dec label found.\n"); ! 564: #endif ! 565: ! 566: return(0); ! 567: } ! 568: ! 569: ! 570: ! 571: ! 572: /* array is a pointer to an array of partition_info structures */ ! 573: /* array_size is the number of pre-allocated entries there are */ ! 574: int get_only_partition(void *driver_info, int (*bottom_read_fun)(), ! 575: struct diskpart *array, int array_size, ! 576: int disk_size, char *drive_name) ! 577: { ! 578: char buff[SECTOR_SIZE]; ! 579: int i,n,cnt; ! 580: int arrsize; ! 581: struct diskpart *res; ! 582: ! 583: /* first fill in the entire disk stuff */ ! 584: /* or should the calling routine do that already? */ ! 585: ! 586: fill_array(array, 0, disk_size, NULL, 0, -1, -1); ! 587: ! 588: /* while the structure does not preclude additional nestings, ! 589: additional ones make no sense currently, so they are not ! 590: checked (Mach can't handle them anyway). It might be nice ! 591: if for all partitions found, all types of sub-partitions ! 592: were looked for (unnecessary). This will be done when this ! 593: is moved out of ther kernel, and there is some way to name them */ ! 594: ! 595: arrsize = array_size -1; /* 1 for whole disk */ ! 596: ! 597: /* search for dos partition table */ ! 598: /* find all the partitions (including logical) */ ! 599: n=get_dos(&array[1], buff, 0, ! 600: driver_info, (bottom_read_fun), drive_name, ! 601: arrsize); ! 602: ! 603: if (n>0) { ! 604: fill_array(array, 0, disk_size, &array[1], n, ! 605: DISKPART_DOS, 256+DISKPART_DOS); ! 606: arrsize-=n; ! 607: ! 608: ! 609: /* search each one for a BSD disklabel (iff BSDOS) */ ! 610: /* note: searchine extended and logical partitions */ ! 611: for (i=0;i<n;i++) ! 612: if (array[i+1].fsys==BSDOS) { ! 613: #if (PARTITION_DEBUG) ! 614: printf("BSD OS slice: %d\n",i+1); ! 615: #endif ! 616: cnt=get_disklabel(&array[n+1], buff, ! 617: array[i+1].start, ! 618: driver_info, (bottom_read_fun), ! 619: drive_name,arrsize); ! 620: ! 621: if (cnt>0) { ! 622: arrsize-=cnt; ! 623: fill_array(&array[i+1],array[i+1].start, ! 624: array[i+1].size, &array[n+1], ! 625: cnt, DISKPART_BSD, ! 626: array[i+1].fsys); ! 627: } ! 628: n+=cnt; ! 629: } ! 630: ! 631: /* search for VTOC -- in a DOS partition as well */ ! 632: for (i=0;i<n;i++) ! 633: if (array[i+1].fsys==UNIXOS) { ! 634: #if (PARTITION_DEBUG) ! 635: printf("UNIXOS (vtoc) partition\n"); ! 636: #endif ! 637: cnt=get_vtoc(&array[n+1], buff, ! 638: array[i+1].start, ! 639: driver_info, (bottom_read_fun), ! 640: drive_name,arrsize); ! 641: ! 642: if (cnt>0) { ! 643: arrsize-=cnt; ! 644: fill_array(&array[i+1],array[i+1].start, ! 645: array[i+1].size, &array[n+1], ! 646: cnt, DISKPART_VTOC, ! 647: array[i+1].fsys); ! 648: } ! 649: n+=cnt; ! 650: } ! 651: } ! 652: ! 653: /* search for only disklabel */ ! 654: if (n==0) { ! 655: fill_array(array, 0, disk_size, &array[1], n, DISKPART_BSD, ! 656: 256+DISKPART_BSD); ! 657: n=get_disklabel(&array[1], buff, 0, driver_info, ! 658: (bottom_read_fun), drive_name,arrsize); ! 659: } ! 660: ! 661: /* search for only VTOC -- NOT TESTED! */ ! 662: if (n==0) { ! 663: fill_array(array, 0, disk_size, &array[1], n, DISKPART_VTOC, ! 664: 256+DISKPART_VTOC); ! 665: n=get_vtoc(&array[1], buff, 0, driver_info, (bottom_read_fun), ! 666: drive_name,arrsize); ! 667: } ! 668: #if 0 ! 669: /* search for only omron -- NOT TESTED! */ ! 670: if (n==0) { ! 671: fill_array(array, 0, disk_size, &array[1], n, DISKPART_OMRON, ! 672: 256+DISKPART_OMRON); ! 673: n=get_omron(&array[1], buff, 0,driver_info, (bottom_read_fun), ! 674: drive_name,arrsize); ! 675: } ! 676: ! 677: /* search for only dec -- NOT TESTED! */ ! 678: if (n==0) { ! 679: fill_array(array, 0, disk_size, &array[1], n, DISKPART_DEC, ! 680: 256+DISKPART_DEC); ! 681: n=get_dec(&array[1], buff, 0, driver_info, (bottom_read_fun), ! 682: drive_name,arrsize); ! 683: } ! 684: #endif 0 ! 685: ! 686: #if (PARTITION_DEBUG) /* print out what we found */ ! 687: print_array(array,0); ! 688: #endif ! 689: ! 690: } ! 691: ! 692:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.