/* return length of name field; 0: not found, -1: to be ignored */ int get_rock_ridge_filename(struct iso_directory_record * de, char * retname, struct inode * inode) { int len; unsigned char * chr; CONTINUE_DECLS; int retnamlen = 0, truncate=0; if (!inode->i_sb->u.isofs_sb.s_rock) return 0; *retname = 0; SETUP_ROCK_RIDGE(de, chr, len); repeat: { struct rock_ridge * rr; int sig; while (len > 1){ /* There may be one byte for padding somewhere */ rr = (struct rock_ridge *) chr; if (rr->len == 0) goto out; /* Something got screwed up here */ sig = isonum_721(chr); chr += rr->len; len -= rr->len; switch(sig){ case SIG('R','R'): if((rr->u.RR.flags[0] & RR_NM) == 0) goto out; break; case SIG('S','P'): CHECK_SP(goto out); break; case SIG('C','E'): CHECK_CE; break; case SIG('N','M'): if (truncate) break; /* * If the flags are 2 or 4, this indicates '.' or '..'. * We don't want to do anything with this, because it * screws up the code that calls us. We don't really * care anyways, since we can just use the non-RR * name. */ if (rr->u.NM.flags & 6) { break; } if (rr->u.NM.flags & ~1) { printk("Unsupported NM flag settings (%d)\n",rr->u.NM.flags); break; } if((strlen(retname) + rr->len - 5) >= 254) { truncate = 1; break; } strncat(retname, rr->u.NM.name, rr->len - 5); retnamlen += rr->len - 5; break; case SIG('R','E'): if (buffer) kfree(buffer); return -1; default: break; } } } MAYBE_CONTINUE(repeat,inode); return retnamlen; /* If 0, this file did not have a NM field */ out: if(buffer) kfree(buffer); return 0; }
int find_rock_ridge_relocation(struct iso_directory_record * de, struct inode * inode) { int flag; int len; int retval; unsigned char * chr; CONTINUE_DECLS; flag = 0; /* If this is a '..' then we are looking for the parent, otherwise we are looking for the child */ if (de->name[0]==1 && de->name_len[0]==1) flag = 1; /* Return value if we do not find appropriate record. */ retval = isonum_733 (de->extent); if (!inode->i_sb->u.isofs_sb.s_rock) return retval; SETUP_ROCK_RIDGE(de, chr, len); repeat: { int rrflag, sig; struct rock_ridge * rr; while (len > 1){ /* There may be one byte for padding somewhere */ rr = (struct rock_ridge *) chr; if (rr->len == 0) goto out; /* Something got screwed up here */ sig = isonum_721(chr); chr += rr->len; len -= rr->len; switch(sig){ case SIG('R','R'): rrflag = rr->u.RR.flags[0]; if (flag && !(rrflag & RR_PL)) goto out; if (!flag && !(rrflag & RR_CL)) goto out; break; case SIG('S','P'): CHECK_SP(goto out); break; case SIG('C','L'): if (flag == 0) { retval = isonum_733(rr->u.CL.location); goto out; } break; case SIG('P','L'): if (flag != 0) { retval = isonum_733(rr->u.PL.location); goto out; } break; case SIG('C','E'): CHECK_CE; /* This tells is if there is a continuation record */ break; default: break; } } } MAYBE_CONTINUE(repeat, inode); return retval; out: if(buffer) kfree(buffer); return retval; }
int get_rock_ridge_filename(struct iso_directory_record * de, char * retname, struct inode * inode) { int len; unsigned char * chr; CONTINUE_DECLS; int retnamlen = 0, truncate=0; if (!inode->i_sb->u.isofs_sb.s_rock) return 0; *retname = 0; retnamlen = 0; SETUP_ROCK_RIDGE(de, chr, len); repeat: { struct rock_ridge * rr; int sig; while (len > 1){ /* There may be one byte for padding somewhere */ rr = (struct rock_ridge *) chr; if (rr->len == 0) goto out; /* Something got screwed up here */ sig = (chr[0] << 8) + chr[1]; chr += rr->len; len -= rr->len; switch(sig){ case SIG('R','R'): if((rr->u.RR.flags[0] & RR_NM) == 0) goto out; break; case SIG('S','P'): CHECK_SP(goto out); break; case SIG('C','E'): CHECK_CE; break; case SIG('N','M'): if (truncate) break; if (rr->u.NM.flags & ~1) { printk("Unsupported NM flag settings (%d)\n",rr->u.NM.flags); break; }; if((strlen(retname) + rr->len - 5) >= 254) { truncate = 1; break; }; strncat(retname, rr->u.NM.name, rr->len - 5); retnamlen += rr->len - 5; break; case SIG('R','E'): #ifdef DEBUG printk("RR: RE (%x)\n", inode->i_ino); #endif if (buffer) kfree(buffer); return -1; default: break; } }; } MAYBE_CONTINUE(repeat,inode); return retnamlen; /* If 0, this file did not have a NM field */ out: if(buffer) kfree(buffer); return 0; }