⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdfs_namei.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -