|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: /* Copyright (c) 1992 by NeXT Computer, Inc. ! 25: * ! 26: * File: i386/disk_label.c - trivial native (i386) implementation ! 27: * of disk_label conversion API. ! 28: * ! 29: * HISTORY ! 30: * 01-Apr-92 Doug Mitchell at NeXT ! 31: * Created. ! 32: */ ! 33: ! 34: #import <bsd/dev/disk_label.h> ! 35: #import <driverkit/diskstruct.h> ! 36: #import <bsd/string.h> ! 37: #import <architecture/byte_order.h> ! 38: ! 39: static inline void get_char(const char *src, char *dest) ! 40: { ! 41: *dest = *src; ! 42: } ! 43: ! 44: static inline void get_short(const char *src, char *dest) ! 45: { ! 46: dest[0] = src[0]; ! 47: dest[1] = src[1]; ! 48: } ! 49: ! 50: static inline void get_word(const char *src, char *dest) ! 51: { ! 52: dest[0] = src[0]; ! 53: dest[1] = src[1]; ! 54: dest[2] = src[2]; ! 55: dest[3] = src[3]; ! 56: } ! 57: ! 58: static inline void put_char(const char *src, char *dest) ! 59: { ! 60: *dest = *src; ! 61: } ! 62: ! 63: static inline void put_short(const char *src, char *dest) ! 64: { ! 65: dest[0] = src[0]; ! 66: dest[1] = src[1]; ! 67: } ! 68: ! 69: static inline void put_word(const char *src, char *dest) ! 70: { ! 71: dest[0] = src[0]; ! 72: dest[1] = src[1]; ! 73: dest[2] = src[2]; ! 74: dest[3] = src[3]; ! 75: } ! 76: ! 77: ! 78: /* ! 79: * Convert from native (m68k) disk structs to m88k. Used when reading ! 80: * from disk. ! 81: */ ! 82: void get_partition(const char *source, partition_t *dest) ! 83: { ! 84: get_word(source + PARTITION_P_BASE, (char *)&dest->p_base); ! 85: get_word(source + PARTITION_P_SIZE, (char *)&dest->p_size); ! 86: get_short(source + PARTITION_P_BSIZE, (char *)&dest->p_bsize); ! 87: get_short(source + PARTITION_P_FSIZE, (char *)&dest->p_fsize); ! 88: get_char(source + PARTITION_P_OPT, (char *)&dest->p_opt); ! 89: get_short(source + PARTITION_P_CPG, (char *)&dest->p_cpg); ! 90: get_short(source + PARTITION_P_DENSITY, (char *)&dest->p_density); ! 91: get_char(source + PARTITION_P_MINFREE, (char *)&dest->p_minfree); ! 92: get_char(source + PARTITION_P_NEWFS, (char *)&dest->p_newfs); ! 93: bcopy(source + PARTITION_P_MOUNTPT, dest->p_mountpt, MAXMPTLEN); ! 94: get_char(source + PARTITION_P_AUTOMNT, (char *)&dest->p_automnt); ! 95: bcopy(source + PARTITION_P_TYPE, dest->p_type, MAXFSTLEN); ! 96: } ! 97: ! 98: void get_disktab(const char *source, disktab_t *dest) ! 99: { ! 100: int part_num; ! 101: int i; ! 102: unsigned char *bblk_src, *bblk_dst; ! 103: ! 104: bcopy(source + DISKTAB_D_NAME, dest->d_name, MAXDNMLEN); ! 105: bcopy(source + DISKTAB_D_TYPE, dest->d_type, MAXTYPLEN); ! 106: get_word(source + DISKTAB_D_SECSIZE, (char *)&dest->d_secsize); ! 107: get_word(source + DISKTAB_D_NTRACKS, (char *)&dest->d_ntracks); ! 108: get_word(source + DISKTAB_D_NSECTORS, (char *)&dest->d_nsectors); ! 109: get_word(source + DISKTAB_D_NCYLINDERS, (char *)&dest->d_ncylinders); ! 110: get_word(source + DISKTAB_D_RPM, (char *)&dest->d_rpm); ! 111: get_short(source + DISKTAB_D_FRONT, (char *)&dest->d_front); ! 112: get_short(source + DISKTAB_D_BACK, (char *)&dest->d_back); ! 113: get_short(source + DISKTAB_D_NGROUPS, (char *)&dest->d_ngroups); ! 114: get_short(source + DISKTAB_D_AG_SIZE, (char *)&dest->d_ag_size); ! 115: get_short(source + DISKTAB_D_AG_ALTS, (char *)&dest->d_ag_alts); ! 116: get_short(source + DISKTAB_D_AG_OFF, (char *)&dest->d_ag_off); ! 117: if (NBOOTS){ ! 118: bblk_src = (unsigned char *)(source + DISKTAB_D_BOOT0_BLKNO); ! 119: bblk_dst = (unsigned char *)&dest->d_boot0_blkno; ! 120: for (i = 0; i < (NBOOTS) ; i++){ ! 121: get_word(bblk_src, bblk_dst); ! 122: bblk_src += sizeof(int); ! 123: bblk_dst += sizeof(int); ! 124: } ! 125: } ! 126: bcopy(source + DISKTAB_D_BOOTFILE, dest->d_bootfile, MAXBFLEN); ! 127: bcopy(source + DISKTAB_D_HOSTNAME, dest->d_hostname, MAXHNLEN); ! 128: get_char(source + DISKTAB_D_ROOTPARTITION, ! 129: (char *)&dest->d_rootpartition); ! 130: get_char(source + DISKTAB_D_RWPARTITION, (char *)&dest->d_rwpartition); ! 131: for(part_num=0; part_num<NPART; part_num++) { ! 132: get_partition(source + DISKTAB_D_PARTITIONS + ! 133: (part_num * SIZEOF_PARTITION_T), ! 134: &dest->d_partitions[part_num]); ! 135: } ! 136: } ! 137: ! 138: void get_dl_un(const char *source, dl_un_t *dest) ! 139: { ! 140: int i; ! 141: ! 142: for(i=0; i<NBAD; i++) { ! 143: get_word(source, (char *)&dest->DL_bad[i]); ! 144: source += sizeof(int); ! 145: } ! 146: } ! 147: ! 148: void get_disk_label(const char *source, disk_label_t *dest) ! 149: { ! 150: get_word(source + DISK_LABEL_DL_VERSION, (char *)&dest->dl_version); ! 151: get_word(source + DISK_LABEL_DL_LABEL_BLKNO, ! 152: (char *)&dest->dl_label_blkno); ! 153: get_word(source + DISK_LABEL_DL_SIZE, (char *)&dest->dl_size); ! 154: bcopy(source + DISK_LABEL_DL_LABEL, dest->dl_label, MAXLBLLEN); ! 155: get_word(source + DISK_LABEL_DL_FLAGS, (char *)&dest->dl_flags); ! 156: get_word(source + DISK_LABEL_DL_TAG, (char *)&dest->dl_tag); ! 157: get_disktab(source + DISK_LABEL_DL_DT, &dest->dl_dt); ! 158: get_dl_un(source + DISK_LABEL_DL_UN, &dest->dl_un); ! 159: get_short(source + DISK_LABEL_DL_CHECKSUM, (char *)&dest->dl_checksum); ! 160: get_short(source + DISK_LABEL_DL_UN, (char *)&dest->dl_v3_checksum); ! 161: } ! 162: ! 163: /* ! 164: * Convert from m88k disk structs to native (m68k). Used when writing ! 165: * to disk. ! 166: */ ! 167: void put_partition(const partition_t *source, char *dest) ! 168: { ! 169: put_word((const char *)&source->p_base, dest + PARTITION_P_BASE); ! 170: put_word((const char *)&source->p_size, dest + PARTITION_P_SIZE); ! 171: put_short((const char *)&source->p_bsize, dest + PARTITION_P_BSIZE); ! 172: put_short((const char *)&source->p_fsize, dest + PARTITION_P_FSIZE); ! 173: put_char((const char *)&source->p_opt, dest + PARTITION_P_OPT); ! 174: put_short((const char *)&source->p_cpg, dest + PARTITION_P_CPG); ! 175: put_short((const char *)&source->p_density, dest + ! 176: PARTITION_P_DENSITY); ! 177: put_char((const char *)&source->p_minfree, dest + PARTITION_P_MINFREE); ! 178: put_char((const char *)&source->p_newfs, dest + PARTITION_P_NEWFS); ! 179: bcopy(source->p_mountpt, dest + PARTITION_P_MOUNTPT, MAXMPTLEN); ! 180: put_char((const char *)&source->p_automnt, dest + PARTITION_P_AUTOMNT); ! 181: bcopy(source->p_type, dest + PARTITION_P_TYPE, MAXFSTLEN); ! 182: } ! 183: ! 184: void put_disktab(const disktab_t *source, char *dest) ! 185: { ! 186: int part_num; ! 187: unsigned char *bblk_src, *bblk_dst; ! 188: int i; ! 189: ! 190: bcopy(source->d_name, dest + DISKTAB_D_NAME, MAXDNMLEN); ! 191: bcopy(source->d_type, dest + DISKTAB_D_TYPE, MAXTYPLEN); ! 192: put_word((const char *)&source->d_secsize, dest + DISKTAB_D_SECSIZE); ! 193: put_word((const char *)&source->d_ntracks, dest + DISKTAB_D_NTRACKS); ! 194: put_word((const char *)&source->d_nsectors, dest + DISKTAB_D_NSECTORS); ! 195: put_word((const char *)&source->d_ncylinders, dest + ! 196: DISKTAB_D_NCYLINDERS); ! 197: put_word((const char *)&source->d_rpm, dest + DISKTAB_D_RPM); ! 198: put_short((const char *)&source->d_front, dest + DISKTAB_D_FRONT); ! 199: put_short((const char *)&source->d_back, dest + DISKTAB_D_BACK); ! 200: put_short((const char *)&source->d_ngroups, dest + DISKTAB_D_NGROUPS); ! 201: put_short((const char *)&source->d_ag_size, dest + DISKTAB_D_AG_SIZE); ! 202: put_short((const char *)&source->d_ag_alts, dest + DISKTAB_D_AG_ALTS); ! 203: put_short((const char *)&source->d_ag_off, dest + DISKTAB_D_AG_OFF); ! 204: if (NBOOTS){ ! 205: bblk_dst = (unsigned char *)(dest + DISKTAB_D_BOOT0_BLKNO); ! 206: bblk_src = (unsigned char *)&source->d_boot0_blkno; ! 207: for (i = 0; i < (NBOOTS) ; i++){ ! 208: put_word(bblk_src, bblk_dst); ! 209: bblk_src += sizeof(int); ! 210: bblk_dst += sizeof(int); ! 211: } ! 212: } ! 213: bcopy(source->d_bootfile, dest + DISKTAB_D_BOOTFILE, MAXBFLEN); ! 214: bcopy(source->d_hostname, dest + DISKTAB_D_HOSTNAME, MAXHNLEN); ! 215: put_char((const char *)&source->d_rootpartition, ! 216: dest + DISKTAB_D_ROOTPARTITION); ! 217: put_char((const char *)&source->d_rwpartition, ! 218: dest + DISKTAB_D_RWPARTITION); ! 219: for(part_num=0; part_num<NPART; part_num++) { ! 220: put_partition(&source->d_partitions[part_num], ! 221: dest + DISKTAB_D_PARTITIONS + ! 222: (part_num * SIZEOF_PARTITION_T)); ! 223: } ! 224: } ! 225: ! 226: /* ! 227: * Warning - this doesn't copy checksum properly. Caller must do that. ! 228: */ ! 229: void put_dl_un(const dl_un_t *source, char *dest) ! 230: { ! 231: int i; ! 232: ! 233: for(i=0; i<NBAD; i++) { ! 234: put_word((const char *)&source->DL_bad[i], dest); ! 235: dest += sizeof(int); ! 236: } ! 237: } ! 238: ! 239: void put_disk_label(const disk_label_t *source, char *dest) ! 240: { ! 241: put_word((const char *)&source->dl_version, ! 242: dest + DISK_LABEL_DL_VERSION); ! 243: put_word((const char *)&source->dl_label_blkno, ! 244: dest + DISK_LABEL_DL_LABEL_BLKNO); ! 245: put_word((const char *)&source->dl_size, dest + DISK_LABEL_DL_SIZE); ! 246: bcopy(source->dl_label, dest + DISK_LABEL_DL_LABEL, MAXLBLLEN); ! 247: put_word((const char *)&source->dl_flags, dest + DISK_LABEL_DL_FLAGS); ! 248: put_word((const char *)&source->dl_tag, dest + DISK_LABEL_DL_TAG); ! 249: put_disktab(&source->dl_dt, dest + DISK_LABEL_DL_DT); ! 250: put_dl_un(&source->dl_un, dest + DISK_LABEL_DL_UN); ! 251: put_short((const char *)&source->dl_checksum, ! 252: dest + DISK_LABEL_DL_CHECKSUM); ! 253: put_short((const char *)&source->dl_v3_checksum, ! 254: dest + DISK_LABEL_DL_UN); ! 255: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.