xref: /csrg-svn/sys/isofs/cd9660/cd9660_util.c (revision 65789)
1*65789Smckusick /*-
2*65789Smckusick  * Copyright (c) 1994
3*65789Smckusick  *	The Regents of the University of California.  All rights reserved.
4*65789Smckusick  *
5*65789Smckusick  * This code is derived from software contributed to Berkeley
6*65789Smckusick  * by Pace Willisson (pace@blitz.com).  The Rock Ridge Extension
7*65789Smckusick  * Support code is derived from software contributed to Berkeley
8*65789Smckusick  * by Atsushi Murai (amurai@spec.co.jp).
9*65789Smckusick  *
10*65789Smckusick  * %sccs.include.redist.c%
11*65789Smckusick  *
12*65789Smckusick  *	@(#)cd9660_util.c	8.1 (Berkeley) 01/21/94
13*65789Smckusick  */
14*65789Smckusick 
15*65789Smckusick #include <sys/param.h>
16*65789Smckusick #include <sys/systm.h>
17*65789Smckusick #include <sys/namei.h>
18*65789Smckusick #include <sys/resourcevar.h>
19*65789Smckusick #include <sys/kernel.h>
20*65789Smckusick #include <sys/file.h>
21*65789Smckusick #include <sys/stat.h>
22*65789Smckusick #include <sys/buf.h>
23*65789Smckusick #include <sys/proc.h>
24*65789Smckusick #include <sys/conf.h>
25*65789Smckusick #include <sys/mount.h>
26*65789Smckusick #include <sys/vnode.h>
27*65789Smckusick #include <miscfs/specfs/specdev.h> /* XXX */
28*65789Smckusick #include <miscfs/fifofs/fifo.h> /* XXX */
29*65789Smckusick #include <sys/malloc.h>
30*65789Smckusick #include <sys/dir.h>
31*65789Smckusick 
32*65789Smckusick #include <isofs/cd9660/iso.h>
33*65789Smckusick 
34*65789Smckusick #ifdef	__notanymore__
35*65789Smckusick int
36*65789Smckusick isonum_711 (p)
37*65789Smckusick unsigned char *p;
38*65789Smckusick {
39*65789Smckusick 	return (*p);
40*65789Smckusick }
41*65789Smckusick 
42*65789Smckusick int
43*65789Smckusick isonum_712 (p)
44*65789Smckusick signed char *p;
45*65789Smckusick {
46*65789Smckusick 	return (*p);
47*65789Smckusick }
48*65789Smckusick 
49*65789Smckusick int
50*65789Smckusick isonum_721 (p)
51*65789Smckusick unsigned char *p;
52*65789Smckusick {
53*65789Smckusick 	/* little endian short */
54*65789Smckusick #if BYTE_ORDER != LITTLE_ENDIAN
55*65789Smckusick 	printf ("isonum_721 called on non little-endian machine!\n");
56*65789Smckusick #endif
57*65789Smckusick 
58*65789Smckusick 	return *(short *)p;
59*65789Smckusick }
60*65789Smckusick 
61*65789Smckusick int
62*65789Smckusick isonum_722 (p)
63*65789Smckusick unsigned char *p;
64*65789Smckusick {
65*65789Smckusick         /* big endian short */
66*65789Smckusick #if BYTE_ORDER != BIG_ENDIAN
67*65789Smckusick         printf ("isonum_722 called on non big-endian machine!\n");
68*65789Smckusick #endif
69*65789Smckusick 
70*65789Smckusick 	return *(short *)p;
71*65789Smckusick }
72*65789Smckusick 
73*65789Smckusick int
74*65789Smckusick isonum_723 (p)
75*65789Smckusick unsigned char *p;
76*65789Smckusick {
77*65789Smckusick #if BYTE_ORDER == BIG_ENDIAN
78*65789Smckusick         return isonum_722 (p + 2);
79*65789Smckusick #elif BYTE_ORDER == LITTLE_ENDIAN
80*65789Smckusick 	return isonum_721 (p);
81*65789Smckusick #else
82*65789Smckusick 	printf ("isonum_723 unsupported byte order!\n");
83*65789Smckusick 	return 0;
84*65789Smckusick #endif
85*65789Smckusick }
86*65789Smckusick 
87*65789Smckusick int
88*65789Smckusick isonum_731 (p)
89*65789Smckusick unsigned char *p;
90*65789Smckusick {
91*65789Smckusick         /* little endian long */
92*65789Smckusick #if BYTE_ORDER != LITTLE_ENDIAN
93*65789Smckusick         printf ("isonum_731 called on non little-endian machine!\n");
94*65789Smckusick #endif
95*65789Smckusick 
96*65789Smckusick 	return *(long *)p;
97*65789Smckusick }
98*65789Smckusick 
99*65789Smckusick int
100*65789Smckusick isonum_732 (p)
101*65789Smckusick unsigned char *p;
102*65789Smckusick {
103*65789Smckusick         /* big endian long */
104*65789Smckusick #if BYTE_ORDER != BIG_ENDIAN
105*65789Smckusick         printf ("isonum_732 called on non big-endian machine!\n");
106*65789Smckusick #endif
107*65789Smckusick 
108*65789Smckusick 	return *(long *)p;
109*65789Smckusick }
110*65789Smckusick 
111*65789Smckusick int
112*65789Smckusick isonum_733 (p)
113*65789Smckusick unsigned char *p;
114*65789Smckusick {
115*65789Smckusick #if BYTE_ORDER == BIG_ENDIAN
116*65789Smckusick         return isonum_732 (p + 4);
117*65789Smckusick #elif BYTE_ORDER == LITTLE_ENDIAN
118*65789Smckusick 	return isonum_731 (p);
119*65789Smckusick #else
120*65789Smckusick 	printf ("isonum_733 unsupported byte order!\n");
121*65789Smckusick 	return 0;
122*65789Smckusick #endif
123*65789Smckusick }
124*65789Smckusick #endif	/* __notanymore__ */
125*65789Smckusick 
126*65789Smckusick /*
127*65789Smckusick  * translate and compare a filename
128*65789Smckusick  * Note: Version number plus ';' may be omitted.
129*65789Smckusick  */
130*65789Smckusick int
131*65789Smckusick isofncmp(unsigned char *fn,int fnlen,unsigned char *isofn,int isolen)
132*65789Smckusick {
133*65789Smckusick 	int i, j;
134*65789Smckusick 	char c;
135*65789Smckusick 
136*65789Smckusick 	while (--fnlen >= 0) {
137*65789Smckusick 		if (--isolen < 0)
138*65789Smckusick 			return *fn;
139*65789Smckusick 		if ((c = *isofn++) == ';') {
140*65789Smckusick 			switch (*fn++) {
141*65789Smckusick 			default:
142*65789Smckusick 				return *--fn;
143*65789Smckusick 			case 0:
144*65789Smckusick 				return 0;
145*65789Smckusick 			case ';':
146*65789Smckusick 				break;
147*65789Smckusick 			}
148*65789Smckusick 			for (i = 0; --fnlen >= 0; i = i * 10 + *fn++ - '0') {
149*65789Smckusick 				if (*fn < '0' || *fn > '9') {
150*65789Smckusick 					return -1;
151*65789Smckusick 				}
152*65789Smckusick 			}
153*65789Smckusick 			for (j = 0; --isolen >= 0; j = j * 10 + *isofn++ - '0');
154*65789Smckusick 			return i - j;
155*65789Smckusick 		}
156*65789Smckusick 		if (c != *fn) {
157*65789Smckusick 			if (c >= 'A' && c <= 'Z') {
158*65789Smckusick 				if (c + ('a' - 'A') != *fn) {
159*65789Smckusick 					if (*fn >= 'a' && *fn <= 'z')
160*65789Smckusick 						return *fn - ('a' - 'A') - c;
161*65789Smckusick 					else
162*65789Smckusick 						return *fn - c;
163*65789Smckusick 				}
164*65789Smckusick 			} else
165*65789Smckusick 				return *fn - c;
166*65789Smckusick 		}
167*65789Smckusick 		fn++;
168*65789Smckusick 	}
169*65789Smckusick 	if (isolen > 0) {
170*65789Smckusick 		switch (*isofn) {
171*65789Smckusick 		default:
172*65789Smckusick 			return -1;
173*65789Smckusick 		case '.':
174*65789Smckusick 			if (isofn[1] != ';')
175*65789Smckusick 				return -1;
176*65789Smckusick 		case ';':
177*65789Smckusick 			return 0;
178*65789Smckusick 		}
179*65789Smckusick 	}
180*65789Smckusick 	return 0;
181*65789Smckusick }
182*65789Smckusick 
183*65789Smckusick /*
184*65789Smckusick  * translate a filename
185*65789Smckusick  */
186*65789Smckusick void
187*65789Smckusick isofntrans(unsigned char *infn,int infnlen,
188*65789Smckusick 	   unsigned char *outfn,unsigned short *outfnlen,
189*65789Smckusick 	   int original,int assoc)
190*65789Smckusick {
191*65789Smckusick 	int fnidx = 0;
192*65789Smckusick 
193*65789Smckusick 	if (assoc) {
194*65789Smckusick 		*outfn++ = ASSOCCHAR;
195*65789Smckusick 		fnidx++;
196*65789Smckusick 	}
197*65789Smckusick 	for (; fnidx < infnlen; fnidx++) {
198*65789Smckusick 		char c = *infn++;
199*65789Smckusick 
200*65789Smckusick 		if (!original && c >= 'A' && c <= 'Z')
201*65789Smckusick 			*outfn++ = c + ('a' - 'A');
202*65789Smckusick 		else if (!original && c == '.' && *infn == ';')
203*65789Smckusick 			break;
204*65789Smckusick 		else if (!original && c == ';')
205*65789Smckusick 			break;
206*65789Smckusick 		else
207*65789Smckusick 			*outfn++ = c;
208*65789Smckusick 	}
209*65789Smckusick 	*outfnlen = fnidx;
210*65789Smckusick }
211