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