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*67718Smckusick * @(#)cd9660_util.c 8.2 (Berkeley) 08/20/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 #ifdef __notanymore__ 3565789Smckusick int 3665789Smckusick isonum_711 (p) 3765789Smckusick unsigned char *p; 3865789Smckusick { 3965789Smckusick return (*p); 4065789Smckusick } 4165789Smckusick 4265789Smckusick int 4365789Smckusick isonum_712 (p) 4465789Smckusick signed char *p; 4565789Smckusick { 4665789Smckusick return (*p); 4765789Smckusick } 4865789Smckusick 4965789Smckusick int 5065789Smckusick isonum_721 (p) 5165789Smckusick unsigned char *p; 5265789Smckusick { 5365789Smckusick /* little endian short */ 5465789Smckusick #if BYTE_ORDER != LITTLE_ENDIAN 5565789Smckusick printf ("isonum_721 called on non little-endian machine!\n"); 5665789Smckusick #endif 5765789Smckusick 5865789Smckusick return *(short *)p; 5965789Smckusick } 6065789Smckusick 6165789Smckusick int 6265789Smckusick isonum_722 (p) 6365789Smckusick unsigned char *p; 6465789Smckusick { 6565789Smckusick /* big endian short */ 6665789Smckusick #if BYTE_ORDER != BIG_ENDIAN 6765789Smckusick printf ("isonum_722 called on non big-endian machine!\n"); 6865789Smckusick #endif 6965789Smckusick 7065789Smckusick return *(short *)p; 7165789Smckusick } 7265789Smckusick 7365789Smckusick int 7465789Smckusick isonum_723 (p) 7565789Smckusick unsigned char *p; 7665789Smckusick { 7765789Smckusick #if BYTE_ORDER == BIG_ENDIAN 7865789Smckusick return isonum_722 (p + 2); 7965789Smckusick #elif BYTE_ORDER == LITTLE_ENDIAN 8065789Smckusick return isonum_721 (p); 8165789Smckusick #else 8265789Smckusick printf ("isonum_723 unsupported byte order!\n"); 8365789Smckusick return 0; 8465789Smckusick #endif 8565789Smckusick } 8665789Smckusick 8765789Smckusick int 8865789Smckusick isonum_731 (p) 8965789Smckusick unsigned char *p; 9065789Smckusick { 9165789Smckusick /* little endian long */ 9265789Smckusick #if BYTE_ORDER != LITTLE_ENDIAN 9365789Smckusick printf ("isonum_731 called on non little-endian machine!\n"); 9465789Smckusick #endif 9565789Smckusick 9665789Smckusick return *(long *)p; 9765789Smckusick } 9865789Smckusick 9965789Smckusick int 10065789Smckusick isonum_732 (p) 10165789Smckusick unsigned char *p; 10265789Smckusick { 10365789Smckusick /* big endian long */ 10465789Smckusick #if BYTE_ORDER != BIG_ENDIAN 10565789Smckusick printf ("isonum_732 called on non big-endian machine!\n"); 10665789Smckusick #endif 10765789Smckusick 10865789Smckusick return *(long *)p; 10965789Smckusick } 11065789Smckusick 11165789Smckusick int 11265789Smckusick isonum_733 (p) 11365789Smckusick unsigned char *p; 11465789Smckusick { 11565789Smckusick #if BYTE_ORDER == BIG_ENDIAN 11665789Smckusick return isonum_732 (p + 4); 11765789Smckusick #elif BYTE_ORDER == LITTLE_ENDIAN 11865789Smckusick return isonum_731 (p); 11965789Smckusick #else 12065789Smckusick printf ("isonum_733 unsupported byte order!\n"); 12165789Smckusick return 0; 12265789Smckusick #endif 12365789Smckusick } 12465789Smckusick #endif /* __notanymore__ */ 12565789Smckusick 12665789Smckusick /* 12765789Smckusick * translate and compare a filename 12865789Smckusick * Note: Version number plus ';' may be omitted. 12965789Smckusick */ 13065789Smckusick int 13165789Smckusick isofncmp(unsigned char *fn,int fnlen,unsigned char *isofn,int isolen) 13265789Smckusick { 13365789Smckusick int i, j; 13465789Smckusick char c; 13565789Smckusick 13665789Smckusick while (--fnlen >= 0) { 13765789Smckusick if (--isolen < 0) 13865789Smckusick return *fn; 13965789Smckusick if ((c = *isofn++) == ';') { 14065789Smckusick switch (*fn++) { 14165789Smckusick default: 14265789Smckusick return *--fn; 14365789Smckusick case 0: 14465789Smckusick return 0; 14565789Smckusick case ';': 14665789Smckusick break; 14765789Smckusick } 14865789Smckusick for (i = 0; --fnlen >= 0; i = i * 10 + *fn++ - '0') { 14965789Smckusick if (*fn < '0' || *fn > '9') { 15065789Smckusick return -1; 15165789Smckusick } 15265789Smckusick } 15365789Smckusick for (j = 0; --isolen >= 0; j = j * 10 + *isofn++ - '0'); 15465789Smckusick return i - j; 15565789Smckusick } 15665789Smckusick if (c != *fn) { 15765789Smckusick if (c >= 'A' && c <= 'Z') { 15865789Smckusick if (c + ('a' - 'A') != *fn) { 15965789Smckusick if (*fn >= 'a' && *fn <= 'z') 16065789Smckusick return *fn - ('a' - 'A') - c; 16165789Smckusick else 16265789Smckusick return *fn - c; 16365789Smckusick } 16465789Smckusick } else 16565789Smckusick return *fn - c; 16665789Smckusick } 16765789Smckusick fn++; 16865789Smckusick } 16965789Smckusick if (isolen > 0) { 17065789Smckusick switch (*isofn) { 17165789Smckusick default: 17265789Smckusick return -1; 17365789Smckusick case '.': 17465789Smckusick if (isofn[1] != ';') 17565789Smckusick return -1; 17665789Smckusick case ';': 17765789Smckusick return 0; 17865789Smckusick } 17965789Smckusick } 18065789Smckusick return 0; 18165789Smckusick } 18265789Smckusick 18365789Smckusick /* 18465789Smckusick * translate a filename 18565789Smckusick */ 18665789Smckusick void 18765789Smckusick isofntrans(unsigned char *infn,int infnlen, 18865789Smckusick unsigned char *outfn,unsigned short *outfnlen, 18965789Smckusick int original,int assoc) 19065789Smckusick { 19165789Smckusick int fnidx = 0; 19265789Smckusick 19365789Smckusick if (assoc) { 19465789Smckusick *outfn++ = ASSOCCHAR; 19565789Smckusick fnidx++; 196*67718Smckusick infnlen++; 19765789Smckusick } 19865789Smckusick for (; fnidx < infnlen; fnidx++) { 19965789Smckusick char c = *infn++; 20065789Smckusick 20165789Smckusick if (!original && c >= 'A' && c <= 'Z') 20265789Smckusick *outfn++ = c + ('a' - 'A'); 20365789Smckusick else if (!original && c == '.' && *infn == ';') 20465789Smckusick break; 20565789Smckusick else if (!original && c == ';') 20665789Smckusick break; 20765789Smckusick else 20865789Smckusick *outfn++ = c; 20965789Smckusick } 21065789Smckusick *outfnlen = fnidx; 21165789Smckusick } 212