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
isofncmp(fn,fnlen,isofn,isolen)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
isofntrans(infn,infnlen,outfn,outfnlen,original,assoc)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