cd9660_util.c revision 1541
1/*-
2 * Copyright (c) 1994
3 *	The Regents of the University of California.  All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley
6 * by Pace Willisson (pace@blitz.com).  The Rock Ridge Extension
7 * Support code is derived from software contributed to Berkeley
8 * by Atsushi Murai (amurai@spec.co.jp).
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 *    must display the following acknowledgement:
20 *	This product includes software developed by the University of
21 *	California, Berkeley and its contributors.
22 * 4. Neither the name of the University nor the names of its contributors
23 *    may be used to endorse or promote products derived from this software
24 *    without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
37 *
38 *	@(#)cd9660_util.c	8.1 (Berkeley) 1/21/94
39 */
40
41#include <sys/param.h>
42#include <sys/systm.h>
43#include <sys/namei.h>
44#include <sys/resourcevar.h>
45#include <sys/kernel.h>
46#include <sys/file.h>
47#include <sys/stat.h>
48#include <sys/buf.h>
49#include <sys/proc.h>
50#include <sys/conf.h>
51#include <sys/mount.h>
52#include <sys/vnode.h>
53#include <miscfs/specfs/specdev.h> /* XXX */
54#include <miscfs/fifofs/fifo.h> /* XXX */
55#include <sys/malloc.h>
56#include <sys/dir.h>
57
58#include <isofs/cd9660/iso.h>
59
60#ifdef	__notanymore__
61int
62isonum_711 (p)
63unsigned char *p;
64{
65	return (*p);
66}
67
68int
69isonum_712 (p)
70signed char *p;
71{
72	return (*p);
73}
74
75int
76isonum_721 (p)
77unsigned char *p;
78{
79	/* little endian short */
80#if BYTE_ORDER != LITTLE_ENDIAN
81	printf ("isonum_721 called on non little-endian machine!\n");
82#endif
83
84	return *(short *)p;
85}
86
87int
88isonum_722 (p)
89unsigned char *p;
90{
91        /* big endian short */
92#if BYTE_ORDER != BIG_ENDIAN
93        printf ("isonum_722 called on non big-endian machine!\n");
94#endif
95
96	return *(short *)p;
97}
98
99int
100isonum_723 (p)
101unsigned char *p;
102{
103#if BYTE_ORDER == BIG_ENDIAN
104        return isonum_722 (p + 2);
105#elif BYTE_ORDER == LITTLE_ENDIAN
106	return isonum_721 (p);
107#else
108	printf ("isonum_723 unsupported byte order!\n");
109	return 0;
110#endif
111}
112
113int
114isonum_731 (p)
115unsigned char *p;
116{
117        /* little endian long */
118#if BYTE_ORDER != LITTLE_ENDIAN
119        printf ("isonum_731 called on non little-endian machine!\n");
120#endif
121
122	return *(long *)p;
123}
124
125int
126isonum_732 (p)
127unsigned char *p;
128{
129        /* big endian long */
130#if BYTE_ORDER != BIG_ENDIAN
131        printf ("isonum_732 called on non big-endian machine!\n");
132#endif
133
134	return *(long *)p;
135}
136
137int
138isonum_733 (p)
139unsigned char *p;
140{
141#if BYTE_ORDER == BIG_ENDIAN
142        return isonum_732 (p + 4);
143#elif BYTE_ORDER == LITTLE_ENDIAN
144	return isonum_731 (p);
145#else
146	printf ("isonum_733 unsupported byte order!\n");
147	return 0;
148#endif
149}
150#endif	/* __notanymore__ */
151
152/*
153 * translate and compare a filename
154 * Note: Version number plus ';' may be omitted.
155 */
156int
157isofncmp(unsigned char *fn,int fnlen,unsigned char *isofn,int isolen)
158{
159	int i, j;
160	char c;
161
162	while (--fnlen >= 0) {
163		if (--isolen < 0)
164			return *fn;
165		if ((c = *isofn++) == ';') {
166			switch (*fn++) {
167			default:
168				return *--fn;
169			case 0:
170				return 0;
171			case ';':
172				break;
173			}
174			for (i = 0; --fnlen >= 0; i = i * 10 + *fn++ - '0') {
175				if (*fn < '0' || *fn > '9') {
176					return -1;
177				}
178			}
179			for (j = 0; --isolen >= 0; j = j * 10 + *isofn++ - '0');
180			return i - j;
181		}
182		if (c != *fn) {
183			if (c >= 'A' && c <= 'Z') {
184				if (c + ('a' - 'A') != *fn) {
185					if (*fn >= 'a' && *fn <= 'z')
186						return *fn - ('a' - 'A') - c;
187					else
188						return *fn - c;
189				}
190			} else
191				return *fn - c;
192		}
193		fn++;
194	}
195	if (isolen > 0) {
196		switch (*isofn) {
197		default:
198			return -1;
199		case '.':
200			if (isofn[1] != ';')
201				return -1;
202		case ';':
203			return 0;
204		}
205	}
206	return 0;
207}
208
209/*
210 * translate a filename
211 */
212void
213isofntrans(unsigned char *infn,int infnlen,
214	   unsigned char *outfn,unsigned short *outfnlen,
215	   int original,int assoc)
216{
217	int fnidx = 0;
218
219	if (assoc) {
220		*outfn++ = ASSOCCHAR;
221		fnidx++;
222	}
223	for (; fnidx < infnlen; fnidx++) {
224		char c = *infn++;
225
226		if (!original && c >= 'A' && c <= 'Z')
227			*outfn++ = c + ('a' - 'A');
228		else if (!original && c == '.' && *infn == ';')
229			break;
230		else if (!original && c == ';')
231			break;
232		else
233			*outfn++ = c;
234	}
235	*outfnlen = fnidx;
236}
237