xref: /original-bsd/sys/isofs/cd9660/cd9660_util.c (revision 27393bdf)
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  * %sccs.include.redist.c%
11  *
12  *	@(#)cd9660_util.c	8.3 (Berkeley) 12/05/94
13  */
14 
15 #include <sys/param.h>
16 #include <sys/systm.h>
17 #include <sys/namei.h>
18 #include <sys/resourcevar.h>
19 #include <sys/kernel.h>
20 #include <sys/file.h>
21 #include <sys/stat.h>
22 #include <sys/buf.h>
23 #include <sys/proc.h>
24 #include <sys/conf.h>
25 #include <sys/mount.h>
26 #include <sys/vnode.h>
27 #include <miscfs/specfs/specdev.h> /* XXX */
28 #include <miscfs/fifofs/fifo.h> /* XXX */
29 #include <sys/malloc.h>
30 #include <sys/dir.h>
31 
32 #include <isofs/cd9660/iso.h>
33 
34 /*
35  * translate and compare a filename
36  * Note: Version number plus ';' may be omitted.
37  */
38 int
39 isofncmp(fn, fnlen, isofn, isolen)
40 	u_char *fn, *isofn;
41 	int fnlen, isolen;
42 {
43 	int i, j;
44 	char c;
45 
46 	while (--fnlen >= 0) {
47 		if (--isolen < 0)
48 			return *fn;
49 		if ((c = *isofn++) == ';') {
50 			switch (*fn++) {
51 			default:
52 				return *--fn;
53 			case 0:
54 				return 0;
55 			case ';':
56 				break;
57 			}
58 			for (i = 0; --fnlen >= 0; i = i * 10 + *fn++ - '0') {
59 				if (*fn < '0' || *fn > '9') {
60 					return -1;
61 				}
62 			}
63 			for (j = 0; --isolen >= 0; j = j * 10 + *isofn++ - '0');
64 			return i - j;
65 		}
66 		if (c != *fn) {
67 			if (c >= 'A' && c <= 'Z') {
68 				if (c + ('a' - 'A') != *fn) {
69 					if (*fn >= 'a' && *fn <= 'z')
70 						return *fn - ('a' - 'A') - c;
71 					else
72 						return *fn - c;
73 				}
74 			} else
75 				return *fn - c;
76 		}
77 		fn++;
78 	}
79 	if (isolen > 0) {
80 		switch (*isofn) {
81 		default:
82 			return -1;
83 		case '.':
84 			if (isofn[1] != ';')
85 				return -1;
86 		case ';':
87 			return 0;
88 		}
89 	}
90 	return 0;
91 }
92 
93 /*
94  * translate a filename
95  */
96 void
97 isofntrans(infn, infnlen, outfn, outfnlen, original, assoc)
98 	u_char *infn, *outfn;
99 	int infnlen;
100 	u_short *outfnlen;
101 	int original;
102 	int assoc;
103 {
104 	int fnidx = 0;
105 
106 	if (assoc) {
107 		*outfn++ = ASSOCCHAR;
108 		fnidx++;
109 		infnlen++;
110 	}
111 	for (; fnidx < infnlen; fnidx++) {
112 		char c = *infn++;
113 
114 		if (!original && c >= 'A' && c <= 'Z')
115 			*outfn++ = c + ('a' - 'A');
116 		else if (!original && c == '.' && *infn == ';')
117 			break;
118 		else if (!original && c == ';')
119 			break;
120 		else
121 			*outfn++ = c;
122 	}
123 	*outfnlen = fnidx;
124 }
125