📄 cdfs_namei.c
字号:
u.u_error = EIO; /* XXX */ *gpp = 0; return(u.u_error); } /* * If a file was recorded in interleave mode, verify the * file unit size and interleave gap size are both multiples * of 2k. */ lbs = ISOFS_LBS(FS(*gpp)); if (G_TO_DIR(*gpp)->iso_dir_file_unit_size) { if ((G_TO_DIR(*gpp)->iso_dir_file_unit_size * lbs) % ISO_SECSIZE) { printf("cdfs_namei: gnode number %d file unit size %d not 2k multiple\n", gnumber, (G_TO_DIR(*gpp)->iso_dir_file_unit_size * lbs)); gput(*gpp); u.u_error = EIO; *gpp = 0; return(u.u_error); } if ((G_TO_DIR(*gpp)->iso_dir_inger_gap_size * lbs) % ISO_SECSIZE) { printf("cdfs_namei: gnode number %d file gap size %d not 2k multiple\n", gnumber, (G_TO_DIR(*gpp)->iso_dir_inger_gap_size * lbs)); gput(*gpp); u.u_error = EIO; *gpp = 0; return(u.u_error); } /* * If a file unit contains an XAR, and it was recorded in * interleave mode, verify size of XAR is equal to the file * unit size. */ if (G_TO_DIR(*gpp)->iso_dir_xar) { if (G_TO_DIR(*gpp)->iso_dir_xar != G_TO_DIR(*gpp)->iso_dir_file_unit_size) { printf("cdfs_setuptransfer: gnode number %d xar size %d != file unit size\n", gnumber, G_TO_DIR(*gpp)->iso_dir_xar, G_TO_DIR(*gpp)->iso_dir_file_unit_size); gput(*gpp); u.u_error = EIO; *gpp = 0; return(u.u_error); } } if (isodebug1 && G_TO_DIR(*gpp)->iso_dir_file_unit_size) printf("cdfs_namei: %s recorded in interleave mode !!!\n", nm); } /* file unit size */ cdfs_gunlock(*gpp); return (0);}intcdfs_getnumber(dgp, nm, cred) struct gnode *dgp; char *nm; struct ucred *cred;{ int isdotdot = 0; int wasdot; struct buf *bp; struct fs *fs; int foundit; int gnumber; struct iso_dir *tmp_iso_dir; struct hsg_dir *tmp_hsg_dir; struct iso_idir idir; int resid; int tsize; int lbn, bn; int datainbuf, offinbuf; unsigned int diskaddr; unsigned int isodir_offset; unsigned int isodir_reclen; union { unsigned char incoming[4]; unsigned int outgoing; } iso_convert_int; int rablock, rasize; int isiso; int length; int skip_file; fs = FS(dgp); if (!strcmp(nm, ".")) return(dgp->g_number); if (fs->fs_format == ISO_9660) isiso = 1; else isiso = 0; if (!strcmp(nm, "..")) isdotdot = 1; resid = dgp->g_size; isodir_offset = 0; diskaddr = ((unsigned int)G_TO_DIR(dgp)->iso_dir_extent + (unsigned int)G_TO_DIR(dgp)->iso_dir_xar) * (unsigned int)ISOFS_LBS(fs); tsize = 0; while (resid && !u.u_error) { foundit = 0; lbn = isodir_offset / ISOFS_LBS(FS(dgp)); /* * Since directories cannot be interleaved, datainbuf * and tsize will both equal MAXBSIZE, We are only * interested in bn and offinbuf. */ bn = cdfs_ibmap(dgp, lbn, &datainbuf, &offinbuf); datainbuf = MIN(datainbuf, dgp->g_size - isodir_offset); bp = bread(dgp->g_dev, bn, FS(dgp)->fs_ibsize, (struct gnode *)NULL); if (bp->b_flags & B_ERROR) { brelse(bp); return(0); } tsize = datainbuf; wasdot = 0; if (isiso) tmp_iso_dir = (struct iso_dir *) ((unsigned int)bp->b_un.b_addr + offinbuf); else tmp_hsg_dir = (struct hsg_dir *) ((unsigned int)bp->b_un.b_addr + offinbuf); do { skip_file = 0; switch (fs->fs_format) { case ISO_9660: length = tmp_iso_dir->dir_namelen; if (tmp_iso_dir->dir_file_flags&ISO_FLG_DIR) { if (tmp_iso_dir->dir_namelen == 1) { if (tmp_iso_dir->dir_name[0] == '\0') { wasdot = 1; } else if (wasdot) { wasdot = 0; if (isdotdot) { foundit = 1; goto found; } } } } else { /* * If associated file, or volume seq number * does not match file primary volume descriptor * volume sequence number, skip over file. */ if ((tmp_iso_dir->dir_file_flags&ISO_FLG_ASSOC) || tmp_iso_dir->dir_vol_seq_no_lsb != ISOFS_VOLSEQNUM(fs)) { skip_file = 1; length = 0; } /* * Subtract version number is appropriate */ if ((dgp->g_mp)->m_flags & M_NOVERSION) { for(length = 0; length < tmp_iso_dir->dir_namelen; length++) if (tmp_iso_dir->dir_name[length] == ';') break; } } if(skip_file == 0 && strlen(nm) == length && !strncmp(nm, tmp_iso_dir->dir_name, length)) { foundit = 1; goto found; } isodir_reclen = tmp_iso_dir->dir_len; tmp_iso_dir = (struct iso_dir *) ((unsigned int)tmp_iso_dir + isodir_reclen); break; default: /* HSG */ length = tmp_hsg_dir->dir_namelen; if (tmp_hsg_dir->dir_file_flags&ISO_FLG_DIR) { if (tmp_hsg_dir->dir_namelen == 1) { if (tmp_hsg_dir->dir_name[0] == '\0') { wasdot = 1; } else if (wasdot) { wasdot = 0; if (isdotdot) { foundit = 1; goto found; } } } } else { /* * If associated file, or volume seq number * does not match file primary volume descriptor * volume sequence number, skip over file. */ if ((tmp_hsg_dir->dir_file_flags&ISO_FLG_ASSOC) || tmp_hsg_dir->dir_vol_seq_no_lsb != ISOFS_VOLSEQNUM(fs)) { skip_file = 1; length = 0; } /* * Subtract version number is appropriate */ if ((dgp->g_mp)->m_flags & M_NOVERSION) { for(length = 0; length < tmp_hsg_dir->dir_namelen; length++) if (tmp_hsg_dir->dir_name[length] == ';') break; } } if(skip_file == 0 && strlen(nm) == length && !strncmp(nm, tmp_hsg_dir->dir_name, length)) { foundit = 1; goto found; } isodir_reclen = tmp_hsg_dir->dir_len; tmp_hsg_dir = (struct hsg_dir *) ((unsigned int)tmp_hsg_dir + isodir_reclen); } /* switch */ isodir_offset += isodir_reclen; tsize -= isodir_reclen; switch (fs->fs_format) { case ISO_9660: if ((tsize > 0) && (tmp_iso_dir->dir_len == 0)) { isodir_reclen = ISO_SECSIZE - (isodir_offset % ISO_SECSIZE); tsize -= isodir_reclen; isodir_offset += isodir_reclen; tmp_iso_dir = (struct iso_dir *) ((unsigned int)tmp_iso_dir + isodir_reclen); } break; default: if ((tsize > 0) && (tmp_hsg_dir->dir_len == 0)) { isodir_reclen = ISO_SECSIZE - (isodir_offset % ISO_SECSIZE); tsize -= isodir_reclen; isodir_offset += isodir_reclen; tmp_hsg_dir = (struct hsg_dir *) ((unsigned int)tmp_hsg_dir + isodir_reclen); } } /* switch */ if (isodir_offset % ISO_SECSIZE == 0) resid -= ISO_SECSIZE; } while (tsize > 0);found: if (foundit) { /* * Found the correct directory entry. * Set gnumber to disk address of directory * record. */ switch (fs->fs_format) { case ISO_9660: if (tmp_iso_dir->dir_file_flags&ISO_FLG_DIR) { bcopy(tmp_iso_dir->dir_extent_lsb, iso_convert_int.incoming, sizeof(int)); gnumber = (iso_convert_int.outgoing + tmp_iso_dir->dir_xar) * (int)ISOFS_LBS(fs); } else gnumber = diskaddr + isodir_offset; break; default: if (tmp_hsg_dir->dir_file_flags&ISO_FLG_DIR) { bcopy(tmp_hsg_dir->dir_extent_lsb, iso_convert_int.incoming, sizeof(int)); gnumber = (iso_convert_int.outgoing + tmp_hsg_dir->dir_xar) * (int)ISOFS_LBS(fs); } else gnumber = diskaddr + isodir_offset; } /* switch */ /* * Release buffer. */ brelse(bp); if (isodebug) printf("cdfs_getnumber: entry %s number %d\n", nm, gnumber); return(gnumber); } brelse(bp); } if (isodebug) printf("cdfs_getnumber: entry %s not found\n", nm); return(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -