diff -ur linux/fs/isofs/dir.c linuxn/fs/isofs/dir.c --- linux/fs/isofs/dir.c Tue Jul 23 08:26:40 1996 +++ linuxn/fs/isofs/dir.c Sun Mar 22 17:17:08 1998 @@ -104,6 +104,32 @@ return i; } +/* Acorn extensions written by Matthew Wilcox 1998 */ +int get_acorn_filename(struct iso_directory_record * de, + char * retname, struct inode * inode) +{ + int std; + unsigned char * chr; + int retnamlen = isofs_name_translate(de->name, + de->name_len[0], retname); + if (retnamlen == 0) return 0; + std = sizeof(struct iso_directory_record) + de->name_len[0]; + if (std & 1) std++; + if ((*((unsigned char *) de) - std) != 32) return retnamlen; + chr = ((unsigned char *) de) + std; + if (strncmp(chr, "ARCHIMEDES", 10)) return retnamlen; + if ((*retname == '_') && ((chr[19] & 1) == 1)) *retname = '!'; + if (((de->flags[0] & 2) == 0) && (chr[13] == 0xff) + && ((chr[12] & 0xf0) == 0xf0)) + { + retname[retnamlen] = ','; + sprintf(retname+retnamlen+1, "%3.3x", + ((chr[12] & 0xf) << 8) | chr[11]); + retnamlen += 4; + } + return retnamlen; +} + /* * This should _really_ be cleaned up some day.. */ @@ -263,6 +289,14 @@ continue; } + if (inode->i_sb->u.isofs_sb.s_mapping == 'a') { + len = get_acorn_filename(de, tmpname, inode); + if (filldir(dirent, tmpname, len, filp->f_pos, inode_nu mber) < 0) + break; + dcache_add(inode, tmpname, len, inode_number); + filp->f_pos += de_len; + continue; + } else if (inode->i_sb->u.isofs_sb.s_mapping == 'n') { len = isofs_name_translate(name, len, tmpname); if (filldir(dirent, tmpname, len, filp->f_pos, inode_nu mber) < 0) diff -ur linux/fs/isofs/inode.c linuxn/fs/isofs/inode.c --- linux/fs/isofs/inode.c Fri Aug 15 19:11:45 1997 +++ linuxn/fs/isofs/inode.c Sun Mar 22 16:32:10 1998 @@ -78,7 +78,7 @@ { char *this_char,*value; - popt->map = 'n'; + popt->map = 'a'; popt->rock = 'y'; popt->cruft = 'n'; popt->unhide = 'n'; @@ -105,10 +105,11 @@ if ((value = strchr(this_char,'=')) != NULL) *value++ = 0; if (!strcmp(this_char,"map") && value) { - if (value[0] && !value[1] && strchr("on",*value)) + if (value[0] && !value[1] && strchr("ano",*value)) popt->map = *value; else if (!strcmp(value,"off")) popt->map = 'o'; else if (!strcmp(value,"normal")) popt->map = 'n'; + else if (!strcmp(value,"acorn")) popt->map = 'a'; else return 0; } else if (!strcmp(this_char,"check") && value) { diff -ur linux/fs/isofs/namei.c linuxn/fs/isofs/namei.c --- linux/fs/isofs/namei.c Tue Aug 12 22:06:35 1997 +++ linuxn/fs/isofs/namei.c Sun Mar 22 16:36:58 1998 @@ -156,6 +156,9 @@ rrflag = get_rock_ridge_filename(de, &dpnt, &dlen, dir); if (rrflag) { if (rrflag == -1) goto out; /* Relocated deep directory */ + } else + if(dir->i_sb->u.isofs_sb.s_mapping == 'a') { + dlen = get_acorn_filename(de, dpnt, dir); } else { if(dir->i_sb->u.isofs_sb.s_mapping == 'n') { for (i = 0; i < dlen; i++) { diff -ur linux/include/linux/iso_fs.h linuxn/include/linux/iso_fs.h --- linux/include/linux/iso_fs.h Sat Nov 22 20:09:34 1997 +++ linuxn/include/linux/iso_fs.h Sun Mar 22 16:38:41 1998 @@ -146,6 +146,7 @@ extern char * get_rock_ridge_symlink(struct inode *); extern int find_rock_ridge_relocation(struct iso_directory_record *, struct in ode *); +int get_acorn_filename(struct iso_directory_record *, char *, struct inode *); /* The stuff that follows may be totally unneeded. I have not checked to see which prototypes we are still using. */