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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? namei.c

?? LINUX1.0源代碼,代碼條理清晰
?? 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;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产高清不卡二三区| 2017欧美狠狠色| 国产ts人妖一区二区| 亚洲超丰满肉感bbw| 欧美日韩三级视频| 欧美国产一区在线| 裸体一区二区三区| 亚洲国产一区视频| 国产精品美女久久久久久久久| 91精品国模一区二区三区| 欧美三级三级三级| 欧美伦理电影网| 欧美日韩另类一区| 在线免费视频一区二区| 欧美丰满少妇xxxxx高潮对白 | 天天免费综合色| 亚洲欧美另类久久久精品| 亚洲亚洲人成综合网络| 亚洲一区二区三区美女| 夜夜嗨av一区二区三区| 欧美一卡二卡在线| 国产suv精品一区二区883| 韩国欧美国产1区| 国产成人日日夜夜| av在线不卡网| 欧美优质美女网站| 欧美精品视频www在线观看| 欧美日韩一区二区三区在线看| 青青青伊人色综合久久| 国产麻豆91精品| av影院午夜一区| 色综合激情五月| 日韩欧美国产三级电影视频| 日韩欧美视频一区| 久久婷婷综合激情| 久久先锋影音av鲁色资源网| 国产精品久久久久一区二区三区| 一区二区三区在线影院| 日韩精品久久久久久| 懂色av中文字幕一区二区三区| av动漫一区二区| 欧美日韩在线一区二区| 日韩av在线播放中文字幕| 91成人免费在线| 欧美猛男gaygay网站| 日韩一区二区中文字幕| 国产精品情趣视频| 亚洲福利视频三区| 国产一区二区三区在线看麻豆| 91亚洲国产成人精品一区二区三| 欧美男同性恋视频网站| 久久青草欧美一区二区三区| 亚洲欧美电影一区二区| 国产乱国产乱300精品| 色国产综合视频| 精品欧美乱码久久久久久1区2区| 精品视频999| 亚洲精品日产精品乱码不卡| 日韩和欧美的一区| 91女神在线视频| 欧美成人一区二区| 亚洲一区av在线| 91视频观看视频| 午夜精品在线看| 丰满少妇久久久久久久| 欧美色国产精品| 夜夜爽夜夜爽精品视频| 国产精品自拍av| 日韩三级在线观看| 日本高清不卡一区| 亚洲视频电影在线| 国产福利不卡视频| 精品久久人人做人人爽| 久久成人免费电影| 91精品国产综合久久精品性色| 中文字幕日本不卡| 日本亚洲电影天堂| 日韩免费观看高清完整版在线观看 | 亚洲最大的成人av| 成人黄动漫网站免费app| 精品欧美一区二区在线观看| 91农村精品一区二区在线| 青草国产精品久久久久久| 91麻豆国产福利在线观看| 欧美一区二区三区免费大片| 日韩精品一卡二卡三卡四卡无卡 | 欧美精品一区二区在线观看| 国产精品国产精品国产专区不蜜| 久久成人久久爱| 欧美成va人片在线观看| 日本怡春院一区二区| 日韩三级视频在线观看| 免费观看成人av| 日韩女优制服丝袜电影| 国产麻豆精品95视频| 久久综合999| 国产丶欧美丶日本不卡视频| 久久夜色精品国产欧美乱极品| 成人一区二区三区中文字幕| 久久综合国产精品| 成人丝袜高跟foot| 久久久久久黄色| 亚洲综合一区二区精品导航| 夜夜精品浪潮av一区二区三区| 国产黑丝在线一区二区三区| 久久久久久久久久电影| 日本视频一区二区三区| 日韩欧美亚洲国产另类| 日韩黄色一级片| 久久综合色8888| av电影一区二区| 美日韩一区二区| 精品国产乱码久久久久久影片| 国产一区不卡在线| 久久精品男人天堂av| 在线亚洲精品福利网址导航| 午夜不卡av免费| 久久久精品人体av艺术| 欧美丝袜丝nylons| 国产主播一区二区三区| 中文字幕制服丝袜成人av | 国产精品女同一区二区三区| 色综合久久综合网97色综合| 亚洲欧美另类久久久精品| 欧美日韩成人在线| 国产精品一区专区| 亚洲图片欧美一区| 国产精品久久一卡二卡| 欧美人妖巨大在线| 国产精品99久| 国产精品国产三级国产普通话99| 日韩欧美在线一区二区三区| av亚洲精华国产精华精华 | 欧美激情一区三区| 欧美日本一道本| 国产99久久精品| 日韩理论电影院| 精品国产乱码久久久久久夜甘婷婷| a在线播放不卡| 看电视剧不卡顿的网站| 一区二区三区精品| 亚洲激情一二三区| 综合在线观看色| 国产精品视频观看| 国产女人水真多18毛片18精品视频 | 在线观看亚洲精品视频| 暴力调教一区二区三区| 国产成人精品三级| 国产精品88av| 国产999精品久久| 国产盗摄一区二区三区| 国产精品一区在线观看乱码| 国产精品99精品久久免费| 国产精品综合视频| 不卡的av网站| 91网站最新地址| 91福利视频久久久久| 欧美怡红院视频| 欧美精品18+| 精品国产一区二区国模嫣然| 精品国产网站在线观看| 国产三级久久久| 国产精品久久午夜| 一区二区三区四区激情| 亚洲国产一区二区三区 | 亚洲特级片在线| 亚洲激情六月丁香| 亚洲一级电影视频| 亚洲成av人片在线观看无码| 蜜臀91精品一区二区三区| 久久电影网站中文字幕 | 蜜臀久久99精品久久久久宅男 | 亚洲成a人片在线不卡一二三区| 天天色 色综合| 国产一区二区伦理片| 91丨porny丨国产| 欧美日韩黄色影视| 精品99一区二区| 中文字幕一区二区三区色视频| 一区二区高清免费观看影视大全| 亚洲一区二区在线观看视频| 亚洲三级在线免费观看| 99r国产精品| av高清久久久| 欧美日韩极品在线观看一区| 日韩亚洲欧美综合| 国产精品久久久一本精品| 一区二区三区精品在线| 久久国产精品区| 色呦呦网站一区| 日韩欧美一区在线观看| 亚洲欧美中日韩| 九色综合狠狠综合久久| 色婷婷综合五月| 久久综合资源网| 午夜免费久久看| 91网站黄www| 久久久久亚洲综合| 亚洲综合激情小说| 国产成人av电影在线观看|