|
|
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 NeXT Computer, Inc. All rights reserved. ! 25: * ! 26: * label_subr.c - machine-independent disk label routines ! 27: * ! 28: * HISTORY ! 29: * 01-Apr-92 Doug Mitchell at NeXT ! 30: * Created. ! 31: */ ! 32: #import <bsd/sys/param.h> ! 33: #import <bsd/dev/disk_label.h> ! 34: #import <driverkit/disk_label.h> ! 35: #import <driverkit/diskstruct.h> ! 36: #import <architecture/byte_order.h> ! 37: ! 38: ! 39: /* ! 40: * Inlines used to manipulate m68k-style disk label fields. ! 41: */ ! 42: static inline unsigned int ! 43: get_word(const void *src) ! 44: { ! 45: return ( NXSwapBigIntToHost(*((unsigned int *)src))); ! 46: } ! 47: ! 48: static inline void ! 49: put_word(unsigned s, void *dest) ! 50: { ! 51: *((unsigned int *)dest) = NXSwapHostIntToBig(s); ! 52: } ! 53: ! 54: ! 55: static inline unsigned short ! 56: get_short(const void *src) ! 57: { ! 58: return ( NXSwapBigShortToHost(*((unsigned short *)src))); ! 59: } ! 60: ! 61: static inline void ! 62: put_short(unsigned short s, void *dest) ! 63: { ! 64: *((unsigned short *)dest) = NXSwapHostShortToBig(s); ! 65: } ! 66: ! 67: /* ! 68: * Machine-independent version of kernel's checksum_16(). ! 69: * *wp is a raw m68k-style label. ! 70: */ ! 71: unsigned short ! 72: checksum16(unsigned short *wp, int num_shorts) ! 73: { ! 74: int sum1 = 0; ! 75: int sum2; ! 76: ! 77: while (num_shorts--){ ! 78: sum1 += NXSwapBigShortToHost(*wp); ! 79: wp++; ! 80: } ! 81: sum2 = ((sum1 & 0xffff0000) >> 16) + (sum1 & 0xffff); ! 82: if(sum2 > 65535) { ! 83: sum2 -= 65535; ! 84: } ! 85: return sum2; ! 86: } ! 87: ! 88: /* ! 89: * Validate an m68k-style label. Returns NULL if good, else returns pointer ! 90: * to an error string describing what is wrong with the label. ! 91: */ ! 92: char * ! 93: check_label(char *raw_label, // as it came off disk ! 94: int block_num) ! 95: { ! 96: unsigned short sum; ! 97: unsigned short cksum; ! 98: unsigned short size; ! 99: void *dl_cksump; ! 100: int version; ! 101: int label_blkno; ! 102: ! 103: version = get_word(raw_label + DISK_LABEL_DL_VERSION); ! 104: if(version == DL_V1 || version == DL_V2) { ! 105: size = SIZEOF_DISK_LABEL_T; ! 106: dl_cksump = raw_label + DISK_LABEL_DL_CHECKSUM; ! 107: } ! 108: else if(version == DL_V3) { ! 109: size = SIZEOF_DISK_LABEL_T - SIZEOF_DL_UN_T; ! 110: dl_cksump = raw_label + DISK_LABEL_DL_UN; ! 111: } ! 112: else { ! 113: return "Bad disk label magic number"; ! 114: } ! 115: label_blkno = get_word(raw_label + DISK_LABEL_DL_LABEL_BLKNO); ! 116: if(label_blkno != block_num) { ! 117: return "Label in wrong location"; ! 118: } ! 119: ! 120: /* ! 121: * Block number in label has to be 0 for checksum calculation. ! 122: */ ! 123: put_word(0, raw_label + DISK_LABEL_DL_LABEL_BLKNO); ! 124: cksum = get_short(dl_cksump); ! 125: put_short(0, dl_cksump); ! 126: sum = checksum16((unsigned short *)raw_label, size >> 1); ! 127: if (sum != cksum) { ! 128: return "Label checksum error"; ! 129: } ! 130: ! 131: /* ! 132: * Success. Restore block number. ! 133: */ ! 134: put_word(block_num, raw_label + DISK_LABEL_DL_LABEL_BLKNO); ! 135: put_short(cksum, dl_cksump); ! 136: return NULL; ! 137: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.