|
|
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.