1*65789Smckusick /*- 2*65789Smckusick * Copyright (c) 1994 3*65789Smckusick * The Regents of the University of California. All rights reserved. 4*65789Smckusick * 5*65789Smckusick * This code is derived from software contributed to Berkeley 6*65789Smckusick * by Pace Willisson (pace@blitz.com). The Rock Ridge Extension 7*65789Smckusick * Support code is derived from software contributed to Berkeley 8*65789Smckusick * by Atsushi Murai (amurai@spec.co.jp). 9*65789Smckusick * 10*65789Smckusick * %sccs.include.redist.c% 11*65789Smckusick * 12*65789Smckusick * @(#)cd9660_util.c 8.1 (Berkeley) 01/21/94 13*65789Smckusick */ 14*65789Smckusick 15*65789Smckusick #include <sys/param.h> 16*65789Smckusick #include <sys/systm.h> 17*65789Smckusick #include <sys/namei.h> 18*65789Smckusick #include <sys/resourcevar.h> 19*65789Smckusick #include <sys/kernel.h> 20*65789Smckusick #include <sys/file.h> 21*65789Smckusick #include <sys/stat.h> 22*65789Smckusick #include <sys/buf.h> 23*65789Smckusick #include <sys/proc.h> 24*65789Smckusick #include <sys/conf.h> 25*65789Smckusick #include <sys/mount.h> 26*65789Smckusick #include <sys/vnode.h> 27*65789Smckusick #include <miscfs/specfs/specdev.h> /* XXX */ 28*65789Smckusick #include <miscfs/fifofs/fifo.h> /* XXX */ 29*65789Smckusick #include <sys/malloc.h> 30*65789Smckusick #include <sys/dir.h> 31*65789Smckusick 32*65789Smckusick #include <isofs/cd9660/iso.h> 33*65789Smckusick 34*65789Smckusick #ifdef __notanymore__ 35*65789Smckusick int 36*65789Smckusick isonum_711 (p) 37*65789Smckusick unsigned char *p; 38*65789Smckusick { 39*65789Smckusick return (*p); 40*65789Smckusick } 41*65789Smckusick 42*65789Smckusick int 43*65789Smckusick isonum_712 (p) 44*65789Smckusick signed char *p; 45*65789Smckusick { 46*65789Smckusick return (*p); 47*65789Smckusick } 48*65789Smckusick 49*65789Smckusick int 50*65789Smckusick isonum_721 (p) 51*65789Smckusick unsigned char *p; 52*65789Smckusick { 53*65789Smckusick /* little endian short */ 54*65789Smckusick #if BYTE_ORDER != LITTLE_ENDIAN 55*65789Smckusick printf ("isonum_721 called on non little-endian machine!\n"); 56*65789Smckusick #endif 57*65789Smckusick 58*65789Smckusick return *(short *)p; 59*65789Smckusick } 60*65789Smckusick 61*65789Smckusick int 62*65789Smckusick isonum_722 (p) 63*65789Smckusick unsigned char *p; 64*65789Smckusick { 65*65789Smckusick /* big endian short */ 66*65789Smckusick #if BYTE_ORDER != BIG_ENDIAN 67*65789Smckusick printf ("isonum_722 called on non big-endian machine!\n"); 68*65789Smckusick #endif 69*65789Smckusick 70*65789Smckusick return *(short *)p; 71*65789Smckusick } 72*65789Smckusick 73*65789Smckusick int 74*65789Smckusick isonum_723 (p) 75*65789Smckusick unsigned char *p; 76*65789Smckusick { 77*65789Smckusick #if BYTE_ORDER == BIG_ENDIAN 78*65789Smckusick return isonum_722 (p + 2); 79*65789Smckusick #elif BYTE_ORDER == LITTLE_ENDIAN 80*65789Smckusick return isonum_721 (p); 81*65789Smckusick #else 82*65789Smckusick printf ("isonum_723 unsupported byte order!\n"); 83*65789Smckusick return 0; 84*65789Smckusick #endif 85*65789Smckusick } 86*65789Smckusick 87*65789Smckusick int 88*65789Smckusick isonum_731 (p) 89*65789Smckusick unsigned char *p; 90*65789Smckusick { 91*65789Smckusick /* little endian long */ 92*65789Smckusick #if BYTE_ORDER != LITTLE_ENDIAN 93*65789Smckusick printf ("isonum_731 called on non little-endian machine!\n"); 94*65789Smckusick #endif 95*65789Smckusick 96*65789Smckusick return *(long *)p; 97*65789Smckusick } 98*65789Smckusick 99*65789Smckusick int 100*65789Smckusick isonum_732 (p) 101*65789Smckusick unsigned char *p; 102*65789Smckusick { 103*65789Smckusick /* big endian long */ 104*65789Smckusick #if BYTE_ORDER != BIG_ENDIAN 105*65789Smckusick printf ("isonum_732 called on non big-endian machine!\n"); 106*65789Smckusick #endif 107*65789Smckusick 108*65789Smckusick return *(long *)p; 109*65789Smckusick } 110*65789Smckusick 111*65789Smckusick int 112*65789Smckusick isonum_733 (p) 113*65789Smckusick unsigned char *p; 114*65789Smckusick { 115*65789Smckusick #if BYTE_ORDER == BIG_ENDIAN 116*65789Smckusick return isonum_732 (p + 4); 117*65789Smckusick #elif BYTE_ORDER == LITTLE_ENDIAN 118*65789Smckusick return isonum_731 (p); 119*65789Smckusick #else 120*65789Smckusick printf ("isonum_733 unsupported byte order!\n"); 121*65789Smckusick return 0; 122*65789Smckusick #endif 123*65789Smckusick } 124*65789Smckusick #endif /* __notanymore__ */ 125*65789Smckusick 126*65789Smckusick /* 127*65789Smckusick * translate and compare a filename 128*65789Smckusick * Note: Version number plus ';' may be omitted. 129*65789Smckusick */ 130*65789Smckusick int 131*65789Smckusick isofncmp(unsigned char *fn,int fnlen,unsigned char *isofn,int isolen) 132*65789Smckusick { 133*65789Smckusick int i, j; 134*65789Smckusick char c; 135*65789Smckusick 136*65789Smckusick while (--fnlen >= 0) { 137*65789Smckusick if (--isolen < 0) 138*65789Smckusick return *fn; 139*65789Smckusick if ((c = *isofn++) == ';') { 140*65789Smckusick switch (*fn++) { 141*65789Smckusick default: 142*65789Smckusick return *--fn; 143*65789Smckusick case 0: 144*65789Smckusick return 0; 145*65789Smckusick case ';': 146*65789Smckusick break; 147*65789Smckusick } 148*65789Smckusick for (i = 0; --fnlen >= 0; i = i * 10 + *fn++ - '0') { 149*65789Smckusick if (*fn < '0' || *fn > '9') { 150*65789Smckusick return -1; 151*65789Smckusick } 152*65789Smckusick } 153*65789Smckusick for (j = 0; --isolen >= 0; j = j * 10 + *isofn++ - '0'); 154*65789Smckusick return i - j; 155*65789Smckusick } 156*65789Smckusick if (c != *fn) { 157*65789Smckusick if (c >= 'A' && c <= 'Z') { 158*65789Smckusick if (c + ('a' - 'A') != *fn) { 159*65789Smckusick if (*fn >= 'a' && *fn <= 'z') 160*65789Smckusick return *fn - ('a' - 'A') - c; 161*65789Smckusick else 162*65789Smckusick return *fn - c; 163*65789Smckusick } 164*65789Smckusick } else 165*65789Smckusick return *fn - c; 166*65789Smckusick } 167*65789Smckusick fn++; 168*65789Smckusick } 169*65789Smckusick if (isolen > 0) { 170*65789Smckusick switch (*isofn) { 171*65789Smckusick default: 172*65789Smckusick return -1; 173*65789Smckusick case '.': 174*65789Smckusick if (isofn[1] != ';') 175*65789Smckusick return -1; 176*65789Smckusick case ';': 177*65789Smckusick return 0; 178*65789Smckusick } 179*65789Smckusick } 180*65789Smckusick return 0; 181*65789Smckusick } 182*65789Smckusick 183*65789Smckusick /* 184*65789Smckusick * translate a filename 185*65789Smckusick */ 186*65789Smckusick void 187*65789Smckusick isofntrans(unsigned char *infn,int infnlen, 188*65789Smckusick unsigned char *outfn,unsigned short *outfnlen, 189*65789Smckusick int original,int assoc) 190*65789Smckusick { 191*65789Smckusick int fnidx = 0; 192*65789Smckusick 193*65789Smckusick if (assoc) { 194*65789Smckusick *outfn++ = ASSOCCHAR; 195*65789Smckusick fnidx++; 196*65789Smckusick } 197*65789Smckusick for (; fnidx < infnlen; fnidx++) { 198*65789Smckusick char c = *infn++; 199*65789Smckusick 200*65789Smckusick if (!original && c >= 'A' && c <= 'Z') 201*65789Smckusick *outfn++ = c + ('a' - 'A'); 202*65789Smckusick else if (!original && c == '.' && *infn == ';') 203*65789Smckusick break; 204*65789Smckusick else if (!original && c == ';') 205*65789Smckusick break; 206*65789Smckusick else 207*65789Smckusick *outfn++ = c; 208*65789Smckusick } 209*65789Smckusick *outfnlen = fnidx; 210*65789Smckusick } 211