xref: /csrg-svn/sys/isofs/cd9660/cd9660_util.c (revision 68050)
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*68050Smckusick  *	@(#)cd9660_util.c	8.3 (Berkeley) 12/05/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 /*
3565789Smckusick  * translate and compare a filename
3665789Smckusick  * Note: Version number plus ';' may be omitted.
3765789Smckusick  */
3865789Smckusick int
isofncmp(fn,fnlen,isofn,isolen)39*68050Smckusick isofncmp(fn, fnlen, isofn, isolen)
40*68050Smckusick 	u_char *fn, *isofn;
41*68050Smckusick 	int fnlen, isolen;
4265789Smckusick {
4365789Smckusick 	int i, j;
4465789Smckusick 	char c;
4565789Smckusick 
4665789Smckusick 	while (--fnlen >= 0) {
4765789Smckusick 		if (--isolen < 0)
4865789Smckusick 			return *fn;
4965789Smckusick 		if ((c = *isofn++) == ';') {
5065789Smckusick 			switch (*fn++) {
5165789Smckusick 			default:
5265789Smckusick 				return *--fn;
5365789Smckusick 			case 0:
5465789Smckusick 				return 0;
5565789Smckusick 			case ';':
5665789Smckusick 				break;
5765789Smckusick 			}
5865789Smckusick 			for (i = 0; --fnlen >= 0; i = i * 10 + *fn++ - '0') {
5965789Smckusick 				if (*fn < '0' || *fn > '9') {
6065789Smckusick 					return -1;
6165789Smckusick 				}
6265789Smckusick 			}
6365789Smckusick 			for (j = 0; --isolen >= 0; j = j * 10 + *isofn++ - '0');
6465789Smckusick 			return i - j;
6565789Smckusick 		}
6665789Smckusick 		if (c != *fn) {
6765789Smckusick 			if (c >= 'A' && c <= 'Z') {
6865789Smckusick 				if (c + ('a' - 'A') != *fn) {
6965789Smckusick 					if (*fn >= 'a' && *fn <= 'z')
7065789Smckusick 						return *fn - ('a' - 'A') - c;
7165789Smckusick 					else
7265789Smckusick 						return *fn - c;
7365789Smckusick 				}
7465789Smckusick 			} else
7565789Smckusick 				return *fn - c;
7665789Smckusick 		}
7765789Smckusick 		fn++;
7865789Smckusick 	}
7965789Smckusick 	if (isolen > 0) {
8065789Smckusick 		switch (*isofn) {
8165789Smckusick 		default:
8265789Smckusick 			return -1;
8365789Smckusick 		case '.':
8465789Smckusick 			if (isofn[1] != ';')
8565789Smckusick 				return -1;
8665789Smckusick 		case ';':
8765789Smckusick 			return 0;
8865789Smckusick 		}
8965789Smckusick 	}
9065789Smckusick 	return 0;
9165789Smckusick }
9265789Smckusick 
9365789Smckusick /*
9465789Smckusick  * translate a filename
9565789Smckusick  */
9665789Smckusick void
isofntrans(infn,infnlen,outfn,outfnlen,original,assoc)97*68050Smckusick isofntrans(infn, infnlen, outfn, outfnlen, original, assoc)
98*68050Smckusick 	u_char *infn, *outfn;
99*68050Smckusick 	int infnlen;
100*68050Smckusick 	u_short *outfnlen;
101*68050Smckusick 	int original;
102*68050Smckusick 	int assoc;
10365789Smckusick {
10465789Smckusick 	int fnidx = 0;
10565789Smckusick 
10665789Smckusick 	if (assoc) {
10765789Smckusick 		*outfn++ = ASSOCCHAR;
10865789Smckusick 		fnidx++;
10967718Smckusick 		infnlen++;
11065789Smckusick 	}
11165789Smckusick 	for (; fnidx < infnlen; fnidx++) {
11265789Smckusick 		char c = *infn++;
11365789Smckusick 
11465789Smckusick 		if (!original && c >= 'A' && c <= 'Z')
11565789Smckusick 			*outfn++ = c + ('a' - 'A');
11665789Smckusick 		else if (!original && c == '.' && *infn == ';')
11765789Smckusick 			break;
11865789Smckusick 		else if (!original && c == ';')
11965789Smckusick 			break;
12065789Smckusick 		else
12165789Smckusick 			*outfn++ = c;
12265789Smckusick 	}
12365789Smckusick 	*outfnlen = fnidx;
12465789Smckusick }
125