xref: /csrg-svn/sys/isofs/cd9660/cd9660_util.c (revision 67718)
165789Smckusick /*-
265789Smckusick  * Copyright (c) 1994
365789Smckusick  *	The Regents of the University of California.  All rights reserved.
465789Smckusick  *
565789Smckusick  * This code is derived from software contributed to Berkeley
665789Smckusick  * by Pace Willisson (pace@blitz.com).  The Rock Ridge Extension
765789Smckusick  * Support code is derived from software contributed to Berkeley
865789Smckusick  * by Atsushi Murai (amurai@spec.co.jp).
965789Smckusick  *
1065789Smckusick  * %sccs.include.redist.c%
1165789Smckusick  *
12*67718Smckusick  *	@(#)cd9660_util.c	8.2 (Berkeley) 08/20/94
1365789Smckusick  */
1465789Smckusick 
1565789Smckusick #include <sys/param.h>
1665789Smckusick #include <sys/systm.h>
1765789Smckusick #include <sys/namei.h>
1865789Smckusick #include <sys/resourcevar.h>
1965789Smckusick #include <sys/kernel.h>
2065789Smckusick #include <sys/file.h>
2165789Smckusick #include <sys/stat.h>
2265789Smckusick #include <sys/buf.h>
2365789Smckusick #include <sys/proc.h>
2465789Smckusick #include <sys/conf.h>
2565789Smckusick #include <sys/mount.h>
2665789Smckusick #include <sys/vnode.h>
2765789Smckusick #include <miscfs/specfs/specdev.h> /* XXX */
2865789Smckusick #include <miscfs/fifofs/fifo.h> /* XXX */
2965789Smckusick #include <sys/malloc.h>
3065789Smckusick #include <sys/dir.h>
3165789Smckusick 
3265789Smckusick #include <isofs/cd9660/iso.h>
3365789Smckusick 
3465789Smckusick #ifdef	__notanymore__
3565789Smckusick int
3665789Smckusick isonum_711 (p)
3765789Smckusick unsigned char *p;
3865789Smckusick {
3965789Smckusick 	return (*p);
4065789Smckusick }
4165789Smckusick 
4265789Smckusick int
4365789Smckusick isonum_712 (p)
4465789Smckusick signed char *p;
4565789Smckusick {
4665789Smckusick 	return (*p);
4765789Smckusick }
4865789Smckusick 
4965789Smckusick int
5065789Smckusick isonum_721 (p)
5165789Smckusick unsigned char *p;
5265789Smckusick {
5365789Smckusick 	/* little endian short */
5465789Smckusick #if BYTE_ORDER != LITTLE_ENDIAN
5565789Smckusick 	printf ("isonum_721 called on non little-endian machine!\n");
5665789Smckusick #endif
5765789Smckusick 
5865789Smckusick 	return *(short *)p;
5965789Smckusick }
6065789Smckusick 
6165789Smckusick int
6265789Smckusick isonum_722 (p)
6365789Smckusick unsigned char *p;
6465789Smckusick {
6565789Smckusick         /* big endian short */
6665789Smckusick #if BYTE_ORDER != BIG_ENDIAN
6765789Smckusick         printf ("isonum_722 called on non big-endian machine!\n");
6865789Smckusick #endif
6965789Smckusick 
7065789Smckusick 	return *(short *)p;
7165789Smckusick }
7265789Smckusick 
7365789Smckusick int
7465789Smckusick isonum_723 (p)
7565789Smckusick unsigned char *p;
7665789Smckusick {
7765789Smckusick #if BYTE_ORDER == BIG_ENDIAN
7865789Smckusick         return isonum_722 (p + 2);
7965789Smckusick #elif BYTE_ORDER == LITTLE_ENDIAN
8065789Smckusick 	return isonum_721 (p);
8165789Smckusick #else
8265789Smckusick 	printf ("isonum_723 unsupported byte order!\n");
8365789Smckusick 	return 0;
8465789Smckusick #endif
8565789Smckusick }
8665789Smckusick 
8765789Smckusick int
8865789Smckusick isonum_731 (p)
8965789Smckusick unsigned char *p;
9065789Smckusick {
9165789Smckusick         /* little endian long */
9265789Smckusick #if BYTE_ORDER != LITTLE_ENDIAN
9365789Smckusick         printf ("isonum_731 called on non little-endian machine!\n");
9465789Smckusick #endif
9565789Smckusick 
9665789Smckusick 	return *(long *)p;
9765789Smckusick }
9865789Smckusick 
9965789Smckusick int
10065789Smckusick isonum_732 (p)
10165789Smckusick unsigned char *p;
10265789Smckusick {
10365789Smckusick         /* big endian long */
10465789Smckusick #if BYTE_ORDER != BIG_ENDIAN
10565789Smckusick         printf ("isonum_732 called on non big-endian machine!\n");
10665789Smckusick #endif
10765789Smckusick 
10865789Smckusick 	return *(long *)p;
10965789Smckusick }
11065789Smckusick 
11165789Smckusick int
11265789Smckusick isonum_733 (p)
11365789Smckusick unsigned char *p;
11465789Smckusick {
11565789Smckusick #if BYTE_ORDER == BIG_ENDIAN
11665789Smckusick         return isonum_732 (p + 4);
11765789Smckusick #elif BYTE_ORDER == LITTLE_ENDIAN
11865789Smckusick 	return isonum_731 (p);
11965789Smckusick #else
12065789Smckusick 	printf ("isonum_733 unsupported byte order!\n");
12165789Smckusick 	return 0;
12265789Smckusick #endif
12365789Smckusick }
12465789Smckusick #endif	/* __notanymore__ */
12565789Smckusick 
12665789Smckusick /*
12765789Smckusick  * translate and compare a filename
12865789Smckusick  * Note: Version number plus ';' may be omitted.
12965789Smckusick  */
13065789Smckusick int
13165789Smckusick isofncmp(unsigned char *fn,int fnlen,unsigned char *isofn,int isolen)
13265789Smckusick {
13365789Smckusick 	int i, j;
13465789Smckusick 	char c;
13565789Smckusick 
13665789Smckusick 	while (--fnlen >= 0) {
13765789Smckusick 		if (--isolen < 0)
13865789Smckusick 			return *fn;
13965789Smckusick 		if ((c = *isofn++) == ';') {
14065789Smckusick 			switch (*fn++) {
14165789Smckusick 			default:
14265789Smckusick 				return *--fn;
14365789Smckusick 			case 0:
14465789Smckusick 				return 0;
14565789Smckusick 			case ';':
14665789Smckusick 				break;
14765789Smckusick 			}
14865789Smckusick 			for (i = 0; --fnlen >= 0; i = i * 10 + *fn++ - '0') {
14965789Smckusick 				if (*fn < '0' || *fn > '9') {
15065789Smckusick 					return -1;
15165789Smckusick 				}
15265789Smckusick 			}
15365789Smckusick 			for (j = 0; --isolen >= 0; j = j * 10 + *isofn++ - '0');
15465789Smckusick 			return i - j;
15565789Smckusick 		}
15665789Smckusick 		if (c != *fn) {
15765789Smckusick 			if (c >= 'A' && c <= 'Z') {
15865789Smckusick 				if (c + ('a' - 'A') != *fn) {
15965789Smckusick 					if (*fn >= 'a' && *fn <= 'z')
16065789Smckusick 						return *fn - ('a' - 'A') - c;
16165789Smckusick 					else
16265789Smckusick 						return *fn - c;
16365789Smckusick 				}
16465789Smckusick 			} else
16565789Smckusick 				return *fn - c;
16665789Smckusick 		}
16765789Smckusick 		fn++;
16865789Smckusick 	}
16965789Smckusick 	if (isolen > 0) {
17065789Smckusick 		switch (*isofn) {
17165789Smckusick 		default:
17265789Smckusick 			return -1;
17365789Smckusick 		case '.':
17465789Smckusick 			if (isofn[1] != ';')
17565789Smckusick 				return -1;
17665789Smckusick 		case ';':
17765789Smckusick 			return 0;
17865789Smckusick 		}
17965789Smckusick 	}
18065789Smckusick 	return 0;
18165789Smckusick }
18265789Smckusick 
18365789Smckusick /*
18465789Smckusick  * translate a filename
18565789Smckusick  */
18665789Smckusick void
18765789Smckusick isofntrans(unsigned char *infn,int infnlen,
18865789Smckusick 	   unsigned char *outfn,unsigned short *outfnlen,
18965789Smckusick 	   int original,int assoc)
19065789Smckusick {
19165789Smckusick 	int fnidx = 0;
19265789Smckusick 
19365789Smckusick 	if (assoc) {
19465789Smckusick 		*outfn++ = ASSOCCHAR;
19565789Smckusick 		fnidx++;
196*67718Smckusick 		infnlen++;
19765789Smckusick 	}
19865789Smckusick 	for (; fnidx < infnlen; fnidx++) {
19965789Smckusick 		char c = *infn++;
20065789Smckusick 
20165789Smckusick 		if (!original && c >= 'A' && c <= 'Z')
20265789Smckusick 			*outfn++ = c + ('a' - 'A');
20365789Smckusick 		else if (!original && c == '.' && *infn == ';')
20465789Smckusick 			break;
20565789Smckusick 		else if (!original && c == ';')
20665789Smckusick 			break;
20765789Smckusick 		else
20865789Smckusick 			*outfn++ = c;
20965789Smckusick 	}
21065789Smckusick 	*outfnlen = fnidx;
21165789Smckusick }
212