1*eee96f10SToomas Soome /*
2*eee96f10SToomas Soome * CDDL HEADER START
3*eee96f10SToomas Soome *
4*eee96f10SToomas Soome * The contents of this file are subject to the terms of the
5*eee96f10SToomas Soome * Common Development and Distribution License (the "License").
6*eee96f10SToomas Soome * You may not use this file except in compliance with the License.
7*eee96f10SToomas Soome *
8*eee96f10SToomas Soome * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*eee96f10SToomas Soome * or http://www.opensolaris.org/os/licensing.
10*eee96f10SToomas Soome * See the License for the specific language governing permissions
11*eee96f10SToomas Soome * and limitations under the License.
12*eee96f10SToomas Soome *
13*eee96f10SToomas Soome * When distributing Covered Code, include this CDDL HEADER in each
14*eee96f10SToomas Soome * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*eee96f10SToomas Soome * If applicable, add the following below this CDDL HEADER, with the
16*eee96f10SToomas Soome * fields enclosed by brackets "[]" replaced with your own identifying
17*eee96f10SToomas Soome * information: Portions Copyright [yyyy] [name of copyright owner]
18*eee96f10SToomas Soome *
19*eee96f10SToomas Soome * CDDL HEADER END
20*eee96f10SToomas Soome */
21*eee96f10SToomas Soome /*
22*eee96f10SToomas Soome * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
23*eee96f10SToomas Soome * Use is subject to license terms.
24*eee96f10SToomas Soome */
25*eee96f10SToomas Soome
26*eee96f10SToomas Soome #include <stdio.h>
27*eee96f10SToomas Soome #include <stdlib.h>
28*eee96f10SToomas Soome #include <malloc.h>
29*eee96f10SToomas Soome #include <unistd.h>
30*eee96f10SToomas Soome #include <strings.h>
31*eee96f10SToomas Soome #include <errno.h>
32*eee96f10SToomas Soome #include <libintl.h>
33*eee96f10SToomas Soome #include <libgen.h>
34*eee96f10SToomas Soome #include <fcntl.h>
35*eee96f10SToomas Soome #include <sys/types.h>
36*eee96f10SToomas Soome #include <sys/int_types.h>
37*eee96f10SToomas Soome #include <sys/dkio.h>
38*eee96f10SToomas Soome #include <sys/cdio.h>
39*eee96f10SToomas Soome #include <sys/vtoc.h>
40*eee96f10SToomas Soome #include <sys/stat.h>
41*eee96f10SToomas Soome #include <sys/param.h>
42*eee96f10SToomas Soome #include <sys/fs/udf_volume.h>
43*eee96f10SToomas Soome #include "ud_lib.h"
44*eee96f10SToomas Soome
45*eee96f10SToomas Soome extern char *getfullrawname(char *);
46*eee96f10SToomas Soome
47*eee96f10SToomas Soome static int32_t ud_get_ecma_ver(ud_handle_t, uint32_t);
48*eee96f10SToomas Soome static int32_t ud_get_fs_bsize(ud_handle_t, uint32_t, uint32_t *);
49*eee96f10SToomas Soome static int32_t ud_parse_fill_vds(ud_handle_t, struct vds *, uint32_t, uint32_t);
50*eee96f10SToomas Soome static int32_t ud_read_and_translate_lvd(ud_handle_t, uint32_t, uint32_t);
51*eee96f10SToomas Soome static int32_t ud_get_latest_lvid(ud_handle_t, uint32_t, uint32_t);
52*eee96f10SToomas Soome static int32_t ud_get_latest_fsd(ud_handle_t, uint16_t, uint32_t, uint32_t);
53*eee96f10SToomas Soome
54*eee96f10SToomas Soome static uint16_t ud_crc(uint8_t *, int32_t);
55*eee96f10SToomas Soome static int32_t UdfTxName(uint16_t *, int32_t);
56*eee96f10SToomas Soome static int32_t UncompressUnicode(int32_t, uint8_t *, uint16_t *);
57*eee96f10SToomas Soome static int32_t ud_compressunicode(int32_t, int32_t, uint16_t *, uint8_t *);
58*eee96f10SToomas Soome static int32_t ud_convert2utf8(uint8_t *, uint8_t *, int32_t);
59*eee96f10SToomas Soome static int32_t ud_convert2utf16(uint8_t *, uint8_t *, int32_t);
60*eee96f10SToomas Soome
61*eee96f10SToomas Soome
62*eee96f10SToomas Soome int
ud_init(int fd,ud_handle_t * hp)63*eee96f10SToomas Soome ud_init(int fd, ud_handle_t *hp)
64*eee96f10SToomas Soome {
65*eee96f10SToomas Soome struct ud_handle *h;
66*eee96f10SToomas Soome
67*eee96f10SToomas Soome if ((h = calloc(1, sizeof (struct ud_handle))) == NULL) {
68*eee96f10SToomas Soome return (ENOMEM);
69*eee96f10SToomas Soome }
70*eee96f10SToomas Soome h->fd = fd;
71*eee96f10SToomas Soome *hp = h;
72*eee96f10SToomas Soome return (0);
73*eee96f10SToomas Soome }
74*eee96f10SToomas Soome
75*eee96f10SToomas Soome void
ud_fini(ud_handle_t h)76*eee96f10SToomas Soome ud_fini(ud_handle_t h)
77*eee96f10SToomas Soome {
78*eee96f10SToomas Soome free(h);
79*eee96f10SToomas Soome }
80*eee96f10SToomas Soome
81*eee96f10SToomas Soome /* ARGSUSED */
82*eee96f10SToomas Soome int32_t
ud_open_dev(ud_handle_t h,char * special,uint32_t flags)83*eee96f10SToomas Soome ud_open_dev(ud_handle_t h, char *special, uint32_t flags)
84*eee96f10SToomas Soome {
85*eee96f10SToomas Soome char *temp;
86*eee96f10SToomas Soome struct stat i_stat, r_stat;
87*eee96f10SToomas Soome
88*eee96f10SToomas Soome (void) bzero(&i_stat, sizeof (struct stat));
89*eee96f10SToomas Soome (void) bzero(&r_stat, sizeof (struct stat));
90*eee96f10SToomas Soome
91*eee96f10SToomas Soome temp = special;
92*eee96f10SToomas Soome /*
93*eee96f10SToomas Soome * Get the stat structure
94*eee96f10SToomas Soome */
95*eee96f10SToomas Soome if (stat(special, &i_stat) == 0) {
96*eee96f10SToomas Soome if ((i_stat.st_mode & S_IFMT) == S_IFBLK) {
97*eee96f10SToomas Soome
98*eee96f10SToomas Soome /*
99*eee96f10SToomas Soome * Block device try to convert to raw device
100*eee96f10SToomas Soome */
101*eee96f10SToomas Soome
102*eee96f10SToomas Soome temp = getfullrawname(special);
103*eee96f10SToomas Soome
104*eee96f10SToomas Soome /*
105*eee96f10SToomas Soome * Stat the converted device name and verify
106*eee96f10SToomas Soome * both the raw and block device belong to
107*eee96f10SToomas Soome * the same device
108*eee96f10SToomas Soome */
109*eee96f10SToomas Soome if (stat(temp, &r_stat) < 0) {
110*eee96f10SToomas Soome temp = special;
111*eee96f10SToomas Soome } else {
112*eee96f10SToomas Soome if (((r_stat.st_mode & S_IFMT) == S_IFBLK) ||
113*eee96f10SToomas Soome (r_stat.st_rdev != i_stat.st_rdev)) {
114*eee96f10SToomas Soome temp = special;
115*eee96f10SToomas Soome }
116*eee96f10SToomas Soome }
117*eee96f10SToomas Soome }
118*eee96f10SToomas Soome }
119*eee96f10SToomas Soome
120*eee96f10SToomas Soome /*
121*eee96f10SToomas Soome * Now finally open the device
122*eee96f10SToomas Soome */
123*eee96f10SToomas Soome h->fd = open(temp, flags);
124*eee96f10SToomas Soome
125*eee96f10SToomas Soome return (h->fd);
126*eee96f10SToomas Soome }
127*eee96f10SToomas Soome
128*eee96f10SToomas Soome /* ARGSUSED */
129*eee96f10SToomas Soome void
ud_close_dev(ud_handle_t h)130*eee96f10SToomas Soome ud_close_dev(ud_handle_t h)
131*eee96f10SToomas Soome {
132*eee96f10SToomas Soome /*
133*eee96f10SToomas Soome * Too simple Just close it
134*eee96f10SToomas Soome */
135*eee96f10SToomas Soome (void) close(h->fd);
136*eee96f10SToomas Soome }
137*eee96f10SToomas Soome
138*eee96f10SToomas Soome int32_t
ud_read_dev(ud_handle_t h,uint64_t offset,uint8_t * buf,uint32_t count)139*eee96f10SToomas Soome ud_read_dev(ud_handle_t h, uint64_t offset, uint8_t *buf, uint32_t count)
140*eee96f10SToomas Soome {
141*eee96f10SToomas Soome /*
142*eee96f10SToomas Soome * Seek to the given offset
143*eee96f10SToomas Soome */
144*eee96f10SToomas Soome if (lseek(h->fd, offset, SEEK_SET) == -1) {
145*eee96f10SToomas Soome return (1);
146*eee96f10SToomas Soome }
147*eee96f10SToomas Soome
148*eee96f10SToomas Soome /*
149*eee96f10SToomas Soome * Read the required number of bytes
150*eee96f10SToomas Soome */
151*eee96f10SToomas Soome if (read(h->fd, buf, count) != count) {
152*eee96f10SToomas Soome return (1);
153*eee96f10SToomas Soome }
154*eee96f10SToomas Soome return (0);
155*eee96f10SToomas Soome }
156*eee96f10SToomas Soome
157*eee96f10SToomas Soome int32_t
ud_write_dev(ud_handle_t h,uint64_t offset,uint8_t * buf,uint32_t count)158*eee96f10SToomas Soome ud_write_dev(ud_handle_t h, uint64_t offset, uint8_t *buf, uint32_t count)
159*eee96f10SToomas Soome {
160*eee96f10SToomas Soome /*
161*eee96f10SToomas Soome * Seek to the given offset
162*eee96f10SToomas Soome */
163*eee96f10SToomas Soome if (lseek(h->fd, offset, SEEK_SET) == -1) {
164*eee96f10SToomas Soome return (1);
165*eee96f10SToomas Soome }
166*eee96f10SToomas Soome
167*eee96f10SToomas Soome /*
168*eee96f10SToomas Soome * Read the appropriate number of bytes
169*eee96f10SToomas Soome */
170*eee96f10SToomas Soome if (write(h->fd, buf, count) != count) {
171*eee96f10SToomas Soome return (1);
172*eee96f10SToomas Soome }
173*eee96f10SToomas Soome return (0);
174*eee96f10SToomas Soome }
175*eee96f10SToomas Soome
176*eee96f10SToomas Soome /* ----- BEGIN Read and translate the on disk VDS to IN CORE format -------- */
177*eee96f10SToomas Soome
178*eee96f10SToomas Soome int32_t
ud_fill_udfs_info(ud_handle_t h)179*eee96f10SToomas Soome ud_fill_udfs_info(ud_handle_t h)
180*eee96f10SToomas Soome {
181*eee96f10SToomas Soome struct anch_vol_desc_ptr *avdp = NULL;
182*eee96f10SToomas Soome uint32_t offset = 0;
183*eee96f10SToomas Soome
184*eee96f10SToomas Soome if (ioctl(h->fd, CDROMREADOFFSET, &offset) == -1) {
185*eee96f10SToomas Soome offset = 0;
186*eee96f10SToomas Soome }
187*eee96f10SToomas Soome
188*eee96f10SToomas Soome h->udfs.flags = INVALID_UDFS;
189*eee96f10SToomas Soome
190*eee96f10SToomas Soome h->udfs.ecma_version = ud_get_ecma_ver(h, offset);
191*eee96f10SToomas Soome if (h->udfs.ecma_version == UD_ECMA_UNKN) {
192*eee96f10SToomas Soome return (1);
193*eee96f10SToomas Soome }
194*eee96f10SToomas Soome
195*eee96f10SToomas Soome h->udfs.lbsize = ud_get_fs_bsize(h, offset, &h->udfs.avdp_loc);
196*eee96f10SToomas Soome if (h->udfs.lbsize == 0) {
197*eee96f10SToomas Soome return (2);
198*eee96f10SToomas Soome }
199*eee96f10SToomas Soome
200*eee96f10SToomas Soome h->udfs.avdp_len = lb_roundup(512, h->udfs.lbsize);
201*eee96f10SToomas Soome
202*eee96f10SToomas Soome
203*eee96f10SToomas Soome if ((avdp = (struct anch_vol_desc_ptr *)
204*eee96f10SToomas Soome malloc(h->udfs.lbsize)) == NULL) {
205*eee96f10SToomas Soome return (3);
206*eee96f10SToomas Soome }
207*eee96f10SToomas Soome if (ud_read_dev(h, h->udfs.avdp_loc * h->udfs.lbsize,
208*eee96f10SToomas Soome (uint8_t *)avdp, h->udfs.lbsize) != 0) {
209*eee96f10SToomas Soome free(avdp);
210*eee96f10SToomas Soome return (4);
211*eee96f10SToomas Soome }
212*eee96f10SToomas Soome if (ud_verify_tag(h, &avdp->avd_tag, UD_ANCH_VOL_DESC,
213*eee96f10SToomas Soome h->udfs.avdp_loc, 1, 0) != 0) {
214*eee96f10SToomas Soome free(avdp);
215*eee96f10SToomas Soome return (5);
216*eee96f10SToomas Soome }
217*eee96f10SToomas Soome
218*eee96f10SToomas Soome h->udfs.mvds_loc = SWAP_32(avdp->avd_main_vdse.ext_loc);
219*eee96f10SToomas Soome h->udfs.mvds_len = SWAP_32(avdp->avd_main_vdse.ext_len);
220*eee96f10SToomas Soome
221*eee96f10SToomas Soome h->udfs.rvds_loc = SWAP_32(avdp->avd_res_vdse.ext_loc);
222*eee96f10SToomas Soome h->udfs.rvds_len = SWAP_32(avdp->avd_res_vdse.ext_len);
223*eee96f10SToomas Soome
224*eee96f10SToomas Soome free(avdp);
225*eee96f10SToomas Soome
226*eee96f10SToomas Soome /*
227*eee96f10SToomas Soome * get information from mvds and rvds
228*eee96f10SToomas Soome */
229*eee96f10SToomas Soome if (ud_parse_fill_vds(h, &h->udfs.mvds,
230*eee96f10SToomas Soome h->udfs.mvds_loc, h->udfs.mvds_len) == 0) {
231*eee96f10SToomas Soome h->udfs.flags |= VALID_MVDS;
232*eee96f10SToomas Soome }
233*eee96f10SToomas Soome if (ud_parse_fill_vds(h, &h->udfs.rvds,
234*eee96f10SToomas Soome h->udfs.rvds_loc, h->udfs.rvds_len) == 0) {
235*eee96f10SToomas Soome h->udfs.flags |= VALID_RVDS;
236*eee96f10SToomas Soome }
237*eee96f10SToomas Soome
238*eee96f10SToomas Soome if ((h->udfs.flags & (VALID_MVDS | VALID_RVDS)) == 0) {
239*eee96f10SToomas Soome return (6);
240*eee96f10SToomas Soome }
241*eee96f10SToomas Soome
242*eee96f10SToomas Soome /*
243*eee96f10SToomas Soome * If we are here we have
244*eee96f10SToomas Soome * a valid Volume Descriptor Seqence
245*eee96f10SToomas Soome * Read and understand lvd
246*eee96f10SToomas Soome */
247*eee96f10SToomas Soome if (h->udfs.flags & VALID_MVDS) {
248*eee96f10SToomas Soome if (ud_read_and_translate_lvd(h, h->udfs.mvds.lvd_loc,
249*eee96f10SToomas Soome h->udfs.mvds.lvd_len) != 0) {
250*eee96f10SToomas Soome return (7);
251*eee96f10SToomas Soome }
252*eee96f10SToomas Soome } else {
253*eee96f10SToomas Soome if (ud_read_and_translate_lvd(h, h->udfs.rvds.lvd_loc,
254*eee96f10SToomas Soome h->udfs.rvds.lvd_len) != 0) {
255*eee96f10SToomas Soome return (8);
256*eee96f10SToomas Soome }
257*eee96f10SToomas Soome }
258*eee96f10SToomas Soome
259*eee96f10SToomas Soome h->udfs.flags |= VALID_UDFS;
260*eee96f10SToomas Soome
261*eee96f10SToomas Soome return (0);
262*eee96f10SToomas Soome }
263*eee96f10SToomas Soome
264*eee96f10SToomas Soome static int32_t
ud_get_ecma_ver(ud_handle_t h,uint32_t offset)265*eee96f10SToomas Soome ud_get_ecma_ver(ud_handle_t h, uint32_t offset)
266*eee96f10SToomas Soome {
267*eee96f10SToomas Soome uint8_t *buf;
268*eee96f10SToomas Soome uint64_t off;
269*eee96f10SToomas Soome uint64_t end_off;
270*eee96f10SToomas Soome struct nsr_desc *ndsc;
271*eee96f10SToomas Soome uint32_t ecma_ver = UD_ECMA_UNKN;
272*eee96f10SToomas Soome
273*eee96f10SToomas Soome /*
274*eee96f10SToomas Soome * Allocate a buffer of size UD_VOL_REC_BSZ
275*eee96f10SToomas Soome */
276*eee96f10SToomas Soome if ((buf = (uint8_t *)malloc(UD_VOL_REC_BSZ)) == NULL) {
277*eee96f10SToomas Soome
278*eee96f10SToomas Soome /*
279*eee96f10SToomas Soome * Uh could not even allocate this much
280*eee96f10SToomas Soome */
281*eee96f10SToomas Soome goto end;
282*eee96f10SToomas Soome }
283*eee96f10SToomas Soome
284*eee96f10SToomas Soome /*
285*eee96f10SToomas Soome * Start from 32k and keep reading 2k blocks we
286*eee96f10SToomas Soome * should be able to find NSR if we have one by 256 * 2k bytes
287*eee96f10SToomas Soome */
288*eee96f10SToomas Soome off = offset * 2048 + UD_VOL_REC_START;
289*eee96f10SToomas Soome end_off = offset * 2048 + UD_VOL_REC_END;
290*eee96f10SToomas Soome for (; off < end_off; off += UD_VOL_REC_BSZ) {
291*eee96f10SToomas Soome
292*eee96f10SToomas Soome if (ud_read_dev(h, off, buf, UD_VOL_REC_BSZ) == 0) {
293*eee96f10SToomas Soome
294*eee96f10SToomas Soome ndsc = (struct nsr_desc *)buf;
295*eee96f10SToomas Soome /*
296*eee96f10SToomas Soome * Is this either NSR02 or NSR03
297*eee96f10SToomas Soome */
298*eee96f10SToomas Soome if ((ndsc->nsr_str_type == 0) &&
299*eee96f10SToomas Soome (ndsc->nsr_ver == 1) &&
300*eee96f10SToomas Soome (ndsc->nsr_id[0] == 'N') &&
301*eee96f10SToomas Soome (ndsc->nsr_id[1] == 'S') &&
302*eee96f10SToomas Soome (ndsc->nsr_id[2] == 'R') &&
303*eee96f10SToomas Soome (ndsc->nsr_id[3] == '0') &&
304*eee96f10SToomas Soome ((ndsc->nsr_id[4] == '2') ||
305*eee96f10SToomas Soome (ndsc->nsr_id[4] == '3'))) {
306*eee96f10SToomas Soome
307*eee96f10SToomas Soome (void) strncpy((char *)h->udfs.ecma_id,
308*eee96f10SToomas Soome (char *)ndsc->nsr_id, 5);
309*eee96f10SToomas Soome
310*eee96f10SToomas Soome switch (ndsc->nsr_id[4]) {
311*eee96f10SToomas Soome case '2' :
312*eee96f10SToomas Soome
313*eee96f10SToomas Soome /*
314*eee96f10SToomas Soome * ECMA 167/2
315*eee96f10SToomas Soome */
316*eee96f10SToomas Soome ecma_ver = UD_ECMA_VER2;
317*eee96f10SToomas Soome goto end;
318*eee96f10SToomas Soome case '3' :
319*eee96f10SToomas Soome
320*eee96f10SToomas Soome /*
321*eee96f10SToomas Soome * ECMA 167/3
322*eee96f10SToomas Soome */
323*eee96f10SToomas Soome ecma_ver = UD_ECMA_VER3;
324*eee96f10SToomas Soome goto end;
325*eee96f10SToomas Soome }
326*eee96f10SToomas Soome }
327*eee96f10SToomas Soome }
328*eee96f10SToomas Soome }
329*eee96f10SToomas Soome
330*eee96f10SToomas Soome end:
331*eee96f10SToomas Soome /*
332*eee96f10SToomas Soome * Cleanup
333*eee96f10SToomas Soome */
334*eee96f10SToomas Soome free(buf);
335*eee96f10SToomas Soome return (ecma_ver);
336*eee96f10SToomas Soome }
337*eee96f10SToomas Soome
338*eee96f10SToomas Soome static uint32_t last_block_index[] = {0, 0, 256, 2, 2 + 256,
339*eee96f10SToomas Soome 150, 150 + 256, 152, 152 + 256};
340*eee96f10SToomas Soome
341*eee96f10SToomas Soome static int32_t
ud_get_fs_bsize(ud_handle_t h,uint32_t offset,uint32_t * avd_loc)342*eee96f10SToomas Soome ud_get_fs_bsize(ud_handle_t h, uint32_t offset, uint32_t *avd_loc)
343*eee96f10SToomas Soome {
344*eee96f10SToomas Soome uint64_t off;
345*eee96f10SToomas Soome int32_t index, bsize, shift, end_index;
346*eee96f10SToomas Soome uint32_t num_blocks, sub_blk;
347*eee96f10SToomas Soome uint8_t *buf = NULL;
348*eee96f10SToomas Soome struct anch_vol_desc_ptr *avdp;
349*eee96f10SToomas Soome
350*eee96f10SToomas Soome if ((buf = (uint8_t *)malloc(MAXBSIZE)) == NULL) {
351*eee96f10SToomas Soome return (0);
352*eee96f10SToomas Soome }
353*eee96f10SToomas Soome
354*eee96f10SToomas Soome /*
355*eee96f10SToomas Soome * If we could figure out the last block
356*eee96f10SToomas Soome * search at 256, N, N - 256 blocks
357*eee96f10SToomas Soome * otherwise just check at 256
358*eee96f10SToomas Soome */
359*eee96f10SToomas Soome if (ud_get_num_blks(h, &num_blocks) != 0) {
360*eee96f10SToomas Soome end_index = 1;
361*eee96f10SToomas Soome num_blocks = 0;
362*eee96f10SToomas Soome } else {
363*eee96f10SToomas Soome end_index = sizeof (last_block_index) / 4;
364*eee96f10SToomas Soome }
365*eee96f10SToomas Soome
366*eee96f10SToomas Soome for (index = 0; index < end_index; index++) {
367*eee96f10SToomas Soome sub_blk = last_block_index[index];
368*eee96f10SToomas Soome
369*eee96f10SToomas Soome /*
370*eee96f10SToomas Soome * Start guessing from DEV_BSIZE to MAXBSIZE
371*eee96f10SToomas Soome */
372*eee96f10SToomas Soome for (bsize = DEV_BSIZE, shift = 0;
373*eee96f10SToomas Soome bsize <= MAXBSIZE; bsize <<= 1, shift++) {
374*eee96f10SToomas Soome
375*eee96f10SToomas Soome if (index == 0) {
376*eee96f10SToomas Soome
377*eee96f10SToomas Soome /*
378*eee96f10SToomas Soome * Check if we atleast have 256 of bsize
379*eee96f10SToomas Soome * blocks on the device
380*eee96f10SToomas Soome */
381*eee96f10SToomas Soome if ((end_index == 0) ||
382*eee96f10SToomas Soome (num_blocks > (256 << shift))) {
383*eee96f10SToomas Soome *avd_loc = 256;
384*eee96f10SToomas Soome if (bsize <= 2048) {
385*eee96f10SToomas Soome *avd_loc +=
386*eee96f10SToomas Soome offset * 2048 / bsize;
387*eee96f10SToomas Soome } else {
388*eee96f10SToomas Soome *avd_loc +=
389*eee96f10SToomas Soome offset / (bsize / 2048);
390*eee96f10SToomas Soome }
391*eee96f10SToomas Soome } else {
392*eee96f10SToomas Soome continue;
393*eee96f10SToomas Soome }
394*eee96f10SToomas Soome } else {
395*eee96f10SToomas Soome /*
396*eee96f10SToomas Soome * Calculate the bsize avd block
397*eee96f10SToomas Soome */
398*eee96f10SToomas Soome if ((num_blocks) &&
399*eee96f10SToomas Soome (num_blocks > (sub_blk << shift))) {
400*eee96f10SToomas Soome *avd_loc = (num_blocks >> shift) -
401*eee96f10SToomas Soome sub_blk;
402*eee96f10SToomas Soome } else {
403*eee96f10SToomas Soome continue;
404*eee96f10SToomas Soome }
405*eee96f10SToomas Soome }
406*eee96f10SToomas Soome
407*eee96f10SToomas Soome off = (uint64_t)*avd_loc * bsize;
408*eee96f10SToomas Soome
409*eee96f10SToomas Soome /*
410*eee96f10SToomas Soome * Read bsize bytes at off
411*eee96f10SToomas Soome */
412*eee96f10SToomas Soome if (ud_read_dev(h, off, buf, bsize) != 0) {
413*eee96f10SToomas Soome continue;
414*eee96f10SToomas Soome }
415*eee96f10SToomas Soome
416*eee96f10SToomas Soome /*
417*eee96f10SToomas Soome * Check if we have a Anchor Volume Descriptor here
418*eee96f10SToomas Soome */
419*eee96f10SToomas Soome
420*eee96f10SToomas Soome /* LINTED */
421*eee96f10SToomas Soome avdp = (struct anch_vol_desc_ptr *)buf;
422*eee96f10SToomas Soome if (ud_verify_tag(h, &avdp->avd_tag,
423*eee96f10SToomas Soome UD_ANCH_VOL_DESC, *avd_loc, 1, 0) != 0) {
424*eee96f10SToomas Soome continue;
425*eee96f10SToomas Soome }
426*eee96f10SToomas Soome goto end;
427*eee96f10SToomas Soome }
428*eee96f10SToomas Soome }
429*eee96f10SToomas Soome
430*eee96f10SToomas Soome end:
431*eee96f10SToomas Soome if (bsize > MAXBSIZE) {
432*eee96f10SToomas Soome bsize = 0;
433*eee96f10SToomas Soome *avd_loc = 0;
434*eee96f10SToomas Soome }
435*eee96f10SToomas Soome free(buf);
436*eee96f10SToomas Soome return (bsize);
437*eee96f10SToomas Soome }
438*eee96f10SToomas Soome
439*eee96f10SToomas Soome static int32_t
ud_parse_fill_vds(ud_handle_t h,struct vds * v,uint32_t vds_loc,uint32_t vds_len)440*eee96f10SToomas Soome ud_parse_fill_vds(ud_handle_t h, struct vds *v,
441*eee96f10SToomas Soome uint32_t vds_loc, uint32_t vds_len)
442*eee96f10SToomas Soome {
443*eee96f10SToomas Soome uint8_t *addr, *taddr, *eaddr;
444*eee96f10SToomas Soome uint16_t id;
445*eee96f10SToomas Soome int32_t i;
446*eee96f10SToomas Soome uint64_t off;
447*eee96f10SToomas Soome struct tag *tag;
448*eee96f10SToomas Soome struct pri_vol_desc *pvd;
449*eee96f10SToomas Soome struct log_vol_desc *lvd;
450*eee96f10SToomas Soome struct vol_desc_ptr *vds;
451*eee96f10SToomas Soome struct unall_spc_desc *usd;
452*eee96f10SToomas Soome
453*eee96f10SToomas Soome begin:
454*eee96f10SToomas Soome if ((addr = (uint8_t *)malloc(vds_len)) == NULL) {
455*eee96f10SToomas Soome return (1);
456*eee96f10SToomas Soome }
457*eee96f10SToomas Soome
458*eee96f10SToomas Soome off = vds_loc * h->udfs.lbsize;
459*eee96f10SToomas Soome if (ud_read_dev(h, off, addr, vds_len) != 0) {
460*eee96f10SToomas Soome goto end;
461*eee96f10SToomas Soome }
462*eee96f10SToomas Soome
463*eee96f10SToomas Soome for (taddr = addr, eaddr = addr + h->udfs.mvds_len; taddr < eaddr;
464*eee96f10SToomas Soome taddr += h->udfs.lbsize, vds_loc ++) {
465*eee96f10SToomas Soome
466*eee96f10SToomas Soome /* LINTED */
467*eee96f10SToomas Soome tag = (struct tag *)taddr;
468*eee96f10SToomas Soome id = SWAP_16(tag->tag_id);
469*eee96f10SToomas Soome /*
470*eee96f10SToomas Soome * If you cannot verify the tag just skip it
471*eee96f10SToomas Soome * This is not a fatal error
472*eee96f10SToomas Soome */
473*eee96f10SToomas Soome if (ud_verify_tag(h, tag, id, vds_loc, 1, 0) != 0) {
474*eee96f10SToomas Soome continue;
475*eee96f10SToomas Soome }
476*eee96f10SToomas Soome switch (id) {
477*eee96f10SToomas Soome case UD_PRI_VOL_DESC :
478*eee96f10SToomas Soome
479*eee96f10SToomas Soome /*
480*eee96f10SToomas Soome * Primary Volume Descriptor
481*eee96f10SToomas Soome */
482*eee96f10SToomas Soome /* LINTED */
483*eee96f10SToomas Soome pvd = (struct pri_vol_desc *)taddr;
484*eee96f10SToomas Soome if ((v->pvd_len == 0) ||
485*eee96f10SToomas Soome (SWAP_32(pvd->pvd_vdsn) > v->pvd_vdsn)) {
486*eee96f10SToomas Soome v->pvd_vdsn = SWAP_32(pvd->pvd_vdsn);
487*eee96f10SToomas Soome v->pvd_loc = vds_loc;
488*eee96f10SToomas Soome v->pvd_len = h->udfs.lbsize;
489*eee96f10SToomas Soome }
490*eee96f10SToomas Soome break;
491*eee96f10SToomas Soome case UD_VOL_DESC_PTR :
492*eee96f10SToomas Soome
493*eee96f10SToomas Soome /*
494*eee96f10SToomas Soome * Curent sequence is continued from
495*eee96f10SToomas Soome * the location pointed by vdp
496*eee96f10SToomas Soome */
497*eee96f10SToomas Soome /* LINTED */
498*eee96f10SToomas Soome vds = (struct vol_desc_ptr *)taddr;
499*eee96f10SToomas Soome
500*eee96f10SToomas Soome if (SWAP_32(vds->vdp_nvdse.ext_len) != 0) {
501*eee96f10SToomas Soome vds_loc = SWAP_32(vds->vdp_nvdse.ext_loc);
502*eee96f10SToomas Soome vds_len = SWAP_32(vds->vdp_nvdse.ext_len);
503*eee96f10SToomas Soome free(addr);
504*eee96f10SToomas Soome goto begin;
505*eee96f10SToomas Soome }
506*eee96f10SToomas Soome break;
507*eee96f10SToomas Soome case UD_IMPL_USE_DESC :
508*eee96f10SToomas Soome
509*eee96f10SToomas Soome /*
510*eee96f10SToomas Soome * Implementation Use Volume Descriptor
511*eee96f10SToomas Soome */
512*eee96f10SToomas Soome v->iud_loc = vds_loc;
513*eee96f10SToomas Soome v->iud_len = lb_roundup(512, h->udfs.lbsize);
514*eee96f10SToomas Soome break;
515*eee96f10SToomas Soome case UD_PART_DESC :
516*eee96f10SToomas Soome {
517*eee96f10SToomas Soome struct ud_part *p;
518*eee96f10SToomas Soome struct phdr_desc *ph;
519*eee96f10SToomas Soome struct part_desc *pd;
520*eee96f10SToomas Soome
521*eee96f10SToomas Soome /*
522*eee96f10SToomas Soome * Partition Descriptor
523*eee96f10SToomas Soome */
524*eee96f10SToomas Soome /* LINTED */
525*eee96f10SToomas Soome pd = (struct part_desc *)taddr;
526*eee96f10SToomas Soome
527*eee96f10SToomas Soome for (i = 0; i < h->n_parts; i++) {
528*eee96f10SToomas Soome p = &h->part[i];
529*eee96f10SToomas Soome
530*eee96f10SToomas Soome if ((SWAP_16(pd->pd_pnum) ==
531*eee96f10SToomas Soome p->udp_number) &&
532*eee96f10SToomas Soome (SWAP_32(pd->pd_vdsn) >
533*eee96f10SToomas Soome p->udp_seqno)) {
534*eee96f10SToomas Soome break;
535*eee96f10SToomas Soome }
536*eee96f10SToomas Soome }
537*eee96f10SToomas Soome
538*eee96f10SToomas Soome v->part_loc[i] = vds_loc;
539*eee96f10SToomas Soome v->part_len[i] =
540*eee96f10SToomas Soome lb_roundup(512, h->udfs.lbsize);
541*eee96f10SToomas Soome
542*eee96f10SToomas Soome p = &h->part[i];
543*eee96f10SToomas Soome p->udp_number = SWAP_16(pd->pd_pnum);
544*eee96f10SToomas Soome p->udp_seqno = SWAP_32(pd->pd_vdsn);
545*eee96f10SToomas Soome p->udp_access = SWAP_32(pd->pd_acc_type);
546*eee96f10SToomas Soome p->udp_start = SWAP_32(pd->pd_part_start);
547*eee96f10SToomas Soome p->udp_length = SWAP_32(pd->pd_part_length);
548*eee96f10SToomas Soome
549*eee96f10SToomas Soome /* LINTED */
550*eee96f10SToomas Soome ph = (struct phdr_desc *)pd->pd_pc_use;
551*eee96f10SToomas Soome if (ph->phdr_ust.sad_ext_len) {
552*eee96f10SToomas Soome p->udp_flags = UDP_SPACETBLS;
553*eee96f10SToomas Soome p->udp_unall_loc = SWAP_32(ph->phdr_ust.sad_ext_loc);
554*eee96f10SToomas Soome p->udp_unall_len = SWAP_32(ph->phdr_ust.sad_ext_len);
555*eee96f10SToomas Soome p->udp_freed_loc = SWAP_32(ph->phdr_fst.sad_ext_loc);
556*eee96f10SToomas Soome p->udp_freed_len = SWAP_32(ph->phdr_fst.sad_ext_len);
557*eee96f10SToomas Soome } else {
558*eee96f10SToomas Soome p->udp_flags = UDP_BITMAPS;
559*eee96f10SToomas Soome p->udp_unall_loc = SWAP_32(ph->phdr_usb.sad_ext_loc);
560*eee96f10SToomas Soome p->udp_unall_len = SWAP_32(ph->phdr_usb.sad_ext_len);
561*eee96f10SToomas Soome p->udp_freed_loc = SWAP_32(ph->phdr_fsb.sad_ext_loc);
562*eee96f10SToomas Soome p->udp_freed_len = SWAP_32(ph->phdr_fsb.sad_ext_len);
563*eee96f10SToomas Soome }
564*eee96f10SToomas Soome
565*eee96f10SToomas Soome if (i == h->n_parts) {
566*eee96f10SToomas Soome h->n_parts ++;
567*eee96f10SToomas Soome }
568*eee96f10SToomas Soome }
569*eee96f10SToomas Soome break;
570*eee96f10SToomas Soome case UD_LOG_VOL_DESC :
571*eee96f10SToomas Soome
572*eee96f10SToomas Soome /*
573*eee96f10SToomas Soome * Logical Volume Descriptor
574*eee96f10SToomas Soome */
575*eee96f10SToomas Soome /* LINTED */
576*eee96f10SToomas Soome lvd = (struct log_vol_desc *)taddr;
577*eee96f10SToomas Soome if ((v->lvd_len == 0) ||
578*eee96f10SToomas Soome (SWAP_32(lvd->lvd_vdsn) > v->lvd_vdsn)) {
579*eee96f10SToomas Soome v->lvd_vdsn = SWAP_32(lvd->lvd_vdsn);
580*eee96f10SToomas Soome v->lvd_loc = vds_loc;
581*eee96f10SToomas Soome v->lvd_len = ((uint32_t)
582*eee96f10SToomas Soome &((struct log_vol_desc *)0)->lvd_pmaps);
583*eee96f10SToomas Soome v->lvd_len =
584*eee96f10SToomas Soome lb_roundup(v->lvd_len, h->udfs.lbsize);
585*eee96f10SToomas Soome }
586*eee96f10SToomas Soome break;
587*eee96f10SToomas Soome case UD_UNALL_SPA_DESC :
588*eee96f10SToomas Soome
589*eee96f10SToomas Soome /*
590*eee96f10SToomas Soome * Unallocated Space Descriptor
591*eee96f10SToomas Soome */
592*eee96f10SToomas Soome /* LINTED */
593*eee96f10SToomas Soome usd = (struct unall_spc_desc *)taddr;
594*eee96f10SToomas Soome v->usd_loc = vds_loc;
595*eee96f10SToomas Soome v->usd_len = ((uint32_t)
596*eee96f10SToomas Soome &((unall_spc_desc_t *)0)->ua_al_dsc) +
597*eee96f10SToomas Soome SWAP_32(usd->ua_nad) *
598*eee96f10SToomas Soome sizeof (struct extent_ad);
599*eee96f10SToomas Soome v->usd_len = lb_roundup(v->usd_len, h->udfs.lbsize);
600*eee96f10SToomas Soome break;
601*eee96f10SToomas Soome case UD_TERM_DESC :
602*eee96f10SToomas Soome /*
603*eee96f10SToomas Soome * Success fully completed
604*eee96f10SToomas Soome */
605*eee96f10SToomas Soome goto end;
606*eee96f10SToomas Soome default :
607*eee96f10SToomas Soome /*
608*eee96f10SToomas Soome * If you donot undetstand any tag just skip
609*eee96f10SToomas Soome * it. This is not a fatal error
610*eee96f10SToomas Soome */
611*eee96f10SToomas Soome break;
612*eee96f10SToomas Soome }
613*eee96f10SToomas Soome }
614*eee96f10SToomas Soome
615*eee96f10SToomas Soome end:
616*eee96f10SToomas Soome free(addr);
617*eee96f10SToomas Soome if ((v->pvd_len == 0) ||
618*eee96f10SToomas Soome (v->part_len[0] == 0) ||
619*eee96f10SToomas Soome (v->lvd_len == 0)) {
620*eee96f10SToomas Soome return (1);
621*eee96f10SToomas Soome }
622*eee96f10SToomas Soome
623*eee96f10SToomas Soome return (0);
624*eee96f10SToomas Soome }
625*eee96f10SToomas Soome
626*eee96f10SToomas Soome static int32_t
ud_read_and_translate_lvd(ud_handle_t h,uint32_t lvd_loc,uint32_t lvd_len)627*eee96f10SToomas Soome ud_read_and_translate_lvd(ud_handle_t h, uint32_t lvd_loc, uint32_t lvd_len)
628*eee96f10SToomas Soome {
629*eee96f10SToomas Soome caddr_t addr;
630*eee96f10SToomas Soome uint16_t fsd_prn;
631*eee96f10SToomas Soome uint32_t fsd_loc, fsd_len;
632*eee96f10SToomas Soome uint32_t lvds_loc, lvds_len;
633*eee96f10SToomas Soome uint64_t off;
634*eee96f10SToomas Soome struct log_vol_desc *lvd = NULL;
635*eee96f10SToomas Soome
636*eee96f10SToomas Soome int32_t max_maps, i, mp_sz, index;
637*eee96f10SToomas Soome struct ud_map *m;
638*eee96f10SToomas Soome struct pmap_hdr *ph;
639*eee96f10SToomas Soome struct pmap_typ1 *typ1;
640*eee96f10SToomas Soome struct pmap_typ2 *typ2;
641*eee96f10SToomas Soome
642*eee96f10SToomas Soome if (lvd_len == 0) {
643*eee96f10SToomas Soome return (1);
644*eee96f10SToomas Soome }
645*eee96f10SToomas Soome
646*eee96f10SToomas Soome if ((lvd = (struct log_vol_desc *)
647*eee96f10SToomas Soome malloc(lvd_len)) == NULL) {
648*eee96f10SToomas Soome return (1);
649*eee96f10SToomas Soome }
650*eee96f10SToomas Soome
651*eee96f10SToomas Soome off = lvd_loc * h->udfs.lbsize;
652*eee96f10SToomas Soome if (ud_read_dev(h, off, (uint8_t *)lvd, lvd_len) != 0) {
653*eee96f10SToomas Soome free(lvd);
654*eee96f10SToomas Soome return (1);
655*eee96f10SToomas Soome }
656*eee96f10SToomas Soome
657*eee96f10SToomas Soome if (ud_verify_tag(h, &lvd->lvd_tag, UD_LOG_VOL_DESC,
658*eee96f10SToomas Soome lvd_loc, 1, 0) != 0) {
659*eee96f10SToomas Soome free(lvd);
660*eee96f10SToomas Soome return (1);
661*eee96f10SToomas Soome }
662*eee96f10SToomas Soome
663*eee96f10SToomas Soome /*
664*eee96f10SToomas Soome * Take care of maps
665*eee96f10SToomas Soome */
666*eee96f10SToomas Soome max_maps = SWAP_32(lvd->lvd_num_pmaps);
667*eee96f10SToomas Soome ph = (struct pmap_hdr *)lvd->lvd_pmaps;
668*eee96f10SToomas Soome for (h->n_maps = index = 0; index < max_maps; index++) {
669*eee96f10SToomas Soome m = &h->maps[h->n_maps];
670*eee96f10SToomas Soome switch (ph->maph_type) {
671*eee96f10SToomas Soome case MAP_TYPE1 :
672*eee96f10SToomas Soome
673*eee96f10SToomas Soome /* LINTED */
674*eee96f10SToomas Soome typ1 = (struct pmap_typ1 *)ph;
675*eee96f10SToomas Soome
676*eee96f10SToomas Soome m->udm_flags = UDM_MAP_NORM;
677*eee96f10SToomas Soome m->udm_vsn = SWAP_16(typ1->map1_vsn);
678*eee96f10SToomas Soome m->udm_pn = SWAP_16(typ1->map1_pn);
679*eee96f10SToomas Soome h->n_maps++;
680*eee96f10SToomas Soome break;
681*eee96f10SToomas Soome
682*eee96f10SToomas Soome case MAP_TYPE2 :
683*eee96f10SToomas Soome
684*eee96f10SToomas Soome /* LINTED */
685*eee96f10SToomas Soome typ2 = (struct pmap_typ2 *)ph;
686*eee96f10SToomas Soome
687*eee96f10SToomas Soome if (strncmp(typ2->map2_pti.reg_id,
688*eee96f10SToomas Soome UDF_VIRT_PART, 23) == 0) {
689*eee96f10SToomas Soome
690*eee96f10SToomas Soome m->udm_flags = UDM_MAP_VPM;
691*eee96f10SToomas Soome m->udm_vsn = SWAP_16(typ2->map2_vsn);
692*eee96f10SToomas Soome m->udm_pn = SWAP_16(typ2->map2_pn);
693*eee96f10SToomas Soome } else if (strncmp(typ2->map2_pti.reg_id,
694*eee96f10SToomas Soome UDF_SPAR_PART, 23) == 0) {
695*eee96f10SToomas Soome
696*eee96f10SToomas Soome if ((SWAP_16(typ2->map2_pl) != 32) ||
697*eee96f10SToomas Soome (typ2->map2_nst < 1) ||
698*eee96f10SToomas Soome (typ2->map2_nst > 4)) {
699*eee96f10SToomas Soome break;
700*eee96f10SToomas Soome }
701*eee96f10SToomas Soome m->udm_flags = UDM_MAP_SPM;
702*eee96f10SToomas Soome m->udm_vsn = SWAP_16(typ2->map2_vsn);
703*eee96f10SToomas Soome m->udm_pn = SWAP_16(typ2->map2_pn);
704*eee96f10SToomas Soome
705*eee96f10SToomas Soome m->udm_plen = SWAP_16(typ2->map2_pl);
706*eee96f10SToomas Soome m->udm_nspm = typ2->map2_nst;
707*eee96f10SToomas Soome m->udm_spsz = SWAP_32(typ2->map2_sest);
708*eee96f10SToomas Soome
709*eee96f10SToomas Soome mp_sz = lb_roundup(m->udm_spsz, h->udfs.lbsize);
710*eee96f10SToomas Soome
711*eee96f10SToomas Soome if ((addr = malloc(mp_sz * m->udm_nspm)) ==
712*eee96f10SToomas Soome NULL) {
713*eee96f10SToomas Soome break;
714*eee96f10SToomas Soome }
715*eee96f10SToomas Soome
716*eee96f10SToomas Soome for (i = 0; i < m->udm_nspm; i++) {
717*eee96f10SToomas Soome m->udm_loc[i] =
718*eee96f10SToomas Soome SWAP_32(typ2->map2_st[index]);
719*eee96f10SToomas Soome m->udm_spaddr[i] = addr + i * mp_sz;
720*eee96f10SToomas Soome
721*eee96f10SToomas Soome off = m->udm_loc[i] * h->udfs.lbsize;
722*eee96f10SToomas Soome if (ud_read_dev(h, off,
723*eee96f10SToomas Soome (uint8_t *)m->udm_spaddr[i],
724*eee96f10SToomas Soome mp_sz) != 0) {
725*eee96f10SToomas Soome m->udm_spaddr[i] = NULL;
726*eee96f10SToomas Soome continue;
727*eee96f10SToomas Soome }
728*eee96f10SToomas Soome }
729*eee96f10SToomas Soome }
730*eee96f10SToomas Soome h->n_maps++;
731*eee96f10SToomas Soome default :
732*eee96f10SToomas Soome break;
733*eee96f10SToomas Soome }
734*eee96f10SToomas Soome ph = (struct pmap_hdr *)(((uint8_t *)h) + ph->maph_length);
735*eee96f10SToomas Soome }
736*eee96f10SToomas Soome
737*eee96f10SToomas Soome lvds_loc = SWAP_32(lvd->lvd_int_seq_ext.ext_loc);
738*eee96f10SToomas Soome lvds_len = SWAP_32(lvd->lvd_int_seq_ext.ext_len);
739*eee96f10SToomas Soome
740*eee96f10SToomas Soome fsd_prn = SWAP_16(lvd->lvd_lvcu.lad_ext_prn);
741*eee96f10SToomas Soome fsd_loc = SWAP_32(lvd->lvd_lvcu.lad_ext_loc);
742*eee96f10SToomas Soome fsd_len = SWAP_32(lvd->lvd_lvcu.lad_ext_len);
743*eee96f10SToomas Soome
744*eee96f10SToomas Soome free(lvd);
745*eee96f10SToomas Soome
746*eee96f10SToomas Soome /*
747*eee96f10SToomas Soome * Get the latest LVID
748*eee96f10SToomas Soome */
749*eee96f10SToomas Soome if (ud_get_latest_lvid(h, lvds_loc, lvds_len) != 0) {
750*eee96f10SToomas Soome return (1);
751*eee96f10SToomas Soome }
752*eee96f10SToomas Soome
753*eee96f10SToomas Soome if (ud_get_latest_fsd(h, fsd_prn, fsd_loc, fsd_len) != 0) {
754*eee96f10SToomas Soome return (1);
755*eee96f10SToomas Soome }
756*eee96f10SToomas Soome
757*eee96f10SToomas Soome return (0);
758*eee96f10SToomas Soome }
759*eee96f10SToomas Soome
760*eee96f10SToomas Soome static int32_t
ud_get_latest_lvid(ud_handle_t h,uint32_t lvds_loc,uint32_t lvds_len)761*eee96f10SToomas Soome ud_get_latest_lvid(ud_handle_t h, uint32_t lvds_loc, uint32_t lvds_len)
762*eee96f10SToomas Soome {
763*eee96f10SToomas Soome uint8_t *addr, *taddr, *eaddr;
764*eee96f10SToomas Soome uint16_t id;
765*eee96f10SToomas Soome uint64_t off;
766*eee96f10SToomas Soome struct tag *tag;
767*eee96f10SToomas Soome struct log_vol_int_desc *lvid;
768*eee96f10SToomas Soome
769*eee96f10SToomas Soome begin:
770*eee96f10SToomas Soome if ((addr = (uint8_t *)malloc(lvds_len)) == NULL) {
771*eee96f10SToomas Soome return (1);
772*eee96f10SToomas Soome }
773*eee96f10SToomas Soome
774*eee96f10SToomas Soome off = lvds_loc * h->udfs.lbsize;
775*eee96f10SToomas Soome if (ud_read_dev(h, off, addr, lvds_len) != 0) {
776*eee96f10SToomas Soome goto end;
777*eee96f10SToomas Soome }
778*eee96f10SToomas Soome
779*eee96f10SToomas Soome for (taddr = addr, eaddr = addr + h->udfs.mvds_len; taddr < eaddr;
780*eee96f10SToomas Soome taddr += h->udfs.lbsize, lvds_loc ++) {
781*eee96f10SToomas Soome
782*eee96f10SToomas Soome /* LINTED */
783*eee96f10SToomas Soome tag = (struct tag *)taddr;
784*eee96f10SToomas Soome id = SWAP_16(tag->tag_id);
785*eee96f10SToomas Soome /*
786*eee96f10SToomas Soome * If you cannot verify the tag just skip it
787*eee96f10SToomas Soome * This is not a fatal error
788*eee96f10SToomas Soome */
789*eee96f10SToomas Soome if (ud_verify_tag(h, tag, id, lvds_loc, 1, 0) != 0) {
790*eee96f10SToomas Soome continue;
791*eee96f10SToomas Soome }
792*eee96f10SToomas Soome switch (id) {
793*eee96f10SToomas Soome case UD_LOG_VOL_INT :
794*eee96f10SToomas Soome
795*eee96f10SToomas Soome /*
796*eee96f10SToomas Soome * Logical Volume Integrity Descriptor
797*eee96f10SToomas Soome */
798*eee96f10SToomas Soome /* LINTED */
799*eee96f10SToomas Soome lvid = (struct log_vol_int_desc *)taddr;
800*eee96f10SToomas Soome h->udfs.lvid_loc = lvds_loc;
801*eee96f10SToomas Soome h->udfs.lvid_len = ((uint32_t)
802*eee96f10SToomas Soome &((struct log_vol_int_desc *)0)->lvid_fst) +
803*eee96f10SToomas Soome SWAP_32(lvid->lvid_npart) * 8 +
804*eee96f10SToomas Soome SWAP_32(lvid->lvid_liu);
805*eee96f10SToomas Soome h->udfs.lvid_len = lb_roundup(h->udfs.lvid_len,
806*eee96f10SToomas Soome h->udfs.lbsize);
807*eee96f10SToomas Soome
808*eee96f10SToomas Soome /*
809*eee96f10SToomas Soome * It seems we have a next integrity
810*eee96f10SToomas Soome * sequence
811*eee96f10SToomas Soome */
812*eee96f10SToomas Soome if (SWAP_32(lvid->lvid_nie.ext_len) != 0) {
813*eee96f10SToomas Soome free(addr);
814*eee96f10SToomas Soome lvds_loc = SWAP_32(lvid->lvid_nie.ext_loc);
815*eee96f10SToomas Soome lvds_len = SWAP_32(lvid->lvid_nie.ext_len);
816*eee96f10SToomas Soome goto begin;
817*eee96f10SToomas Soome }
818*eee96f10SToomas Soome goto end;
819*eee96f10SToomas Soome case UD_TERM_DESC :
820*eee96f10SToomas Soome
821*eee96f10SToomas Soome /*
822*eee96f10SToomas Soome * Success fully completed
823*eee96f10SToomas Soome */
824*eee96f10SToomas Soome goto end;
825*eee96f10SToomas Soome default :
826*eee96f10SToomas Soome /*
827*eee96f10SToomas Soome * If you donot undetstand any tag just skip
828*eee96f10SToomas Soome * it. This is not a fatal error
829*eee96f10SToomas Soome */
830*eee96f10SToomas Soome break;
831*eee96f10SToomas Soome }
832*eee96f10SToomas Soome }
833*eee96f10SToomas Soome end:
834*eee96f10SToomas Soome free(addr);
835*eee96f10SToomas Soome if (h->udfs.lvid_len == 0) {
836*eee96f10SToomas Soome return (1);
837*eee96f10SToomas Soome }
838*eee96f10SToomas Soome return (0);
839*eee96f10SToomas Soome }
840*eee96f10SToomas Soome
841*eee96f10SToomas Soome static int32_t
ud_get_latest_fsd(ud_handle_t h,uint16_t fsd_prn,uint32_t fsd_loc,uint32_t fsd_len)842*eee96f10SToomas Soome ud_get_latest_fsd(ud_handle_t h, uint16_t fsd_prn,
843*eee96f10SToomas Soome uint32_t fsd_loc, uint32_t fsd_len)
844*eee96f10SToomas Soome {
845*eee96f10SToomas Soome uint8_t *addr, *taddr, *eaddr;
846*eee96f10SToomas Soome uint16_t id;
847*eee96f10SToomas Soome uint64_t off;
848*eee96f10SToomas Soome uint32_t fsds_loc, fsds_len;
849*eee96f10SToomas Soome struct tag *tag;
850*eee96f10SToomas Soome struct file_set_desc *fsd;
851*eee96f10SToomas Soome uint32_t old_fsn = 0;
852*eee96f10SToomas Soome
853*eee96f10SToomas Soome begin:
854*eee96f10SToomas Soome h->udfs.fsds_prn = fsd_prn;
855*eee96f10SToomas Soome h->udfs.fsds_loc = fsd_loc;
856*eee96f10SToomas Soome h->udfs.fsds_len = fsd_len;
857*eee96f10SToomas Soome
858*eee96f10SToomas Soome fsds_loc = ud_xlate_to_daddr(h, fsd_prn, fsd_loc);
859*eee96f10SToomas Soome fsds_len = lb_roundup(fsd_len, h->udfs.lbsize);
860*eee96f10SToomas Soome
861*eee96f10SToomas Soome if ((addr = (uint8_t *)malloc(fsds_len)) == NULL) {
862*eee96f10SToomas Soome return (1);
863*eee96f10SToomas Soome }
864*eee96f10SToomas Soome
865*eee96f10SToomas Soome off = fsds_loc * h->udfs.lbsize;
866*eee96f10SToomas Soome if (ud_read_dev(h, off, addr, fsds_len) != 0) {
867*eee96f10SToomas Soome goto end;
868*eee96f10SToomas Soome }
869*eee96f10SToomas Soome
870*eee96f10SToomas Soome for (taddr = addr, eaddr = addr + h->udfs.mvds_len; taddr < eaddr;
871*eee96f10SToomas Soome taddr += h->udfs.lbsize, fsds_loc ++) {
872*eee96f10SToomas Soome
873*eee96f10SToomas Soome /* LINTED */
874*eee96f10SToomas Soome tag = (struct tag *)taddr;
875*eee96f10SToomas Soome id = SWAP_16(tag->tag_id);
876*eee96f10SToomas Soome /*
877*eee96f10SToomas Soome * If you cannot verify the tag just skip it
878*eee96f10SToomas Soome * This is not a fatal error
879*eee96f10SToomas Soome */
880*eee96f10SToomas Soome if (ud_verify_tag(h, tag, id, fsds_loc, 1, 0) != 0) {
881*eee96f10SToomas Soome continue;
882*eee96f10SToomas Soome }
883*eee96f10SToomas Soome switch (id) {
884*eee96f10SToomas Soome case UD_FILE_SET_DESC :
885*eee96f10SToomas Soome /* LINTED */
886*eee96f10SToomas Soome fsd = (struct file_set_desc *)taddr;
887*eee96f10SToomas Soome if ((h->udfs.fsd_len == 0) ||
888*eee96f10SToomas Soome (SWAP_32(fsd->fsd_fs_no) > old_fsn)) {
889*eee96f10SToomas Soome old_fsn = SWAP_32(fsd->fsd_fs_no);
890*eee96f10SToomas Soome h->udfs.fsd_loc = fsds_loc;
891*eee96f10SToomas Soome h->udfs.fsd_len = lb_roundup(512,
892*eee96f10SToomas Soome h->udfs.lbsize);
893*eee96f10SToomas Soome h->udfs.ricb_prn =
894*eee96f10SToomas Soome SWAP_16(fsd->fsd_root_icb.lad_ext_prn);
895*eee96f10SToomas Soome h->udfs.ricb_loc =
896*eee96f10SToomas Soome SWAP_32(fsd->fsd_root_icb.lad_ext_loc);
897*eee96f10SToomas Soome h->udfs.ricb_len =
898*eee96f10SToomas Soome SWAP_32(fsd->fsd_root_icb.lad_ext_len);
899*eee96f10SToomas Soome }
900*eee96f10SToomas Soome if (SWAP_32(fsd->fsd_next.lad_ext_len) != 0) {
901*eee96f10SToomas Soome fsd_prn = SWAP_16(fsd->fsd_next.lad_ext_prn);
902*eee96f10SToomas Soome fsd_loc = SWAP_32(fsd->fsd_next.lad_ext_loc);
903*eee96f10SToomas Soome fsd_len = SWAP_32(fsd->fsd_next.lad_ext_len);
904*eee96f10SToomas Soome goto begin;
905*eee96f10SToomas Soome }
906*eee96f10SToomas Soome break;
907*eee96f10SToomas Soome case UD_TERM_DESC :
908*eee96f10SToomas Soome
909*eee96f10SToomas Soome /*
910*eee96f10SToomas Soome * Success fully completed
911*eee96f10SToomas Soome */
912*eee96f10SToomas Soome goto end;
913*eee96f10SToomas Soome default :
914*eee96f10SToomas Soome /*
915*eee96f10SToomas Soome * If you donot undetstand any tag just skip
916*eee96f10SToomas Soome * it. This is not a fatal error
917*eee96f10SToomas Soome */
918*eee96f10SToomas Soome break;
919*eee96f10SToomas Soome }
920*eee96f10SToomas Soome }
921*eee96f10SToomas Soome
922*eee96f10SToomas Soome end:
923*eee96f10SToomas Soome free(addr);
924*eee96f10SToomas Soome if (h->udfs.fsd_len == 0) {
925*eee96f10SToomas Soome return (1);
926*eee96f10SToomas Soome }
927*eee96f10SToomas Soome return (0);
928*eee96f10SToomas Soome }
929*eee96f10SToomas Soome
930*eee96f10SToomas Soome int32_t
ud_get_num_blks(ud_handle_t h,uint32_t * blkno)931*eee96f10SToomas Soome ud_get_num_blks(ud_handle_t h, uint32_t *blkno)
932*eee96f10SToomas Soome {
933*eee96f10SToomas Soome struct vtoc vtoc;
934*eee96f10SToomas Soome struct dk_cinfo dki_info;
935*eee96f10SToomas Soome int32_t error;
936*eee96f10SToomas Soome
937*eee96f10SToomas Soome /*
938*eee96f10SToomas Soome * Get VTOC from driver
939*eee96f10SToomas Soome */
940*eee96f10SToomas Soome if ((error = ioctl(h->fd, DKIOCGVTOC, (intptr_t)&vtoc)) != 0) {
941*eee96f10SToomas Soome return (error);
942*eee96f10SToomas Soome }
943*eee96f10SToomas Soome
944*eee96f10SToomas Soome /*
945*eee96f10SToomas Soome * Verify if is proper
946*eee96f10SToomas Soome */
947*eee96f10SToomas Soome if (vtoc.v_sanity != VTOC_SANE) {
948*eee96f10SToomas Soome return (EINVAL);
949*eee96f10SToomas Soome }
950*eee96f10SToomas Soome
951*eee96f10SToomas Soome /*
952*eee96f10SToomas Soome * Get dk_cinfo from driver
953*eee96f10SToomas Soome */
954*eee96f10SToomas Soome if ((error = ioctl(h->fd, DKIOCINFO, (intptr_t)&dki_info)) != 0) {
955*eee96f10SToomas Soome return (error);
956*eee96f10SToomas Soome }
957*eee96f10SToomas Soome
958*eee96f10SToomas Soome if (dki_info.dki_partition >= V_NUMPAR) {
959*eee96f10SToomas Soome return (EINVAL);
960*eee96f10SToomas Soome }
961*eee96f10SToomas Soome
962*eee96f10SToomas Soome /*
963*eee96f10SToomas Soome * Return the size of the partition
964*eee96f10SToomas Soome */
965*eee96f10SToomas Soome *blkno = vtoc.v_part[dki_info.dki_partition].p_size;
966*eee96f10SToomas Soome
967*eee96f10SToomas Soome return (0);
968*eee96f10SToomas Soome }
969*eee96f10SToomas Soome
970*eee96f10SToomas Soome uint32_t
ud_xlate_to_daddr(ud_handle_t h,uint16_t prn,uint32_t blkno)971*eee96f10SToomas Soome ud_xlate_to_daddr(ud_handle_t h, uint16_t prn, uint32_t blkno)
972*eee96f10SToomas Soome {
973*eee96f10SToomas Soome int32_t i;
974*eee96f10SToomas Soome struct ud_map *m;
975*eee96f10SToomas Soome struct ud_part *p;
976*eee96f10SToomas Soome
977*eee96f10SToomas Soome
978*eee96f10SToomas Soome if (prn < h->n_maps) {
979*eee96f10SToomas Soome m = &h->maps[prn];
980*eee96f10SToomas Soome for (i = 0; i < h->n_parts; i++) {
981*eee96f10SToomas Soome p = &h->part[i];
982*eee96f10SToomas Soome if (m->udm_pn == p->udp_number) {
983*eee96f10SToomas Soome return (p->udp_start + blkno);
984*eee96f10SToomas Soome }
985*eee96f10SToomas Soome }
986*eee96f10SToomas Soome }
987*eee96f10SToomas Soome return (0);
988*eee96f10SToomas Soome }
989*eee96f10SToomas Soome
990*eee96f10SToomas Soome /* ------ END Read and translate the on disk VDS to IN CORE format -------- */
991*eee96f10SToomas Soome
992*eee96f10SToomas Soome int32_t
ud_verify_tag(ud_handle_t h,struct tag * tag,uint16_t id,uint32_t blockno,int32_t do_crc,int32_t print_msg)993*eee96f10SToomas Soome ud_verify_tag(ud_handle_t h, struct tag *tag, uint16_t id,
994*eee96f10SToomas Soome uint32_t blockno, int32_t do_crc, int32_t print_msg)
995*eee96f10SToomas Soome {
996*eee96f10SToomas Soome int32_t i;
997*eee96f10SToomas Soome uint8_t *addr, cksum = 0;
998*eee96f10SToomas Soome uint16_t crc;
999*eee96f10SToomas Soome
1000*eee96f10SToomas Soome
1001*eee96f10SToomas Soome /*
1002*eee96f10SToomas Soome * Verify Tag Identifier
1003*eee96f10SToomas Soome */
1004*eee96f10SToomas Soome if (tag->tag_id != SWAP_16(id)) {
1005*eee96f10SToomas Soome if (print_msg != 0) {
1006*eee96f10SToomas Soome (void) fprintf(stderr,
1007*eee96f10SToomas Soome gettext("tag does not verify tag %x req %x\n"),
1008*eee96f10SToomas Soome SWAP_16(tag->tag_id), id);
1009*eee96f10SToomas Soome }
1010*eee96f10SToomas Soome return (1);
1011*eee96f10SToomas Soome }
1012*eee96f10SToomas Soome
1013*eee96f10SToomas Soome /*
1014*eee96f10SToomas Soome * Verify Tag Descriptor Version
1015*eee96f10SToomas Soome */
1016*eee96f10SToomas Soome if (SWAP_16(tag->tag_desc_ver) != h->udfs.ecma_version) {
1017*eee96f10SToomas Soome if (print_msg != 0) {
1018*eee96f10SToomas Soome (void) fprintf(stderr,
1019*eee96f10SToomas Soome gettext("tag version does not match with "
1020*eee96f10SToomas Soome "NSR descriptor version TAG %x NSR %x\n"),
1021*eee96f10SToomas Soome SWAP_16(tag->tag_desc_ver),
1022*eee96f10SToomas Soome h->udfs.ecma_version);
1023*eee96f10SToomas Soome }
1024*eee96f10SToomas Soome return (1);
1025*eee96f10SToomas Soome }
1026*eee96f10SToomas Soome
1027*eee96f10SToomas Soome /*
1028*eee96f10SToomas Soome * Caliculate Tag Checksum
1029*eee96f10SToomas Soome */
1030*eee96f10SToomas Soome addr = (uint8_t *)tag;
1031*eee96f10SToomas Soome for (i = 0; i <= 15; i++) {
1032*eee96f10SToomas Soome if (i != 4) {
1033*eee96f10SToomas Soome cksum += addr[i];
1034*eee96f10SToomas Soome }
1035*eee96f10SToomas Soome }
1036*eee96f10SToomas Soome
1037*eee96f10SToomas Soome /*
1038*eee96f10SToomas Soome * Verify Tag Checksum
1039*eee96f10SToomas Soome */
1040*eee96f10SToomas Soome if (cksum != tag->tag_cksum) {
1041*eee96f10SToomas Soome if (print_msg != 0) {
1042*eee96f10SToomas Soome (void) fprintf(stderr,
1043*eee96f10SToomas Soome gettext("Checksum Does not Verify TAG"
1044*eee96f10SToomas Soome " %x CALC %x\n"), tag->tag_cksum, cksum);
1045*eee96f10SToomas Soome }
1046*eee96f10SToomas Soome return (1);
1047*eee96f10SToomas Soome }
1048*eee96f10SToomas Soome
1049*eee96f10SToomas Soome
1050*eee96f10SToomas Soome /*
1051*eee96f10SToomas Soome * Do we want to do crc
1052*eee96f10SToomas Soome */
1053*eee96f10SToomas Soome if (do_crc) {
1054*eee96f10SToomas Soome if (tag->tag_crc_len) {
1055*eee96f10SToomas Soome
1056*eee96f10SToomas Soome /*
1057*eee96f10SToomas Soome * Caliculate CRC for the descriptor
1058*eee96f10SToomas Soome */
1059*eee96f10SToomas Soome crc = ud_crc(addr + 0x10, SWAP_16(tag->tag_crc_len));
1060*eee96f10SToomas Soome
1061*eee96f10SToomas Soome /*
1062*eee96f10SToomas Soome * Verify CRC
1063*eee96f10SToomas Soome */
1064*eee96f10SToomas Soome if (crc != SWAP_16(tag->tag_crc)) {
1065*eee96f10SToomas Soome if (print_msg != 0) {
1066*eee96f10SToomas Soome (void) fprintf(stderr,
1067*eee96f10SToomas Soome gettext("CRC Does not verify"
1068*eee96f10SToomas Soome " TAG %x CALC %x %x\n"),
1069*eee96f10SToomas Soome SWAP_16(tag->tag_crc),
1070*eee96f10SToomas Soome crc, addr);
1071*eee96f10SToomas Soome }
1072*eee96f10SToomas Soome }
1073*eee96f10SToomas Soome }
1074*eee96f10SToomas Soome
1075*eee96f10SToomas Soome /*
1076*eee96f10SToomas Soome * Verify Tag Location
1077*eee96f10SToomas Soome */
1078*eee96f10SToomas Soome if (SWAP_32(blockno) != tag->tag_loc) {
1079*eee96f10SToomas Soome if (print_msg != 0) {
1080*eee96f10SToomas Soome (void) fprintf(stderr,
1081*eee96f10SToomas Soome gettext("Tag Location Does not verify"
1082*eee96f10SToomas Soome " blockno %x tag_blockno %x\n"),
1083*eee96f10SToomas Soome blockno, SWAP_32(tag->tag_loc));
1084*eee96f10SToomas Soome }
1085*eee96f10SToomas Soome }
1086*eee96f10SToomas Soome }
1087*eee96f10SToomas Soome
1088*eee96f10SToomas Soome return (0);
1089*eee96f10SToomas Soome }
1090*eee96f10SToomas Soome
1091*eee96f10SToomas Soome
1092*eee96f10SToomas Soome /* ARGSUSED1 */
1093*eee96f10SToomas Soome void
ud_make_tag(ud_handle_t h,struct tag * tag,uint16_t tag_id,uint32_t blkno,uint16_t crc_len)1094*eee96f10SToomas Soome ud_make_tag(ud_handle_t h, struct tag *tag, uint16_t tag_id,
1095*eee96f10SToomas Soome uint32_t blkno, uint16_t crc_len)
1096*eee96f10SToomas Soome {
1097*eee96f10SToomas Soome int32_t i;
1098*eee96f10SToomas Soome uint16_t crc;
1099*eee96f10SToomas Soome uint8_t *addr, cksum = 0;
1100*eee96f10SToomas Soome
1101*eee96f10SToomas Soome tag->tag_id = SWAP_16(tag_id);
1102*eee96f10SToomas Soome tag->tag_desc_ver = SWAP_16(h->udfs.ecma_version);
1103*eee96f10SToomas Soome tag->tag_cksum = 0;
1104*eee96f10SToomas Soome tag->tag_res = 0;
1105*eee96f10SToomas Soome
1106*eee96f10SToomas Soome /*
1107*eee96f10SToomas Soome * Calicualte and assign CRC, CRC_LEN
1108*eee96f10SToomas Soome */
1109*eee96f10SToomas Soome addr = (uint8_t *)tag;
1110*eee96f10SToomas Soome crc = ud_crc(addr + 0x10, crc_len);
1111*eee96f10SToomas Soome tag->tag_crc = SWAP_16(crc);
1112*eee96f10SToomas Soome tag->tag_crc_len = SWAP_16(crc_len);
1113*eee96f10SToomas Soome tag->tag_loc = SWAP_32(blkno);
1114*eee96f10SToomas Soome
1115*eee96f10SToomas Soome /*
1116*eee96f10SToomas Soome * Caliculate Checksum
1117*eee96f10SToomas Soome */
1118*eee96f10SToomas Soome for (i = 0; i <= 15; i++) {
1119*eee96f10SToomas Soome cksum += addr[i];
1120*eee96f10SToomas Soome }
1121*eee96f10SToomas Soome
1122*eee96f10SToomas Soome /*
1123*eee96f10SToomas Soome * Assign Checksum
1124*eee96f10SToomas Soome */
1125*eee96f10SToomas Soome tag->tag_cksum = cksum;
1126*eee96f10SToomas Soome }
1127*eee96f10SToomas Soome
1128*eee96f10SToomas Soome /* **************** udf specific subroutines *********************** */
1129*eee96f10SToomas Soome
1130*eee96f10SToomas Soome static uint16_t ud_crc_table[256] = {
1131*eee96f10SToomas Soome 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
1132*eee96f10SToomas Soome 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
1133*eee96f10SToomas Soome 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
1134*eee96f10SToomas Soome 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
1135*eee96f10SToomas Soome 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
1136*eee96f10SToomas Soome 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
1137*eee96f10SToomas Soome 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
1138*eee96f10SToomas Soome 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
1139*eee96f10SToomas Soome 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
1140*eee96f10SToomas Soome 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
1141*eee96f10SToomas Soome 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
1142*eee96f10SToomas Soome 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
1143*eee96f10SToomas Soome 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
1144*eee96f10SToomas Soome 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
1145*eee96f10SToomas Soome 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
1146*eee96f10SToomas Soome 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
1147*eee96f10SToomas Soome 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
1148*eee96f10SToomas Soome 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
1149*eee96f10SToomas Soome 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
1150*eee96f10SToomas Soome 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
1151*eee96f10SToomas Soome 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
1152*eee96f10SToomas Soome 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
1153*eee96f10SToomas Soome 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
1154*eee96f10SToomas Soome 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
1155*eee96f10SToomas Soome 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
1156*eee96f10SToomas Soome 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
1157*eee96f10SToomas Soome 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
1158*eee96f10SToomas Soome 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
1159*eee96f10SToomas Soome 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
1160*eee96f10SToomas Soome 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
1161*eee96f10SToomas Soome 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
1162*eee96f10SToomas Soome 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
1163*eee96f10SToomas Soome };
1164*eee96f10SToomas Soome
1165*eee96f10SToomas Soome static uint16_t
ud_crc(uint8_t * addr,int32_t len)1166*eee96f10SToomas Soome ud_crc(uint8_t *addr, int32_t len)
1167*eee96f10SToomas Soome {
1168*eee96f10SToomas Soome uint16_t crc = 0;
1169*eee96f10SToomas Soome
1170*eee96f10SToomas Soome while (len-- > 0) {
1171*eee96f10SToomas Soome crc = ud_crc_table[(crc >> 8 ^ *addr++) & 0xff] ^ (crc<<8);
1172*eee96f10SToomas Soome }
1173*eee96f10SToomas Soome
1174*eee96f10SToomas Soome return (crc);
1175*eee96f10SToomas Soome }
1176*eee96f10SToomas Soome
1177*eee96f10SToomas Soome #define MAXNAMLEN 0x200
1178*eee96f10SToomas Soome
1179*eee96f10SToomas Soome
1180*eee96f10SToomas Soome #define POUND 0x0023
1181*eee96f10SToomas Soome #define DOT 0x002E
1182*eee96f10SToomas Soome #define SLASH 0x002F
1183*eee96f10SToomas Soome #define UNDERBAR 0x005F
1184*eee96f10SToomas Soome
1185*eee96f10SToomas Soome
1186*eee96f10SToomas Soome static uint16_t htoc[16] = {'0', '1', '2', '3',
1187*eee96f10SToomas Soome '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
1188*eee96f10SToomas Soome /*
1189*eee96f10SToomas Soome * unicode is the string of 16-bot characters
1190*eee96f10SToomas Soome * length is the number of 16-bit characters
1191*eee96f10SToomas Soome */
1192*eee96f10SToomas Soome static int32_t
UdfTxName(uint16_t * unicode,int32_t count)1193*eee96f10SToomas Soome UdfTxName(uint16_t *unicode, int32_t count)
1194*eee96f10SToomas Soome {
1195*eee96f10SToomas Soome int32_t i, j, k, lic, make_crc, dot_loc;
1196*eee96f10SToomas Soome uint16_t crc;
1197*eee96f10SToomas Soome
1198*eee96f10SToomas Soome if ((unicode[0] == DOT) &&
1199*eee96f10SToomas Soome ((count == 1) || ((count == 2) && (unicode[1] == DOT)))) {
1200*eee96f10SToomas Soome crc = DOT;
1201*eee96f10SToomas Soome if (count == 2) {
1202*eee96f10SToomas Soome crc += DOT;
1203*eee96f10SToomas Soome }
1204*eee96f10SToomas Soome unicode[0] = UNDERBAR;
1205*eee96f10SToomas Soome unicode[1] = POUND;
1206*eee96f10SToomas Soome unicode[2] = htoc[(uint16_t)(crc & 0xf000) >> 12];
1207*eee96f10SToomas Soome unicode[3] = htoc[(uint16_t)(crc & 0xf00) >> 8];
1208*eee96f10SToomas Soome unicode[4] = htoc[(uint16_t)(crc & 0xf0) >> 4];
1209*eee96f10SToomas Soome unicode[5] = htoc[crc & 0xf];
1210*eee96f10SToomas Soome return (6);
1211*eee96f10SToomas Soome }
1212*eee96f10SToomas Soome crc = 0;
1213*eee96f10SToomas Soome j = make_crc = 0;
1214*eee96f10SToomas Soome lic = dot_loc = -1;
1215*eee96f10SToomas Soome for (i = 0; i < count; i++) {
1216*eee96f10SToomas Soome if (make_crc) {
1217*eee96f10SToomas Soome crc += unicode[i];
1218*eee96f10SToomas Soome }
1219*eee96f10SToomas Soome if (unicode[i] == DOT) {
1220*eee96f10SToomas Soome dot_loc = j;
1221*eee96f10SToomas Soome }
1222*eee96f10SToomas Soome if ((unicode[i] == SLASH) ||
1223*eee96f10SToomas Soome (unicode[i] == 0)) {
1224*eee96f10SToomas Soome if (make_crc == 0) {
1225*eee96f10SToomas Soome for (k = 0; k <= i; k++) {
1226*eee96f10SToomas Soome crc += unicode[k];
1227*eee96f10SToomas Soome }
1228*eee96f10SToomas Soome make_crc = 1;
1229*eee96f10SToomas Soome }
1230*eee96f10SToomas Soome if (lic != (i - 1)) {
1231*eee96f10SToomas Soome unicode[j++] = UNDERBAR;
1232*eee96f10SToomas Soome }
1233*eee96f10SToomas Soome lic = i;
1234*eee96f10SToomas Soome } else {
1235*eee96f10SToomas Soome unicode[j++] = unicode[i];
1236*eee96f10SToomas Soome }
1237*eee96f10SToomas Soome }
1238*eee96f10SToomas Soome
1239*eee96f10SToomas Soome if (make_crc) {
1240*eee96f10SToomas Soome if (dot_loc != -1) {
1241*eee96f10SToomas Soome if ((j + 5) > MAXNAMLEN) {
1242*eee96f10SToomas Soome if ((j - dot_loc + 5) > MAXNAMLEN) {
1243*eee96f10SToomas Soome j = MAXNAMLEN - 5 + dot_loc;
1244*eee96f10SToomas Soome for (k = MAXNAMLEN;
1245*eee96f10SToomas Soome j >= dot_loc; k --, j--) {
1246*eee96f10SToomas Soome unicode[k] = unicode[j];
1247*eee96f10SToomas Soome }
1248*eee96f10SToomas Soome k = 0;
1249*eee96f10SToomas Soome } else {
1250*eee96f10SToomas Soome for (k = MAXNAMLEN;
1251*eee96f10SToomas Soome j >= dot_loc; k--, j--) {
1252*eee96f10SToomas Soome unicode[k] = unicode[j];
1253*eee96f10SToomas Soome }
1254*eee96f10SToomas Soome k -= 4;
1255*eee96f10SToomas Soome }
1256*eee96f10SToomas Soome j = MAXNAMLEN;
1257*eee96f10SToomas Soome } else {
1258*eee96f10SToomas Soome for (k = j; k >= dot_loc; k--) {
1259*eee96f10SToomas Soome unicode[k + 5] = unicode[k];
1260*eee96f10SToomas Soome }
1261*eee96f10SToomas Soome k = dot_loc;
1262*eee96f10SToomas Soome j += 5;
1263*eee96f10SToomas Soome }
1264*eee96f10SToomas Soome } else {
1265*eee96f10SToomas Soome if ((j + 5) > MAXNAMLEN) {
1266*eee96f10SToomas Soome j = MAXNAMLEN;
1267*eee96f10SToomas Soome k = MAXNAMLEN - 5;
1268*eee96f10SToomas Soome } else {
1269*eee96f10SToomas Soome k = j;
1270*eee96f10SToomas Soome j += 5;
1271*eee96f10SToomas Soome }
1272*eee96f10SToomas Soome }
1273*eee96f10SToomas Soome unicode[k++] = POUND;
1274*eee96f10SToomas Soome unicode[k++] = htoc[(uint16_t)(crc & 0xf000) >> 12];
1275*eee96f10SToomas Soome unicode[k++] = htoc[(uint16_t)(crc & 0xf00) >> 8];
1276*eee96f10SToomas Soome unicode[k++] = htoc[(uint16_t)(crc & 0xf0) >> 4];
1277*eee96f10SToomas Soome unicode[k++] = htoc[crc & 0xf];
1278*eee96f10SToomas Soome }
1279*eee96f10SToomas Soome return (j);
1280*eee96f10SToomas Soome }
1281*eee96f10SToomas Soome
1282*eee96f10SToomas Soome /*
1283*eee96f10SToomas Soome * Assumes the output buffer is large
1284*eee96f10SToomas Soome * enough to hold the uncompressed
1285*eee96f10SToomas Soome * code
1286*eee96f10SToomas Soome */
1287*eee96f10SToomas Soome static int32_t
UncompressUnicode(int32_t numberOfBytes,uint8_t * UDFCompressed,uint16_t * unicode)1288*eee96f10SToomas Soome UncompressUnicode(
1289*eee96f10SToomas Soome int32_t numberOfBytes, /* (Input) number of bytes read from media. */
1290*eee96f10SToomas Soome uint8_t *UDFCompressed, /* (Input) bytes read from media. */
1291*eee96f10SToomas Soome uint16_t *unicode) /* (Output) uncompressed unicode characters. */
1292*eee96f10SToomas Soome {
1293*eee96f10SToomas Soome int32_t compID;
1294*eee96f10SToomas Soome int32_t returnValue, unicodeIndex, byteIndex;
1295*eee96f10SToomas Soome
1296*eee96f10SToomas Soome
1297*eee96f10SToomas Soome /*
1298*eee96f10SToomas Soome * Use UDFCompressed to store current byte being read.
1299*eee96f10SToomas Soome */
1300*eee96f10SToomas Soome compID = UDFCompressed[0];
1301*eee96f10SToomas Soome
1302*eee96f10SToomas Soome /* First check for valid compID. */
1303*eee96f10SToomas Soome if (compID != 8 && compID != 16) {
1304*eee96f10SToomas Soome returnValue = -1;
1305*eee96f10SToomas Soome } else {
1306*eee96f10SToomas Soome unicodeIndex = 0;
1307*eee96f10SToomas Soome byteIndex = 1;
1308*eee96f10SToomas Soome
1309*eee96f10SToomas Soome /* Loop through all the bytes. */
1310*eee96f10SToomas Soome while (byteIndex < numberOfBytes) {
1311*eee96f10SToomas Soome if (compID == 16) {
1312*eee96f10SToomas Soome /*
1313*eee96f10SToomas Soome * Move the first byte to the
1314*eee96f10SToomas Soome * high bits of the unicode char.
1315*eee96f10SToomas Soome */
1316*eee96f10SToomas Soome unicode[unicodeIndex] =
1317*eee96f10SToomas Soome UDFCompressed[byteIndex++] << 8;
1318*eee96f10SToomas Soome } else {
1319*eee96f10SToomas Soome unicode[unicodeIndex] = 0;
1320*eee96f10SToomas Soome }
1321*eee96f10SToomas Soome if (byteIndex < numberOfBytes) {
1322*eee96f10SToomas Soome /*
1323*eee96f10SToomas Soome * Then the next byte to the low bits.
1324*eee96f10SToomas Soome */
1325*eee96f10SToomas Soome unicode[unicodeIndex] |=
1326*eee96f10SToomas Soome UDFCompressed[byteIndex++];
1327*eee96f10SToomas Soome }
1328*eee96f10SToomas Soome unicodeIndex++;
1329*eee96f10SToomas Soome }
1330*eee96f10SToomas Soome returnValue = unicodeIndex;
1331*eee96f10SToomas Soome }
1332*eee96f10SToomas Soome return (returnValue);
1333*eee96f10SToomas Soome }
1334*eee96f10SToomas Soome
1335*eee96f10SToomas Soome
1336*eee96f10SToomas Soome
1337*eee96f10SToomas Soome
1338*eee96f10SToomas Soome
1339*eee96f10SToomas Soome static int32_t
ud_compressunicode(int32_t numberOfChars,int32_t compID,uint16_t * unicode,uint8_t * UDFCompressed)1340*eee96f10SToomas Soome ud_compressunicode(
1341*eee96f10SToomas Soome int32_t numberOfChars, /* (Input) number of unicode characters. */
1342*eee96f10SToomas Soome int32_t compID, /* (Input) compression ID to be used. */
1343*eee96f10SToomas Soome uint16_t *unicode, /* (Input) unicode characters to compress. */
1344*eee96f10SToomas Soome uint8_t *UDFCompressed) /* (Output) compressed string, as bytes. */
1345*eee96f10SToomas Soome {
1346*eee96f10SToomas Soome int32_t byteIndex;
1347*eee96f10SToomas Soome
1348*eee96f10SToomas Soome if (compID != 8 && compID != 16) {
1349*eee96f10SToomas Soome /*
1350*eee96f10SToomas Soome * Unsupported compression ID !
1351*eee96f10SToomas Soome */
1352*eee96f10SToomas Soome byteIndex = -1;
1353*eee96f10SToomas Soome } else {
1354*eee96f10SToomas Soome /*
1355*eee96f10SToomas Soome * Place compression code in first byte.
1356*eee96f10SToomas Soome */
1357*eee96f10SToomas Soome UDFCompressed[0] = (uint8_t)compID;
1358*eee96f10SToomas Soome (void) strncpy((caddr_t)&UDFCompressed[1],
1359*eee96f10SToomas Soome (caddr_t)unicode, numberOfChars);
1360*eee96f10SToomas Soome byteIndex = numberOfChars + 1;
1361*eee96f10SToomas Soome }
1362*eee96f10SToomas Soome return (byteIndex);
1363*eee96f10SToomas Soome }
1364*eee96f10SToomas Soome
1365*eee96f10SToomas Soome
1366*eee96f10SToomas Soome static int32_t
ud_convert2utf8(uint8_t * ibuf,uint8_t * obuf,int32_t length)1367*eee96f10SToomas Soome ud_convert2utf8(uint8_t *ibuf, uint8_t *obuf, int32_t length)
1368*eee96f10SToomas Soome {
1369*eee96f10SToomas Soome int i, size;
1370*eee96f10SToomas Soome uint16_t *buf;
1371*eee96f10SToomas Soome
1372*eee96f10SToomas Soome /* LINTED */
1373*eee96f10SToomas Soome buf = (uint16_t *)obuf;
1374*eee96f10SToomas Soome
1375*eee96f10SToomas Soome size = UncompressUnicode(length, ibuf, buf);
1376*eee96f10SToomas Soome
1377*eee96f10SToomas Soome size = UdfTxName(buf, size);
1378*eee96f10SToomas Soome
1379*eee96f10SToomas Soome for (i = 0; i < size; i++) {
1380*eee96f10SToomas Soome obuf[i] = (uint8_t)buf[i];
1381*eee96f10SToomas Soome }
1382*eee96f10SToomas Soome obuf[i] = '\0';
1383*eee96f10SToomas Soome
1384*eee96f10SToomas Soome return (size);
1385*eee96f10SToomas Soome }
1386*eee96f10SToomas Soome
1387*eee96f10SToomas Soome static int32_t
ud_convert2utf16(uint8_t * ibuf,uint8_t * obuf,int32_t length)1388*eee96f10SToomas Soome ud_convert2utf16(uint8_t *ibuf, uint8_t *obuf, int32_t length)
1389*eee96f10SToomas Soome {
1390*eee96f10SToomas Soome int32_t comp_len;
1391*eee96f10SToomas Soome uint16_t *ptr;
1392*eee96f10SToomas Soome
1393*eee96f10SToomas Soome /* LINTED */
1394*eee96f10SToomas Soome ptr = (uint16_t *)ibuf;
1395*eee96f10SToomas Soome comp_len = ud_compressunicode(length, 8, ptr, obuf);
1396*eee96f10SToomas Soome
1397*eee96f10SToomas Soome return (comp_len);
1398*eee96f10SToomas Soome }
1399*eee96f10SToomas Soome
1400*eee96f10SToomas Soome /*
1401*eee96f10SToomas Soome * Assumption code set is zero in udfs
1402*eee96f10SToomas Soome */
1403*eee96f10SToomas Soome void
ud_convert2local(int8_t * ibuf,int8_t * obuf,int32_t length)1404*eee96f10SToomas Soome ud_convert2local(int8_t *ibuf, int8_t *obuf, int32_t length)
1405*eee96f10SToomas Soome {
1406*eee96f10SToomas Soome wchar_t buf4c[128];
1407*eee96f10SToomas Soome int32_t i, comp, index;
1408*eee96f10SToomas Soome
1409*eee96f10SToomas Soome /*
1410*eee96f10SToomas Soome * Special uncompress code
1411*eee96f10SToomas Soome * written to accomodate solaris wchar_t
1412*eee96f10SToomas Soome */
1413*eee96f10SToomas Soome comp = ibuf[0];
1414*eee96f10SToomas Soome for (i = 0, index = 1; i < length; i++) {
1415*eee96f10SToomas Soome if (comp == 16) {
1416*eee96f10SToomas Soome buf4c[i] = ibuf[index++] << 8;
1417*eee96f10SToomas Soome } else {
1418*eee96f10SToomas Soome buf4c[i] = 0;
1419*eee96f10SToomas Soome }
1420*eee96f10SToomas Soome if (index < length) {
1421*eee96f10SToomas Soome buf4c[i] |= ibuf[index++];
1422*eee96f10SToomas Soome }
1423*eee96f10SToomas Soome }
1424*eee96f10SToomas Soome (void) wcstombs((char *)obuf, buf4c, 128);
1425*eee96f10SToomas Soome }
1426*eee96f10SToomas Soome
1427*eee96f10SToomas Soome
1428*eee96f10SToomas Soome /* ------------ Routines to print basic structures Part 1 ---------------- */
1429*eee96f10SToomas Soome
1430*eee96f10SToomas Soome
1431*eee96f10SToomas Soome
1432*eee96f10SToomas Soome void
print_charspec(FILE * fout,char * name,struct charspec * cspec)1433*eee96f10SToomas Soome print_charspec(FILE *fout, char *name, struct charspec *cspec)
1434*eee96f10SToomas Soome {
1435*eee96f10SToomas Soome int i = 0;
1436*eee96f10SToomas Soome
1437*eee96f10SToomas Soome (void) fprintf(fout,
1438*eee96f10SToomas Soome "%s : %x - \"", name, cspec->cs_type);
1439*eee96f10SToomas Soome for (i = 0; i < 63; i++) {
1440*eee96f10SToomas Soome (void) fprintf(fout,
1441*eee96f10SToomas Soome "%c", cspec->cs_info[i]);
1442*eee96f10SToomas Soome }
1443*eee96f10SToomas Soome (void) fprintf(fout, "\n");
1444*eee96f10SToomas Soome }
1445*eee96f10SToomas Soome
1446*eee96f10SToomas Soome /* ARGSUSED */
1447*eee96f10SToomas Soome void
print_dstring(FILE * fout,char * name,uint16_t cset,char * bufc,uint8_t length)1448*eee96f10SToomas Soome print_dstring(FILE *fout, char *name, uint16_t cset, char *bufc, uint8_t length)
1449*eee96f10SToomas Soome {
1450*eee96f10SToomas Soome int8_t bufmb[1024];
1451*eee96f10SToomas Soome
1452*eee96f10SToomas Soome ud_convert2local(bufc, bufmb, length);
1453*eee96f10SToomas Soome
1454*eee96f10SToomas Soome (void) fprintf(fout,
1455*eee96f10SToomas Soome "%s %s\n", name, bufmb);
1456*eee96f10SToomas Soome }
1457*eee96f10SToomas Soome
1458*eee96f10SToomas Soome void
set_dstring(dstring_t * dp,char * cp,int32_t len)1459*eee96f10SToomas Soome set_dstring(dstring_t *dp, char *cp, int32_t len)
1460*eee96f10SToomas Soome {
1461*eee96f10SToomas Soome int32_t length;
1462*eee96f10SToomas Soome
1463*eee96f10SToomas Soome bzero(dp, len);
1464*eee96f10SToomas Soome length = strlen(cp);
1465*eee96f10SToomas Soome if (length > len - 1) {
1466*eee96f10SToomas Soome length = len - 1;
1467*eee96f10SToomas Soome }
1468*eee96f10SToomas Soome (void) strncpy(dp, cp, length);
1469*eee96f10SToomas Soome dp[len - 1] = length;
1470*eee96f10SToomas Soome }
1471*eee96f10SToomas Soome
1472*eee96f10SToomas Soome void
print_tstamp(FILE * fout,char * name,tstamp_t * ts)1473*eee96f10SToomas Soome print_tstamp(FILE *fout, char *name, tstamp_t *ts)
1474*eee96f10SToomas Soome {
1475*eee96f10SToomas Soome (void) fprintf(fout, "%s tz : %d yr : %d mo : %d da : %d "
1476*eee96f10SToomas Soome "Time : %d : %d : %d : %d : %d : %d\n", name,
1477*eee96f10SToomas Soome SWAP_16(ts->ts_tzone), SWAP_16(ts->ts_year), ts->ts_month,
1478*eee96f10SToomas Soome ts->ts_day, ts->ts_hour, ts->ts_min, ts->ts_sec, ts->ts_csec,
1479*eee96f10SToomas Soome ts->ts_husec, ts->ts_usec);
1480*eee96f10SToomas Soome }
1481*eee96f10SToomas Soome
1482*eee96f10SToomas Soome
1483*eee96f10SToomas Soome
1484*eee96f10SToomas Soome void
make_regid(ud_handle_t h,struct regid * reg,char * id,int32_t type)1485*eee96f10SToomas Soome make_regid(ud_handle_t h, struct regid *reg, char *id, int32_t type)
1486*eee96f10SToomas Soome {
1487*eee96f10SToomas Soome reg->reg_flags = 0;
1488*eee96f10SToomas Soome (void) strncpy(reg->reg_id, id, 23);
1489*eee96f10SToomas Soome
1490*eee96f10SToomas Soome if (type == REG_DOM_ID) {
1491*eee96f10SToomas Soome struct dom_id_suffix *dis;
1492*eee96f10SToomas Soome
1493*eee96f10SToomas Soome /* LINTED */
1494*eee96f10SToomas Soome dis = (struct dom_id_suffix *)reg->reg_ids;
1495*eee96f10SToomas Soome dis->dis_udf_revison = SWAP_16(h->udfs.ma_write);
1496*eee96f10SToomas Soome dis->dis_domain_flags = 0;
1497*eee96f10SToomas Soome
1498*eee96f10SToomas Soome } else if (type == REG_UDF_ID) {
1499*eee96f10SToomas Soome struct udf_id_suffix *uis;
1500*eee96f10SToomas Soome
1501*eee96f10SToomas Soome /* LINTED */
1502*eee96f10SToomas Soome uis = (struct udf_id_suffix *)reg->reg_ids;
1503*eee96f10SToomas Soome uis->uis_udf_revision = SWAP_16(h->udfs.ma_write);
1504*eee96f10SToomas Soome uis->uis_os_class = OS_CLASS_UNIX;
1505*eee96f10SToomas Soome uis->uis_os_identifier = OS_IDENTIFIER_SOLARIS;
1506*eee96f10SToomas Soome } else if (type == REG_UDF_II) {
1507*eee96f10SToomas Soome struct impl_id_suffix *iis;
1508*eee96f10SToomas Soome
1509*eee96f10SToomas Soome iis = (struct impl_id_suffix *)reg->reg_ids;
1510*eee96f10SToomas Soome iis->iis_os_class = OS_CLASS_UNIX;
1511*eee96f10SToomas Soome iis->iis_os_identifier = OS_IDENTIFIER_SOLARIS;
1512*eee96f10SToomas Soome }
1513*eee96f10SToomas Soome }
1514*eee96f10SToomas Soome
1515*eee96f10SToomas Soome void
print_regid(FILE * fout,char * name,struct regid * reg,int32_t type)1516*eee96f10SToomas Soome print_regid(FILE *fout, char *name, struct regid *reg, int32_t type)
1517*eee96f10SToomas Soome {
1518*eee96f10SToomas Soome (void) fprintf(fout, "%s : 0x%x : \"%s\" :",
1519*eee96f10SToomas Soome name, reg->reg_flags, reg->reg_id);
1520*eee96f10SToomas Soome
1521*eee96f10SToomas Soome if (type == REG_DOM_ID) {
1522*eee96f10SToomas Soome struct dom_id_suffix *dis;
1523*eee96f10SToomas Soome
1524*eee96f10SToomas Soome /* LINTED */
1525*eee96f10SToomas Soome dis = (struct dom_id_suffix *)reg->reg_ids;
1526*eee96f10SToomas Soome (void) fprintf(fout, " 0x%x : %s : %s\n",
1527*eee96f10SToomas Soome SWAP_16(dis->dis_udf_revison),
1528*eee96f10SToomas Soome (dis->dis_domain_flags & PROTECT_SOFT_WRITE) ?
1529*eee96f10SToomas Soome "HW Protect" : "No HW Write Protect",
1530*eee96f10SToomas Soome (dis->dis_domain_flags & PROTECT_HARD_WRITE) ?
1531*eee96f10SToomas Soome "SW Protect" : "No SW Protect");
1532*eee96f10SToomas Soome } else if (type == REG_UDF_ID) {
1533*eee96f10SToomas Soome struct udf_id_suffix *uis;
1534*eee96f10SToomas Soome
1535*eee96f10SToomas Soome /* LINTED */
1536*eee96f10SToomas Soome uis = (struct udf_id_suffix *)reg->reg_ids;
1537*eee96f10SToomas Soome (void) fprintf(fout,
1538*eee96f10SToomas Soome " 0x%x : OS Class 0x%x : OS Identifier 0x%x\n",
1539*eee96f10SToomas Soome SWAP_16(uis->uis_udf_revision),
1540*eee96f10SToomas Soome uis->uis_os_class, uis->uis_os_identifier);
1541*eee96f10SToomas Soome } else {
1542*eee96f10SToomas Soome struct impl_id_suffix *iis;
1543*eee96f10SToomas Soome
1544*eee96f10SToomas Soome iis = (struct impl_id_suffix *)reg->reg_ids;
1545*eee96f10SToomas Soome (void) fprintf(fout,
1546*eee96f10SToomas Soome " OS Class 0x%x : OS Identifier 0x%x\n",
1547*eee96f10SToomas Soome iis->iis_os_class, iis->iis_os_identifier);
1548*eee96f10SToomas Soome }
1549*eee96f10SToomas Soome }
1550*eee96f10SToomas Soome
1551*eee96f10SToomas Soome #ifdef OLD
1552*eee96f10SToomas Soome void
print_regid(FILE * fout,char * name,struct regid * reg)1553*eee96f10SToomas Soome print_regid(FILE *fout, char *name, struct regid *reg)
1554*eee96f10SToomas Soome {
1555*eee96f10SToomas Soome (void) fprintf(fout, "%s : 0x%x : \"%s\" :",
1556*eee96f10SToomas Soome name, reg->reg_flags, reg->reg_id);
1557*eee96f10SToomas Soome
1558*eee96f10SToomas Soome if (strncmp(reg->reg_id, "*OSTA UDF Compliant", 19) == 0) {
1559*eee96f10SToomas Soome (void) fprintf(fout, " 0x%x : %s : %s\n",
1560*eee96f10SToomas Soome reg->reg_ids[0] | (reg->reg_ids[1] << 8),
1561*eee96f10SToomas Soome (reg->reg_ids[2] & 1) ?
1562*eee96f10SToomas Soome "HW Protect" : "No HW Write Protect",
1563*eee96f10SToomas Soome (reg->reg_ids[2] & 2) ?
1564*eee96f10SToomas Soome "SW Protect" : "No SW Protect");
1565*eee96f10SToomas Soome } else if ((strncmp(reg->reg_id, "*UDF Virtual Partition", 22) == 0) ||
1566*eee96f10SToomas Soome (strncmp(reg->reg_id, "*UDF Sparable Partition", 23) == 0) ||
1567*eee96f10SToomas Soome (strncmp(reg->reg_id, "*UDF Virtual Alloc Tbl", 22) == 0) ||
1568*eee96f10SToomas Soome (strncmp(reg->reg_id, "*UDF Sparing Table", 18) == 0)) {
1569*eee96f10SToomas Soome (void) fprintf(fout,
1570*eee96f10SToomas Soome " 0x%x : OS Class 0x%x : OS Identifier 0x%x\n",
1571*eee96f10SToomas Soome reg->reg_ids[0] | (reg->reg_ids[1] << 8),
1572*eee96f10SToomas Soome reg->reg_ids[2], reg->reg_ids[3]);
1573*eee96f10SToomas Soome } else {
1574*eee96f10SToomas Soome (void) fprintf(fout,
1575*eee96f10SToomas Soome " OS Class 0x%x : OS Identifier 0x%x\n",
1576*eee96f10SToomas Soome reg->reg_ids[0], reg->reg_ids[1]);
1577*eee96f10SToomas Soome }
1578*eee96f10SToomas Soome }
1579*eee96f10SToomas Soome #endif
1580*eee96f10SToomas Soome
1581*eee96f10SToomas Soome
1582*eee96f10SToomas Soome /* ------------ Routines to print basic structures Part 2 ---------------- */
1583*eee96f10SToomas Soome /*
1584*eee96f10SToomas Soome * Part 2
1585*eee96f10SToomas Soome * This part is OS specific and is currently
1586*eee96f10SToomas Soome * not supported
1587*eee96f10SToomas Soome */
1588*eee96f10SToomas Soome
1589*eee96f10SToomas Soome /* ------------ Routines to print basic structures Part 3 ---------------- */
1590*eee96f10SToomas Soome
1591*eee96f10SToomas Soome void
print_ext_ad(FILE * fout,char * name,struct extent_ad * ead)1592*eee96f10SToomas Soome print_ext_ad(FILE *fout, char *name, struct extent_ad *ead)
1593*eee96f10SToomas Soome {
1594*eee96f10SToomas Soome (void) fprintf(fout,
1595*eee96f10SToomas Soome "%s EAD Len %x Loc %x\n",
1596*eee96f10SToomas Soome name, SWAP_32(ead->ext_len), SWAP_32(ead->ext_loc));
1597*eee96f10SToomas Soome }
1598*eee96f10SToomas Soome
1599*eee96f10SToomas Soome void
print_tag(FILE * fout,struct tag * tag)1600*eee96f10SToomas Soome print_tag(FILE *fout, struct tag *tag)
1601*eee96f10SToomas Soome {
1602*eee96f10SToomas Soome (void) fprintf(fout,
1603*eee96f10SToomas Soome "tag_id : %x ver : %x cksum : %x "
1604*eee96f10SToomas Soome "sno : %x crc : %x crc_len : %x loc : %x\n",
1605*eee96f10SToomas Soome SWAP_16(tag->tag_id), SWAP_16(tag->tag_desc_ver),
1606*eee96f10SToomas Soome tag->tag_cksum, SWAP_16(tag->tag_sno),
1607*eee96f10SToomas Soome SWAP_16(tag->tag_crc), SWAP_16(tag->tag_crc_len),
1608*eee96f10SToomas Soome SWAP_32(tag->tag_loc));
1609*eee96f10SToomas Soome }
1610*eee96f10SToomas Soome
1611*eee96f10SToomas Soome
1612*eee96f10SToomas Soome void
print_pvd(FILE * fout,struct pri_vol_desc * pvd)1613*eee96f10SToomas Soome print_pvd(FILE *fout, struct pri_vol_desc *pvd)
1614*eee96f10SToomas Soome {
1615*eee96f10SToomas Soome (void) fprintf(fout,
1616*eee96f10SToomas Soome "\n\t\t\tPrimary Volume Descriptor\n");
1617*eee96f10SToomas Soome print_tag(fout, &pvd->pvd_tag);
1618*eee96f10SToomas Soome (void) fprintf(fout, "vdsn : %x vdn : %x\n",
1619*eee96f10SToomas Soome SWAP_32(pvd->pvd_vdsn), SWAP_32(pvd->pvd_pvdn));
1620*eee96f10SToomas Soome print_dstring(fout, "volid : ", pvd->pvd_desc_cs.cs_type,
1621*eee96f10SToomas Soome pvd->pvd_vol_id, 32);
1622*eee96f10SToomas Soome (void) fprintf(fout,
1623*eee96f10SToomas Soome "vsn : %x mvsn : %x il : %x mil :"
1624*eee96f10SToomas Soome " %x csl : %x mcsl %x\n",
1625*eee96f10SToomas Soome SWAP_16(pvd->pvd_vsn), SWAP_16(pvd->pvd_mvsn),
1626*eee96f10SToomas Soome SWAP_16(pvd->pvd_il), SWAP_16(pvd->pvd_mil),
1627*eee96f10SToomas Soome SWAP_32(pvd->pvd_csl), SWAP_32(pvd->pvd_mcsl));
1628*eee96f10SToomas Soome print_dstring(fout, "vsid :", pvd->pvd_desc_cs.cs_type,
1629*eee96f10SToomas Soome pvd->pvd_vsi, 128);
1630*eee96f10SToomas Soome print_charspec(fout, "desc_cs", &pvd->pvd_desc_cs);
1631*eee96f10SToomas Soome print_charspec(fout, "exp_cs", &pvd->pvd_exp_cs);
1632*eee96f10SToomas Soome print_ext_ad(fout, "val ", &pvd->pvd_vol_abs);
1633*eee96f10SToomas Soome print_ext_ad(fout, "vcnl ", &pvd->pvd_vcn);
1634*eee96f10SToomas Soome print_regid(fout, "ai", &pvd->pvd_appl_id, REG_UDF_II);
1635*eee96f10SToomas Soome print_regid(fout, "ii", &pvd->pvd_ii, REG_UDF_II);
1636*eee96f10SToomas Soome (void) fprintf(fout, "pvdsl : %x flags : %x\n",
1637*eee96f10SToomas Soome SWAP_32(pvd->pvd_pvdsl),
1638*eee96f10SToomas Soome SWAP_16(pvd->pvd_flags));
1639*eee96f10SToomas Soome }
1640*eee96f10SToomas Soome
1641*eee96f10SToomas Soome void
print_avd(FILE * fout,struct anch_vol_desc_ptr * avdp)1642*eee96f10SToomas Soome print_avd(FILE *fout, struct anch_vol_desc_ptr *avdp)
1643*eee96f10SToomas Soome {
1644*eee96f10SToomas Soome (void) fprintf(fout,
1645*eee96f10SToomas Soome "\n\t\t\tAnchor Volume Descriptor\n");
1646*eee96f10SToomas Soome print_tag(fout, &avdp->avd_tag);
1647*eee96f10SToomas Soome print_ext_ad(fout, "Main Volume Descriptor Sequence : ",
1648*eee96f10SToomas Soome &avdp->avd_main_vdse);
1649*eee96f10SToomas Soome print_ext_ad(fout, "Reserve Volume Descriptor Sequence : ",
1650*eee96f10SToomas Soome &avdp->avd_res_vdse);
1651*eee96f10SToomas Soome }
1652*eee96f10SToomas Soome
1653*eee96f10SToomas Soome void
print_vdp(FILE * fout,struct vol_desc_ptr * vdp)1654*eee96f10SToomas Soome print_vdp(FILE *fout, struct vol_desc_ptr *vdp)
1655*eee96f10SToomas Soome {
1656*eee96f10SToomas Soome (void) fprintf(fout,
1657*eee96f10SToomas Soome "\n\t\t\tVolume Descriptor Pointer\n");
1658*eee96f10SToomas Soome print_tag(fout, &vdp->vdp_tag);
1659*eee96f10SToomas Soome (void) fprintf(fout, "vdsn : %x ",
1660*eee96f10SToomas Soome SWAP_32(vdp->vdp_vdsn));
1661*eee96f10SToomas Soome print_ext_ad(fout, "vdse ", &vdp->vdp_nvdse);
1662*eee96f10SToomas Soome }
1663*eee96f10SToomas Soome
1664*eee96f10SToomas Soome void
print_iuvd(FILE * fout,struct iuvd_desc * iuvd)1665*eee96f10SToomas Soome print_iuvd(FILE *fout, struct iuvd_desc *iuvd)
1666*eee96f10SToomas Soome {
1667*eee96f10SToomas Soome (void) fprintf(fout,
1668*eee96f10SToomas Soome "\n\t\t\tImplementation Use Volume Descriptor\n");
1669*eee96f10SToomas Soome print_tag(fout, &iuvd->iuvd_tag);
1670*eee96f10SToomas Soome (void) fprintf(fout,
1671*eee96f10SToomas Soome "vdsn : %x ", SWAP_32(iuvd->iuvd_vdsn));
1672*eee96f10SToomas Soome print_regid(fout, "Impl Id : ", &iuvd->iuvd_ii, REG_UDF_ID);
1673*eee96f10SToomas Soome print_charspec(fout, "cset ", &iuvd->iuvd_cset);
1674*eee96f10SToomas Soome print_dstring(fout, "lvi : ", iuvd->iuvd_cset.cs_type,
1675*eee96f10SToomas Soome iuvd->iuvd_lvi, 128);
1676*eee96f10SToomas Soome print_dstring(fout, "ifo1 : ", iuvd->iuvd_cset.cs_type,
1677*eee96f10SToomas Soome iuvd->iuvd_ifo1, 36);
1678*eee96f10SToomas Soome print_dstring(fout, "ifo2 : ", iuvd->iuvd_cset.cs_type,
1679*eee96f10SToomas Soome iuvd->iuvd_ifo2, 36);
1680*eee96f10SToomas Soome print_dstring(fout, "ifo3 : ", iuvd->iuvd_cset.cs_type,
1681*eee96f10SToomas Soome iuvd->iuvd_ifo3, 36);
1682*eee96f10SToomas Soome
1683*eee96f10SToomas Soome print_regid(fout, "iid ", &iuvd->iuvd_iid, REG_UDF_II);
1684*eee96f10SToomas Soome }
1685*eee96f10SToomas Soome
1686*eee96f10SToomas Soome void
print_part(FILE * fout,struct part_desc * pd)1687*eee96f10SToomas Soome print_part(FILE *fout, struct part_desc *pd)
1688*eee96f10SToomas Soome {
1689*eee96f10SToomas Soome (void) fprintf(fout,
1690*eee96f10SToomas Soome "\n\t\t\tPartition Descriptor\n");
1691*eee96f10SToomas Soome print_tag(fout, &pd->pd_tag);
1692*eee96f10SToomas Soome (void) fprintf(fout,
1693*eee96f10SToomas Soome "vdsn : %x flags : %x num : %x ",
1694*eee96f10SToomas Soome SWAP_32(pd->pd_vdsn),
1695*eee96f10SToomas Soome SWAP_16(pd->pd_pflags),
1696*eee96f10SToomas Soome SWAP_16(pd->pd_pnum));
1697*eee96f10SToomas Soome print_regid(fout, "contents ", &pd->pd_pcontents, REG_UDF_II);
1698*eee96f10SToomas Soome /* LINTED */
1699*eee96f10SToomas Soome print_phdr(fout, (struct phdr_desc *)(&pd->pd_pc_use));
1700*eee96f10SToomas Soome (void) fprintf(fout,
1701*eee96f10SToomas Soome "acc : %x start : %x length : %x ",
1702*eee96f10SToomas Soome SWAP_32(pd->pd_acc_type),
1703*eee96f10SToomas Soome SWAP_32(pd->pd_part_start),
1704*eee96f10SToomas Soome SWAP_32(pd->pd_part_length));
1705*eee96f10SToomas Soome print_regid(fout, "Impl Id : ", &pd->pd_ii, REG_UDF_II);
1706*eee96f10SToomas Soome }
1707*eee96f10SToomas Soome
1708*eee96f10SToomas Soome void
print_lvd(FILE * fout,struct log_vol_desc * lvd)1709*eee96f10SToomas Soome print_lvd(FILE *fout, struct log_vol_desc *lvd)
1710*eee96f10SToomas Soome {
1711*eee96f10SToomas Soome (void) fprintf(fout,
1712*eee96f10SToomas Soome "\n\t\t\tLogical Volume Descriptor\n");
1713*eee96f10SToomas Soome print_tag(fout, &lvd->lvd_tag);
1714*eee96f10SToomas Soome (void) fprintf(fout,
1715*eee96f10SToomas Soome "vdsn : %x ", SWAP_32(lvd->lvd_vdsn));
1716*eee96f10SToomas Soome print_charspec(fout, "Desc Char Set ", &lvd->lvd_desc_cs);
1717*eee96f10SToomas Soome print_dstring(fout, "lvid : ", lvd->lvd_desc_cs.cs_type,
1718*eee96f10SToomas Soome lvd->lvd_lvid, 28);
1719*eee96f10SToomas Soome (void) fprintf(fout,
1720*eee96f10SToomas Soome "lbsize : %x ",
1721*eee96f10SToomas Soome SWAP_32(lvd->lvd_log_bsize));
1722*eee96f10SToomas Soome print_regid(fout, "Dom Id", &lvd->lvd_dom_id, REG_DOM_ID);
1723*eee96f10SToomas Soome print_long_ad(fout, "lvcu", &lvd->lvd_lvcu);
1724*eee96f10SToomas Soome (void) fprintf(fout,
1725*eee96f10SToomas Soome "mtlen : %x nmaps : %x ",
1726*eee96f10SToomas Soome SWAP_32(lvd->lvd_mtbl_len),
1727*eee96f10SToomas Soome SWAP_32(lvd->lvd_num_pmaps));
1728*eee96f10SToomas Soome print_regid(fout, "Impl Id : ", &lvd->lvd_ii, REG_UDF_II);
1729*eee96f10SToomas Soome print_ext_ad(fout, "Int Seq", &lvd->lvd_int_seq_ext);
1730*eee96f10SToomas Soome print_pmaps(fout, lvd->lvd_pmaps, SWAP_32(lvd->lvd_num_pmaps));
1731*eee96f10SToomas Soome }
1732*eee96f10SToomas Soome
1733*eee96f10SToomas Soome void
print_usd(FILE * fout,struct unall_spc_desc * ua)1734*eee96f10SToomas Soome print_usd(FILE *fout, struct unall_spc_desc *ua)
1735*eee96f10SToomas Soome {
1736*eee96f10SToomas Soome int32_t i, count;
1737*eee96f10SToomas Soome
1738*eee96f10SToomas Soome (void) fprintf(fout,
1739*eee96f10SToomas Soome "\n\t\t\tUnallocated Space Descriptor\n");
1740*eee96f10SToomas Soome print_tag(fout, &ua->ua_tag);
1741*eee96f10SToomas Soome count = SWAP_32(ua->ua_nad);
1742*eee96f10SToomas Soome (void) fprintf(fout,
1743*eee96f10SToomas Soome "vdsn : %x nad : %x\n",
1744*eee96f10SToomas Soome SWAP_32(ua->ua_vdsn), count);
1745*eee96f10SToomas Soome for (i = 0; i < count; i++) {
1746*eee96f10SToomas Soome (void) fprintf(fout,
1747*eee96f10SToomas Soome "loc : %x len : %x\n",
1748*eee96f10SToomas Soome SWAP_32(ua->ua_al_dsc[i * 2]),
1749*eee96f10SToomas Soome SWAP_32(ua->ua_al_dsc[i * 2 + 1]));
1750*eee96f10SToomas Soome }
1751*eee96f10SToomas Soome }
1752*eee96f10SToomas Soome
1753*eee96f10SToomas Soome void
print_lvid(FILE * fout,struct log_vol_int_desc * lvid)1754*eee96f10SToomas Soome print_lvid(FILE *fout, struct log_vol_int_desc *lvid)
1755*eee96f10SToomas Soome {
1756*eee96f10SToomas Soome int32_t i, count;
1757*eee96f10SToomas Soome caddr_t addr;
1758*eee96f10SToomas Soome struct lvid_iu *liu;
1759*eee96f10SToomas Soome
1760*eee96f10SToomas Soome (void) fprintf(fout,
1761*eee96f10SToomas Soome "\n\t\t\tLogical Volume Integrity Descriptor\n");
1762*eee96f10SToomas Soome print_tag(fout, &lvid->lvid_tag);
1763*eee96f10SToomas Soome print_tstamp(fout, "Rec TM ", &lvid->lvid_tstamp);
1764*eee96f10SToomas Soome if (SWAP_32(lvid->lvid_int_type) == 0) {
1765*eee96f10SToomas Soome (void) fprintf(fout,
1766*eee96f10SToomas Soome "int_typ : Open\n");
1767*eee96f10SToomas Soome } else if (SWAP_32(lvid->lvid_int_type) == 1) {
1768*eee96f10SToomas Soome (void) fprintf(fout, "int_typ : Closed\n");
1769*eee96f10SToomas Soome } else {
1770*eee96f10SToomas Soome (void) fprintf(fout, "int_typ : Unknown\n");
1771*eee96f10SToomas Soome }
1772*eee96f10SToomas Soome print_ext_ad(fout, "Nie ", &lvid->lvid_nie);
1773*eee96f10SToomas Soome count = SWAP_32(lvid->lvid_npart);
1774*eee96f10SToomas Soome (void) fprintf(fout,
1775*eee96f10SToomas Soome "Uniq : %llx npart : %x liu : %x\n",
1776*eee96f10SToomas Soome SWAP_64(lvid->lvid_lvcu.lvhd_uniqid),
1777*eee96f10SToomas Soome count, SWAP_32(lvid->lvid_liu));
1778*eee96f10SToomas Soome for (i = 0; i < count; i++) {
1779*eee96f10SToomas Soome (void) fprintf(fout,
1780*eee96f10SToomas Soome "Part : %x Free : %x Size : %x\n",
1781*eee96f10SToomas Soome i, SWAP_32(lvid->lvid_fst[i]),
1782*eee96f10SToomas Soome SWAP_32(lvid->lvid_fst[count + i]));
1783*eee96f10SToomas Soome }
1784*eee96f10SToomas Soome
1785*eee96f10SToomas Soome addr = (caddr_t)lvid->lvid_fst;
1786*eee96f10SToomas Soome /* LINTED */
1787*eee96f10SToomas Soome liu = (struct lvid_iu *)(addr + 2 * count * 4);
1788*eee96f10SToomas Soome print_regid(fout, "Impl Id :", &liu->lvidiu_regid, REG_UDF_II);
1789*eee96f10SToomas Soome (void) fprintf(fout,
1790*eee96f10SToomas Soome "nfiles : %x ndirs : %x miread : %x"
1791*eee96f10SToomas Soome " miwrite : %x mawrite : %x\n",
1792*eee96f10SToomas Soome SWAP_32(liu->lvidiu_nfiles), SWAP_32(liu->lvidiu_ndirs),
1793*eee96f10SToomas Soome SWAP_16(liu->lvidiu_mread), SWAP_16(liu->lvidiu_mwrite),
1794*eee96f10SToomas Soome SWAP_16(liu->lvidiu_maxwr));
1795*eee96f10SToomas Soome }
1796*eee96f10SToomas Soome
1797*eee96f10SToomas Soome
1798*eee96f10SToomas Soome /* ------------ Routines to print basic structures Part 4 ---------------- */
1799*eee96f10SToomas Soome
1800*eee96f10SToomas Soome void
print_fsd(FILE * fout,ud_handle_t h,struct file_set_desc * fsd)1801*eee96f10SToomas Soome print_fsd(FILE *fout, ud_handle_t h, struct file_set_desc *fsd)
1802*eee96f10SToomas Soome {
1803*eee96f10SToomas Soome (void) fprintf(fout,
1804*eee96f10SToomas Soome "\n\t\t\tFile Set Descriptor\n");
1805*eee96f10SToomas Soome
1806*eee96f10SToomas Soome print_tag(fout, &fsd->fsd_tag);
1807*eee96f10SToomas Soome print_tstamp(fout, "Rec TM ", &fsd->fsd_time);
1808*eee96f10SToomas Soome (void) fprintf(fout,
1809*eee96f10SToomas Soome "ilvl : %x milvl : %x csl : %x"
1810*eee96f10SToomas Soome " mcsl : %x fsn : %x fsdn : %x\n",
1811*eee96f10SToomas Soome SWAP_16(fsd->fsd_ilevel), SWAP_16(fsd->fsd_mi_level),
1812*eee96f10SToomas Soome SWAP_32(fsd->fsd_cs_list), SWAP_32(fsd->fsd_mcs_list),
1813*eee96f10SToomas Soome SWAP_32(fsd->fsd_fs_no), SWAP_32(fsd->fsd_fsd_no));
1814*eee96f10SToomas Soome print_charspec(fout, "ID CS ", &fsd->fsd_lvidcs);
1815*eee96f10SToomas Soome print_dstring(fout, "lvi : ", fsd->fsd_lvidcs.cs_type,
1816*eee96f10SToomas Soome fsd->fsd_lvid, 128);
1817*eee96f10SToomas Soome print_charspec(fout, "ID CS ", &fsd->fsd_fscs);
1818*eee96f10SToomas Soome print_dstring(fout, "fsi : ", fsd->fsd_lvidcs.cs_type,
1819*eee96f10SToomas Soome fsd->fsd_fsi, 32);
1820*eee96f10SToomas Soome print_dstring(fout, "cfi : ", fsd->fsd_lvidcs.cs_type,
1821*eee96f10SToomas Soome fsd->fsd_cfi, 32);
1822*eee96f10SToomas Soome print_dstring(fout, "afi : ", fsd->fsd_lvidcs.cs_type,
1823*eee96f10SToomas Soome fsd->fsd_afi, 32);
1824*eee96f10SToomas Soome print_long_ad(fout, "Ricb ", &fsd->fsd_root_icb);
1825*eee96f10SToomas Soome print_regid(fout, "DI ", &fsd->fsd_did, REG_DOM_ID);
1826*eee96f10SToomas Soome print_long_ad(fout, "Next Fsd ", &fsd->fsd_next);
1827*eee96f10SToomas Soome if (h->udfs.ecma_version == UD_ECMA_VER3) {
1828*eee96f10SToomas Soome print_long_ad(fout, "System Stream Directory ICB ",
1829*eee96f10SToomas Soome &fsd->fsd_next);
1830*eee96f10SToomas Soome }
1831*eee96f10SToomas Soome }
1832*eee96f10SToomas Soome
1833*eee96f10SToomas Soome void
print_phdr(FILE * fout,struct phdr_desc * ph)1834*eee96f10SToomas Soome print_phdr(FILE *fout, struct phdr_desc *ph)
1835*eee96f10SToomas Soome {
1836*eee96f10SToomas Soome print_short_ad(fout, "ust ", &ph->phdr_ust);
1837*eee96f10SToomas Soome print_short_ad(fout, "usb ", &ph->phdr_usb);
1838*eee96f10SToomas Soome print_short_ad(fout, "int ", &ph->phdr_it);
1839*eee96f10SToomas Soome print_short_ad(fout, "fst ", &ph->phdr_fst);
1840*eee96f10SToomas Soome print_short_ad(fout, "fsh ", &ph->phdr_fsb);
1841*eee96f10SToomas Soome }
1842*eee96f10SToomas Soome
1843*eee96f10SToomas Soome void
print_fid(FILE * fout,struct file_id * fid)1844*eee96f10SToomas Soome print_fid(FILE *fout, struct file_id *fid)
1845*eee96f10SToomas Soome {
1846*eee96f10SToomas Soome int32_t i;
1847*eee96f10SToomas Soome uint8_t *addr;
1848*eee96f10SToomas Soome
1849*eee96f10SToomas Soome (void) fprintf(fout,
1850*eee96f10SToomas Soome "File Identifier Descriptor\n");
1851*eee96f10SToomas Soome print_tag(fout, &fid->fid_tag);
1852*eee96f10SToomas Soome (void) fprintf(fout, "fvn : %x fc : %x length : %x ",
1853*eee96f10SToomas Soome fid->fid_ver, fid->fid_flags, fid->fid_idlen);
1854*eee96f10SToomas Soome print_long_ad(fout, "ICB", &fid->fid_icb);
1855*eee96f10SToomas Soome addr = &fid->fid_spec[SWAP_16(fid->fid_iulen)];
1856*eee96f10SToomas Soome (void) fprintf(fout, "iulen : %x comp : %x name : ",
1857*eee96f10SToomas Soome SWAP_16(fid->fid_iulen), *addr);
1858*eee96f10SToomas Soome addr++;
1859*eee96f10SToomas Soome for (i = 0; i < fid->fid_idlen; i++) {
1860*eee96f10SToomas Soome (void) fprintf(fout, "%c", *addr++);
1861*eee96f10SToomas Soome }
1862*eee96f10SToomas Soome (void) fprintf(fout, "\n");
1863*eee96f10SToomas Soome }
1864*eee96f10SToomas Soome
1865*eee96f10SToomas Soome void
print_aed(FILE * fout,struct alloc_ext_desc * aed)1866*eee96f10SToomas Soome print_aed(FILE *fout, struct alloc_ext_desc *aed)
1867*eee96f10SToomas Soome {
1868*eee96f10SToomas Soome (void) fprintf(fout,
1869*eee96f10SToomas Soome "Allocation Extent Descriptor\n");
1870*eee96f10SToomas Soome print_tag(fout, &aed->aed_tag);
1871*eee96f10SToomas Soome (void) fprintf(fout, "prev ael loc : %x laed : %x\n",
1872*eee96f10SToomas Soome SWAP_32(aed->aed_rev_ael), SWAP_32(aed->aed_len_aed));
1873*eee96f10SToomas Soome }
1874*eee96f10SToomas Soome
1875*eee96f10SToomas Soome static char *ftype[] = {
1876*eee96f10SToomas Soome "NON", "USE", "PIE", "IE",
1877*eee96f10SToomas Soome "DIR", "REG", "BDEV", "CDEV",
1878*eee96f10SToomas Soome "EATT", "FIFO", "SOCK", "TERM",
1879*eee96f10SToomas Soome "SYML", "SDIR"
1880*eee96f10SToomas Soome };
1881*eee96f10SToomas Soome
1882*eee96f10SToomas Soome void
print_icb_tag(FILE * fout,struct icb_tag * itag)1883*eee96f10SToomas Soome print_icb_tag(FILE *fout, struct icb_tag *itag)
1884*eee96f10SToomas Soome {
1885*eee96f10SToomas Soome (void) fprintf(fout,
1886*eee96f10SToomas Soome "prnde : %x strat : %x param : %x max_ent %x\n",
1887*eee96f10SToomas Soome SWAP_32(itag->itag_prnde), SWAP_16(itag->itag_strategy),
1888*eee96f10SToomas Soome SWAP_16(itag->itag_param), SWAP_16(itag->itag_max_ent));
1889*eee96f10SToomas Soome (void) fprintf(fout,
1890*eee96f10SToomas Soome "ftype : %s prn : %x loc : %x flags : %x\n",
1891*eee96f10SToomas Soome (itag->itag_ftype >= 14) ? ftype[0] : ftype[itag->itag_ftype],
1892*eee96f10SToomas Soome SWAP_16(itag->itag_lb_prn),
1893*eee96f10SToomas Soome SWAP_32(itag->itag_lb_loc), SWAP_16(itag->itag_flags));
1894*eee96f10SToomas Soome }
1895*eee96f10SToomas Soome
1896*eee96f10SToomas Soome
1897*eee96f10SToomas Soome void
print_ie(FILE * fout,struct indirect_entry * ie)1898*eee96f10SToomas Soome print_ie(FILE *fout, struct indirect_entry *ie)
1899*eee96f10SToomas Soome {
1900*eee96f10SToomas Soome (void) fprintf(fout,
1901*eee96f10SToomas Soome "Indirect Entry\n");
1902*eee96f10SToomas Soome print_tag(fout, &ie->ie_tag);
1903*eee96f10SToomas Soome print_icb_tag(fout, &ie->ie_icb_tag);
1904*eee96f10SToomas Soome print_long_ad(fout, "ICB", &ie->ie_indirecticb);
1905*eee96f10SToomas Soome }
1906*eee96f10SToomas Soome
1907*eee96f10SToomas Soome void
print_td(FILE * fout,struct term_desc * td)1908*eee96f10SToomas Soome print_td(FILE *fout, struct term_desc *td)
1909*eee96f10SToomas Soome {
1910*eee96f10SToomas Soome (void) fprintf(fout,
1911*eee96f10SToomas Soome "Terminating Descriptor\n");
1912*eee96f10SToomas Soome print_tag(fout, &td->td_tag);
1913*eee96f10SToomas Soome }
1914*eee96f10SToomas Soome
1915*eee96f10SToomas Soome void
print_fe(FILE * fout,struct file_entry * fe)1916*eee96f10SToomas Soome print_fe(FILE *fout, struct file_entry *fe)
1917*eee96f10SToomas Soome {
1918*eee96f10SToomas Soome (void) fprintf(fout,
1919*eee96f10SToomas Soome "File Entry\n");
1920*eee96f10SToomas Soome print_tag(fout, &fe->fe_tag);
1921*eee96f10SToomas Soome print_icb_tag(fout, &fe->fe_icb_tag);
1922*eee96f10SToomas Soome (void) fprintf(fout,
1923*eee96f10SToomas Soome "uid : %x gid : %x perms : %x nlnk : %x\n",
1924*eee96f10SToomas Soome SWAP_32(fe->fe_uid), SWAP_32(fe->fe_gid),
1925*eee96f10SToomas Soome SWAP_32(fe->fe_perms), SWAP_16(fe->fe_lcount));
1926*eee96f10SToomas Soome (void) fprintf(fout,
1927*eee96f10SToomas Soome "rec_for : %x rec_dis : %x rec_len : %x "
1928*eee96f10SToomas Soome "sz : %llx blks : %llx\n",
1929*eee96f10SToomas Soome fe->fe_rec_for, fe->fe_rec_dis, SWAP_32(fe->fe_rec_len),
1930*eee96f10SToomas Soome SWAP_64(fe->fe_info_len), SWAP_64(fe->fe_lbr));
1931*eee96f10SToomas Soome print_tstamp(fout, "ctime ", &fe->fe_acc_time);
1932*eee96f10SToomas Soome print_tstamp(fout, "mtime ", &fe->fe_mod_time);
1933*eee96f10SToomas Soome print_tstamp(fout, "atime ", &fe->fe_attr_time);
1934*eee96f10SToomas Soome (void) fprintf(fout,
1935*eee96f10SToomas Soome "ckpoint : %x ", SWAP_32(fe->fe_ckpoint));
1936*eee96f10SToomas Soome print_long_ad(fout, "ICB", &fe->fe_ea_icb);
1937*eee96f10SToomas Soome print_regid(fout, "impl", &fe->fe_impl_id, REG_UDF_II);
1938*eee96f10SToomas Soome (void) fprintf(fout,
1939*eee96f10SToomas Soome "uniq_id : %llx len_ear : %x len_adesc %x\n",
1940*eee96f10SToomas Soome SWAP_64(fe->fe_uniq_id), SWAP_32(fe->fe_len_ear),
1941*eee96f10SToomas Soome SWAP_32(fe->fe_len_adesc));
1942*eee96f10SToomas Soome }
1943*eee96f10SToomas Soome
1944*eee96f10SToomas Soome void
print_pmaps(FILE * fout,uint8_t * addr,int32_t count)1945*eee96f10SToomas Soome print_pmaps(FILE *fout, uint8_t *addr, int32_t count)
1946*eee96f10SToomas Soome {
1947*eee96f10SToomas Soome struct pmap_hdr *hdr;
1948*eee96f10SToomas Soome struct pmap_typ1 *map1;
1949*eee96f10SToomas Soome struct pmap_typ2 *map2;
1950*eee96f10SToomas Soome
1951*eee96f10SToomas Soome while (count--) {
1952*eee96f10SToomas Soome hdr = (struct pmap_hdr *)addr;
1953*eee96f10SToomas Soome switch (hdr->maph_type) {
1954*eee96f10SToomas Soome case 1 :
1955*eee96f10SToomas Soome /* LINTED */
1956*eee96f10SToomas Soome map1 = (struct pmap_typ1 *)hdr;
1957*eee96f10SToomas Soome (void) fprintf(fout, "Map type 1 ");
1958*eee96f10SToomas Soome (void) fprintf(fout, "VSN %x prn %x\n",
1959*eee96f10SToomas Soome SWAP_16(map1->map1_vsn),
1960*eee96f10SToomas Soome SWAP_16(map1->map1_pn));
1961*eee96f10SToomas Soome break;
1962*eee96f10SToomas Soome case 2 :
1963*eee96f10SToomas Soome /* LINTED */
1964*eee96f10SToomas Soome map2 = (struct pmap_typ2 *)hdr;
1965*eee96f10SToomas Soome (void) fprintf(fout, "Map type 2 ");
1966*eee96f10SToomas Soome (void) fprintf(fout, "VSN %x prn %x\n",
1967*eee96f10SToomas Soome SWAP_16(map2->map2_vsn),
1968*eee96f10SToomas Soome SWAP_16(map2->map2_pn));
1969*eee96f10SToomas Soome print_regid(fout, "Partition Type Identifier",
1970*eee96f10SToomas Soome &map2->map2_pti, REG_UDF_ID);
1971*eee96f10SToomas Soome break;
1972*eee96f10SToomas Soome default :
1973*eee96f10SToomas Soome (void) fprintf(fout, "unknown map type\n");
1974*eee96f10SToomas Soome }
1975*eee96f10SToomas Soome addr += hdr->maph_length;
1976*eee96f10SToomas Soome }
1977*eee96f10SToomas Soome }
1978*eee96f10SToomas Soome
1979*eee96f10SToomas Soome
1980*eee96f10SToomas Soome
1981*eee96f10SToomas Soome void
print_short_ad(FILE * fout,char * name,struct short_ad * sad)1982*eee96f10SToomas Soome print_short_ad(FILE *fout, char *name, struct short_ad *sad)
1983*eee96f10SToomas Soome {
1984*eee96f10SToomas Soome (void) fprintf(fout,
1985*eee96f10SToomas Soome "%s loc : %x len : %x\n", name,
1986*eee96f10SToomas Soome SWAP_32(sad->sad_ext_loc), SWAP_32(sad->sad_ext_len));
1987*eee96f10SToomas Soome }
1988*eee96f10SToomas Soome
1989*eee96f10SToomas Soome void
print_long_ad(FILE * fout,char * name,struct long_ad * lad)1990*eee96f10SToomas Soome print_long_ad(FILE *fout, char *name, struct long_ad *lad)
1991*eee96f10SToomas Soome {
1992*eee96f10SToomas Soome (void) fprintf(fout,
1993*eee96f10SToomas Soome "%s prn : %x loc : %x len : %x\n", name,
1994*eee96f10SToomas Soome SWAP_16(lad->lad_ext_prn), SWAP_32(lad->lad_ext_loc),
1995*eee96f10SToomas Soome SWAP_32(lad->lad_ext_len));
1996*eee96f10SToomas Soome }
1997