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

📄 cd9660_node.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
			iso_iput(ip);			ip = iq;		}	}		if (ip->iso_extent == imp->root_extent)		vp->v_flag |= VROOT;		*ipp = ip;	return 0;}/* * Unlock and decrement the reference count of an inode structure. */iso_iput(ip)	register struct iso_node *ip;{		if ((ip->i_flag & ILOCKED) == 0)		panic("iso_iput");	ISO_IUNLOCK(ip);	vrele(ITOV(ip));}/* * Last reference to an inode, write the inode out and if necessary, * truncate and deallocate the file. */intcd9660_inactive(ap)	struct vop_inactive_args /* {		struct vnode *a_vp;	} */ *ap;{	struct vnode *vp = ap->a_vp;	register struct iso_node *ip = VTOI(vp);	int mode, error = 0;		if (prtactive && vp->v_usecount != 0)		vprint("cd9660_inactive: pushing active", vp);		ip->i_flag = 0;	/*	 * If we are done with the inode, reclaim it	 * so that it can be reused immediately.	 */	if (vp->v_usecount == 0 && ip->inode.iso_mode == 0)		vgone(vp);	return error;}/* * Reclaim an inode so that it can be used for other purposes. */intcd9660_reclaim(ap)	struct vop_reclaim_args /* {		struct vnode *a_vp;	} */ *ap;{	register struct vnode *vp = ap->a_vp;	register struct iso_node *ip = VTOI(vp);	int i;		if (prtactive && vp->v_usecount != 0)		vprint("cd9660_reclaim: pushing active", vp);	/*	 * Remove the inode from its hash chain.	 */	remque(ip);	ip->i_forw = ip;	ip->i_back = ip;	/*	 * Purge old data structures associated with the inode.	 */	cache_purge(vp);	if (ip->i_devvp) {		vrele(ip->i_devvp);		ip->i_devvp = 0;	}	FREE(vp->v_data, M_ISOFSNODE);	vp->v_data = NULL;	return 0;}/* * Lock an inode. If its already locked, set the WANT bit and sleep. */iso_ilock(ip)	register struct iso_node *ip;{		while (ip->i_flag & ILOCKED) {		ip->i_flag |= IWANT;		if (ip->i_spare0 == curproc->p_pid)			panic("locking against myself");		ip->i_spare1 = curproc->p_pid;		(void) sleep((caddr_t)ip, PINOD);	}	ip->i_spare1 = 0;	ip->i_spare0 = curproc->p_pid;	ip->i_flag |= ILOCKED;}/* * Unlock an inode.  If WANT bit is on, wakeup. */iso_iunlock(ip)	register struct iso_node *ip;{	if ((ip->i_flag & ILOCKED) == 0)		vprint("iso_iunlock: unlocked inode", ITOV(ip));	ip->i_spare0 = 0;	ip->i_flag &= ~ILOCKED;	if (ip->i_flag&IWANT) {		ip->i_flag &= ~IWANT;		wakeup((caddr_t)ip);	}}/* * File attributes */voidcd9660_defattr(isodir,inop,bp)	struct iso_directory_record *isodir;	struct iso_node *inop;	struct buf *bp;{	struct buf *bp2 = NULL;	struct iso_mnt *imp;	struct iso_extended_attributes *ap = NULL;	int off;		if (isonum_711(isodir->flags)&2) {		inop->inode.iso_mode = S_IFDIR;		/*		 * If we return 2, fts() will assume there are no subdirectories		 * (just links for the path and .), so instead we return 1.		 */		inop->inode.iso_links = 1;	} else {		inop->inode.iso_mode = S_IFREG;		inop->inode.iso_links = 1;	}	if (!bp	    && ((imp = inop->i_mnt)->im_flags&ISOFSMNT_EXTATT)	    && (off = isonum_711(isodir->ext_attr_length))) {		iso_blkatoff(inop,-off * imp->logical_block_size,&bp2);		bp = bp2;	}	if (bp) {		ap = (struct iso_extended_attributes *)bp->b_un.b_addr;				if (isonum_711(ap->version) == 1) {			if (!(ap->perm[0]&0x40))				inop->inode.iso_mode |= VEXEC >> 6;			if (!(ap->perm[0]&0x10))				inop->inode.iso_mode |= VREAD >> 6;			if (!(ap->perm[0]&4))				inop->inode.iso_mode |= VEXEC >> 3;			if (!(ap->perm[0]&1))				inop->inode.iso_mode |= VREAD >> 3;			if (!(ap->perm[1]&0x40))				inop->inode.iso_mode |= VEXEC;			if (!(ap->perm[1]&0x10))				inop->inode.iso_mode |= VREAD;			inop->inode.iso_uid = isonum_723(ap->owner); /* what about 0? */			inop->inode.iso_gid = isonum_723(ap->group); /* what about 0? */		} else			ap = NULL;	}	if (!ap) {		inop->inode.iso_mode |= VREAD|VEXEC|(VREAD|VEXEC)>>3|(VREAD|VEXEC)>>6;		inop->inode.iso_uid = (uid_t)0;		inop->inode.iso_gid = (gid_t)0;	}	if (bp2)		brelse(bp2);}/* * Time stamps */voidcd9660_deftstamp(isodir,inop,bp)	struct iso_directory_record *isodir;	struct iso_node *inop;	struct buf *bp;{	struct buf *bp2 = NULL;	struct iso_mnt *imp;	struct iso_extended_attributes *ap = NULL;	int off;		if (!bp	    && ((imp = inop->i_mnt)->im_flags&ISOFSMNT_EXTATT)	    && (off = isonum_711(isodir->ext_attr_length))) {		iso_blkatoff(inop,-off * imp->logical_block_size,&bp2);		bp = bp2;	}	if (bp) {		ap = (struct iso_extended_attributes *)bp->b_un.b_addr;				if (isonum_711(ap->version) == 1) {			if (!cd9660_tstamp_conv17(ap->ftime,&inop->inode.iso_atime))				cd9660_tstamp_conv17(ap->ctime,&inop->inode.iso_atime);			if (!cd9660_tstamp_conv17(ap->ctime,&inop->inode.iso_ctime))				inop->inode.iso_ctime = inop->inode.iso_atime;			if (!cd9660_tstamp_conv17(ap->mtime,&inop->inode.iso_mtime))				inop->inode.iso_mtime = inop->inode.iso_ctime;		} else			ap = NULL;	}	if (!ap) {		cd9660_tstamp_conv7(isodir->date,&inop->inode.iso_ctime);		inop->inode.iso_atime = inop->inode.iso_ctime;		inop->inode.iso_mtime = inop->inode.iso_ctime;	}	if (bp2)		brelse(bp2);}intcd9660_tstamp_conv7(pi,pu)char *pi;struct timeval *pu;{	int i;	int crtime, days;	int y, m, d, hour, minute, second, tz;		y = pi[0] + 1900;	m = pi[1];	d = pi[2];	hour = pi[3];	minute = pi[4];	second = pi[5];	tz = pi[6];		if (y < 1970) {		pu->tv_sec  = 0;		pu->tv_usec = 0;		return 0;	} else {#ifdef	ORIGINAL		/* computes day number relative to Sept. 19th,1989 */		/* don't even *THINK* about changing formula. It works! */		days = 367*(y-1980)-7*(y+(m+9)/12)/4-3*((y+(m-9)/7)/100+1)/4+275*m/9+d-100;#else		/*		 * Changed :-) to make it relative to Jan. 1st, 1970		 * and to disambiguate negative division		 */		days = 367*(y-1960)-7*(y+(m+9)/12)/4-3*((y+(m+9)/12-1)/100+1)/4+275*m/9+d-239;#endif		crtime = ((((days * 24) + hour) * 60 + minute) * 60) + second;				/* timezone offset is unreliable on some disks */		if (-48 <= tz && tz <= 52)			crtime += tz * 15 * 60;	}	pu->tv_sec  = crtime;	pu->tv_usec = 0;	return 1;}static unsignedcd9660_chars2ui(begin,len)	unsigned char *begin;	int len;{	unsigned rc;		for (rc = 0; --len >= 0;) {		rc *= 10;		rc += *begin++ - '0';	}	return rc;}intcd9660_tstamp_conv17(pi,pu)	unsigned char *pi;	struct timeval *pu;{	unsigned char buf[7];		/* year:"0001"-"9999" -> -1900  */	buf[0] = cd9660_chars2ui(pi,4) - 1900;		/* month: " 1"-"12"      -> 1 - 12 */	buf[1] = cd9660_chars2ui(pi + 4,2);		/* day:   " 1"-"31"      -> 1 - 31 */	buf[2] = cd9660_chars2ui(pi + 6,2);		/* hour:  " 0"-"23"      -> 0 - 23 */	buf[3] = cd9660_chars2ui(pi + 8,2);		/* minute:" 0"-"59"      -> 0 - 59 */	buf[4] = cd9660_chars2ui(pi + 10,2);		/* second:" 0"-"59"      -> 0 - 59 */	buf[5] = cd9660_chars2ui(pi + 12,2);		/* difference of GMT */	buf[6] = pi[16];		return cd9660_tstamp_conv7(buf,pu);}voidisodirino(inump,isodir,imp)	ino_t *inump;	struct iso_directory_record *isodir;	struct iso_mnt *imp;{	*inump = (isonum_733(isodir->extent) + isonum_711(isodir->ext_attr_length))		 * imp->logical_block_size;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -