亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? namei.c

?? 內(nèi)核是系統(tǒng)的心臟
?? C
字號:
/*
 *  linux/fs/isofs/namei.c
 *
 *  (C) 1992  Eric Youngdale Modified for ISO9660 filesystem.
 *
 *  (C) 1991  Linus Torvalds - minix filesystem
 */

#include <linux/sched.h>
#include <linux/iso_fs.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/stat.h>
#include <linux/fcntl.h>
#include <asm/segment.h>
#include <linux/malloc.h>

#include <linux/errno.h>

/*
 * ok, we cannot use strncmp, as the name is not in our data space.
 * Thus we'll have to use isofs_match. No big problem. Match also makes
 * some sanity tests.
 *
 * NOTE! unlike strncmp, isofs_match returns 1 for success, 0 for failure.
 */
static int isofs_match(int len,const char * name, char * compare, int dlen)
{
	register int same __asm__("ax");
	
	if (!compare) return 0;
	/* "" means "." ---> so paths like "/usr/lib//libc.a" work */
	if (!len && (compare[0]==0) && (dlen==1))
		return 1;
	
	if (compare[0]==0 && dlen==1 && len == 1)
		compare = ".";
 	if (compare[0]==1 && dlen==1 && len == 2) {
		compare = "..";
		dlen = 2;
	};
#if 0
	if (len <= 2) printk("Match: %d %d %s %d %d \n",len,dlen,compare,de->name[0], dlen);
#endif
	
	if (dlen != len)
		return 0;
	__asm__("cld\n\t"
		"repe ; cmpsb\n\t"
		"setz %%al"
		:"=a" (same)
		:"0" (0),"S" ((long) name),"D" ((long) compare),"c" (len)
		:"cx","di","si");
	return same;
}

/*
 *	isofs_find_entry()
 *
 * finds an entry in the specified directory with the wanted name. It
 * returns the cache buffer in which the entry was found, and the entry
 * itself (as an inode number). It does NOT read the inode of the
 * entry - you'll have to do that yourself if you want to.
 */
static struct buffer_head * isofs_find_entry(struct inode * dir,
	const char * name, int namelen, int * ino, int * ino_back)
{
	unsigned long bufsize = ISOFS_BUFFER_SIZE(dir);
	unsigned char bufbits = ISOFS_BUFFER_BITS(dir);
	unsigned int block, i, f_pos, offset, inode_number;
	struct buffer_head * bh;
	void * cpnt = NULL;
	unsigned int old_offset;
	unsigned int backlink;
	int dlen, rrflag, match;
	char * dpnt;
	struct iso_directory_record * de;
	char c;

	*ino = 0;
	if (!dir) return NULL;
	
	if (!(block = dir->u.isofs_i.i_first_extent)) return NULL;
  
	f_pos = 0;

	offset = f_pos & (bufsize - 1);
	block = isofs_bmap(dir,f_pos >> bufbits);

	if (!block || !(bh = bread(dir->i_dev,block,bufsize))) return NULL;
  
	while (f_pos < dir->i_size) {
		de = (struct iso_directory_record *) (bh->b_data + offset);
		backlink = dir->i_ino;
		inode_number = (block << bufbits) + (offset & (bufsize - 1));

		/* If byte is zero, this is the end of file, or time to move to
		   the next sector. Usually 2048 byte boundaries. */
		
		if (*((unsigned char *) de) == 0) {
			brelse(bh);
			offset = 0;
			f_pos = ((f_pos & ~(ISOFS_BLOCK_SIZE - 1))
				 + ISOFS_BLOCK_SIZE);
			block = isofs_bmap(dir,f_pos>>bufbits);
			if (!block || !(bh = bread(dir->i_dev,block,bufsize)))
				return 0;
			continue; /* Will kick out if past end of directory */
		}

		old_offset = offset;
		offset += *((unsigned char *) de);
		f_pos += *((unsigned char *) de);

		/* Handle case where the directory entry spans two blocks.
		   Usually 1024 byte boundaries */
		if (offset >= bufsize) {
			cpnt = kmalloc(1 << ISOFS_BLOCK_BITS, GFP_KERNEL);
			memcpy(cpnt, bh->b_data, bufsize);
			de = (struct iso_directory_record *)
			  ((char *)cpnt + old_offset);
			brelse(bh);
			offset = f_pos & (bufsize - 1);
			block = isofs_bmap(dir,f_pos>>bufbits);
			if (!block || !(bh = bread(dir->i_dev,block,bufsize))) {
			        kfree_s(cpnt, 1 << ISOFS_BLOCK_BITS);
				return 0;
			};
			memcpy((char *)cpnt+bufsize,bh->b_data,bufsize);
		}
		
		/* Handle the '.' case */
		
		if (de->name[0]==0 && de->name_len[0]==1) {
			inode_number = dir->i_ino;
			backlink = 0;
		}
		
		/* Handle the '..' case */

		if (de->name[0]==1 && de->name_len[0]==1) {
#if 0
			printk("Doing .. (%d %d)",
			       dir->i_sb->s_firstdatazone << bufbits,
			       dir->i_ino);
#endif
			if((dir->i_sb->u.isofs_sb.s_firstdatazone
			    << bufbits) != dir->i_ino)
				inode_number = dir->u.isofs_i.i_backlink;
			else
				inode_number = dir->i_ino;
			backlink = 0;
		}
    
		dlen = de->name_len[0];
		dpnt = de->name;
		/* Now convert the filename in the buffer to lower case */
		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 == 'n') {
		    for (i = 0; i < dlen; i++) {
		      c = dpnt[i];
		      if (c >= 'A' && c <= 'Z') c |= 0x20;  /* lower case */
		      if (c == ';' && i == dlen-2 && dpnt[i+1] == '1') {
			dlen -= 2;
			break;
		      }
		      if (c == ';') c = '.';
		      de->name[i] = c;
		    }
		    /* This allows us to match with and without a trailing
		       period.  */
		    if(dpnt[dlen-1] == '.' && namelen == dlen-1)
		      dlen--;
		  }
		}
		match = isofs_match(namelen,name,dpnt,dlen);
		if (cpnt) {
			kfree_s(cpnt, 1 << ISOFS_BLOCK_BITS);
			cpnt = NULL;
		}

		if(rrflag) kfree(dpnt);
		if (match) {
			if(inode_number == -1) {
				/* Should only happen for the '..' entry */
				inode_number = 
					isofs_lookup_grandparent(dir,
					   find_rock_ridge_relocation(de,dir));
				if(inode_number == -1){
					/* Should never happen */
					printk("Backlink not properly set.\n");
					goto out;
				}
			}
			*ino = inode_number;
			*ino_back = backlink;
			return bh;
		}
	}
 out:
	if (cpnt)
		kfree_s(cpnt, 1 << ISOFS_BLOCK_BITS);
	brelse(bh);
	return NULL;
}

int isofs_lookup(struct inode * dir,const char * name, int len,
	struct inode ** result)
{
	int ino, ino_back;
	struct buffer_head * bh;

#ifdef DEBUG
	printk("lookup: %x %d\n",dir->i_ino, len);
#endif
	*result = NULL;
	if (!dir)
		return -ENOENT;

	if (!S_ISDIR(dir->i_mode)) {
		iput(dir);
		return -ENOENT;
	}

	ino = 0;
	if (dir->i_dev == cache.dev && 
	    dir->i_ino == cache.dir &&
	    len == cache.dlen && 
	    isofs_match(len, name, cache.filename, cache.dlen))
	  {
	    ino = cache.ino;
	    ino_back = dir->i_ino;
	    /* These two cases are special, but since they are at the start
	       of the directory, we can just as easily search there */
	    if (cache.dlen == 1 && cache.filename[0] == '.') ino = 0;
	    if (cache.dlen == 2 && cache.filename[0] == '.' && 
		cache.filename[1] == '.') ino = 0;
	  };

	if (!ino) {
	  if (!(bh = isofs_find_entry(dir,name,len, &ino, &ino_back))) {
	    iput(dir);
	    return -ENOENT;
	  }
	  brelse(bh);
	};

	if (!(*result = iget(dir->i_sb,ino))) {
		iput(dir);
		return -EACCES;
	}

	/* We need this backlink for the ".." entry unless the name that we
	   are looking up traversed a mount point (in which case the inode
	   may not even be on an iso9660 filesystem, and writing to
	   u.isofs_i would only cause memory corruption).
	*/
	
	if (ino_back && !(*result)->i_pipe && (*result)->i_sb == dir->i_sb) {
	  (*result)->u.isofs_i.i_backlink = ino_back; 
	}
	
