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