	iput(dir);
	return 0;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人av网站| 日韩亚洲欧美成人一区| 国产日韩欧美精品在线| 国产一区二区看久久| 国产婷婷色一区二区三区| www.亚洲精品| 一个色妞综合视频在线观看| 欧美亚洲动漫精品| 日本视频免费一区| 国产午夜精品一区二区三区四区| www.欧美.com| 亚洲成人免费av| 精品久久久久久久久久久久久久久久久 | 久久久久久久久免费| 国产乱码字幕精品高清av | 一区二区三区日韩欧美精品| 欧美日韩中文字幕一区二区| 免费观看成人鲁鲁鲁鲁鲁视频| 久久精品日产第一区二区三区高清版| 波多野结衣一区二区三区| 午夜国产精品影院在线观看| 久久久久9999亚洲精品| 色欧美乱欧美15图片| 蜜芽一区二区三区| 中文字幕一区二区三区色视频| 欧美狂野另类xxxxoooo| 国产麻豆一精品一av一免费| 亚洲免费电影在线| 久久网站最新地址| 欧美日本一区二区| 在线影院国内精品| 麻豆精品久久精品色综合| 中文字幕成人在线观看| 制服丝袜日韩国产| 97久久超碰精品国产| 麻豆精品视频在线观看| 一区二区三区中文在线| 久久久五月婷婷| 欧美日韩国产a| 成人黄色777网| 免费成人性网站| 亚洲亚洲人成综合网络| 欧美精彩视频一区二区三区| 91精品久久久久久久99蜜桃| jlzzjlzz亚洲日本少妇| 国内不卡的二区三区中文字幕 | 日韩精品专区在线| 91福利在线看| caoporen国产精品视频| 蜜桃视频第一区免费观看| 亚洲精品视频观看| 中文字幕不卡在线观看| 国产日韩精品一区二区三区| 丝袜美腿一区二区三区| 91美女片黄在线| 国内外成人在线| 五月天一区二区三区| 一区二区国产盗摄色噜噜| 欧美高清在线一区二区| 国产喷白浆一区二区三区| 精品女同一区二区| 日韩一区二区三区视频| 欧美男女性生活在线直播观看| 日本精品免费观看高清观看| a级高清视频欧美日韩| 高清shemale亚洲人妖| 精品一区二区三区在线播放| 午夜伦欧美伦电影理论片| 亚洲国产三级在线| 亚洲第一电影网| 亚洲制服丝袜av| 亚洲午夜久久久久久久久电影网| 亚洲乱码国产乱码精品精98午夜| 国产精品的网站| 中文字幕一区二区三区四区不卡 | 国产亚洲成av人在线观看导航| 欧美精品v日韩精品v韩国精品v| 欧美视频一区在线观看| 欧洲生活片亚洲生活在线观看| 91丝袜美女网| 欧美日韩一区二区三区视频| 欧美男男青年gay1069videost | 免费av网站大全久久| 日本成人在线网站| 另类小说欧美激情| 国产一区不卡在线| 成人短视频下载| 欧美在线综合视频| 91精品综合久久久久久| 欧美成人一区二区| 久久精品一区八戒影视| 国产精品国产三级国产普通话三级 | 欧美经典一区二区| 国产精品亚洲人在线观看| 黑人巨大精品欧美一区| 国产一区视频导航| 成人午夜激情影院| 色婷婷综合久久久久中文| 欧美视频一区二区| 日韩精品一区二区三区中文不卡| 精品av综合导航| 国产精品欧美一级免费| 一区二区三区四区激情| 日本一区中文字幕| 国产精品一区久久久久| 91丨porny丨蝌蚪视频| 欧美日韩日本视频| 亚洲精品在线三区| **网站欧美大片在线观看| 亚洲成人在线观看视频| 久久精品国产第一区二区三区| 国产精品中文欧美| 91免费版在线看| 日韩一级黄色片| 国产精品视频看| 亚洲成人久久影院| 国产 欧美在线| 欧美日韩一区二区三区高清 | 日韩欧美久久久| 中文字幕日韩av资源站| 日韩国产精品久久久| 丁香激情综合国产| 精品视频在线视频| 中文字幕巨乱亚洲| 六月丁香综合在线视频| 91国产免费观看| 欧美国产日韩在线观看| 免费在线观看精品| 欧洲一区二区av| 国产精品素人一区二区| 日本成人中文字幕在线视频| 色综合久久久久久久| 久久婷婷综合激情| 日本免费新一区视频| 日本精品裸体写真集在线观看| 国产日韩欧美在线一区| 美女视频一区在线观看| 在线中文字幕一区二区| 国产精品乱码一区二区三区软件 | 欧美在线短视频| 中文字幕乱码亚洲精品一区| 蜜乳av一区二区| 欧美主播一区二区三区| 亚洲欧美在线观看| 国产成人av电影在线| 日韩欧美另类在线| 日韩精品亚洲专区| 欧美年轻男男videosbes| 亚洲综合一二区| 99re视频这里只有精品| 日本一区二区动态图| 国产在线精品免费| 欧美精品一区二区精品网| 日韩国产精品大片| 欧美一级一级性生活免费录像| 亚洲专区一二三| 色综合中文综合网| 国产午夜精品一区二区三区嫩草| 日韩和欧美一区二区| 欧美女孩性生活视频| 亚洲高清久久久| 欧美性色欧美a在线播放| 一区二区成人在线| 欧美性极品少妇| 五月天国产精品| 91精品国产综合久久精品| 日本成人超碰在线观看| 日韩一区二区中文字幕| 免费人成黄页网站在线一区二区| 在线不卡免费欧美| 老司机精品视频线观看86| 欧美成人艳星乳罩| 国产美女在线观看一区| 国产亚洲视频系列| 成人免费视频一区二区| 亚洲欧美怡红院| 在线观看不卡一区| 日韩av电影免费观看高清完整版在线观看| 在线播放中文一区| 久久精品国产77777蜜臀| 亚洲精品一区二区三区福利| 国产一区二区不卡老阿姨| 亚洲国产岛国毛片在线| av爱爱亚洲一区| 亚洲线精品一区二区三区| 91精品国产综合久久久久| 精品夜夜嗨av一区二区三区| 久久亚洲精华国产精华液| av在线不卡免费看| 亚洲午夜激情av| www国产精品av| av影院午夜一区| 亚洲第一激情av| 久久综合久久综合九色| 99综合电影在线视频| 偷拍亚洲欧洲综合| 国产欧美精品在线观看| 欧美影院一区二区三区| 精品中文av资源站在线观看| 国产精品国产三级国产三级人妇|