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

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

?? namei.c

?? 適合linux的新手使用,很經典,簡單,方便.
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* *  linux/fs/namei.c * *  (C) 1991  Linus Torvalds *//* * Some corrections by tytso. */#include <linux/sched.h>#include <linux/kernel.h>#include <asm/segment.h>#include <string.h>#include <fcntl.h>#include <errno.h>#include <const.h>#include <sys/stat.h>#define ACC_MODE(x) ("\004\002\006\377"[(x)&O_ACCMODE])/* * comment out this line if you want names > NAME_LEN chars to be * truncated. Else they will be disallowed. *//* #define NO_TRUNCATE */#define MAY_EXEC 1#define MAY_WRITE 2#define MAY_READ 4/* *	permission() * * is used to check for read/write/execute permissions on a file. * I don't know if we should look at just the euid or both euid and * uid, but that should be easily changed. */static int permission(struct m_inode * inode,int mask){	int mode = inode->i_mode;/* special case: not even root can read/write a deleted file */	if (inode->i_dev && !inode->i_nlinks)		return 0;	else if (current->euid==inode->i_uid)		mode >>= 6;	else if (current->egid==inode->i_gid)		mode >>= 3;	if (((mode & mask & 0007) == mask) || suser())		return 1;	return 0;}/* * ok, we cannot use strncmp, as the name is not in our data space. * Thus we'll have to use match. No big problem. Match also makes * some sanity tests. * * NOTE! unlike strncmp, match returns 1 for success, 0 for failure. */static int match(int len,const char * name,struct dir_entry * de){	register int same __asm__("ax");	if (!de || !de->inode || len > NAME_LEN)		return 0;	if (len < NAME_LEN && de->name[len])		return 0;	__asm__("cld\n\t"		"fs ; repe ; cmpsb\n\t"		"setz %%al"		:"=a" (same)		:"0" (0),"S" ((long) name),"D" ((long) de->name),"c" (len)		:"cx","di","si");	return same;}/* *	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 a parameter - res_dir). It does NOT read the inode of the * entry - you'll have to do that yourself if you want to. * * This also takes care of the few special cases due to '..'-traversal * over a pseudo-root and a mount point. */static struct buffer_head * find_entry(struct m_inode ** dir,	const char * name, int namelen, struct dir_entry ** res_dir){	int entries;	int block,i;	struct buffer_head * bh;	struct dir_entry * de;	struct super_block * sb;#ifdef NO_TRUNCATE	if (namelen > NAME_LEN)		return NULL;#else	if (namelen > NAME_LEN)		namelen = NAME_LEN;#endif	entries = (*dir)->i_size / (sizeof (struct dir_entry));	*res_dir = NULL;	if (!namelen)		return NULL;/* check for '..', as we might have to do some "magic" for it */	if (namelen==2 && get_fs_byte(name)=='.' && get_fs_byte(name+1)=='.') {/* '..' in a pseudo-root results in a faked '.' (just change namelen) */		if ((*dir) == current->root)			namelen=1;		else if ((*dir)->i_num == ROOT_INO) {/* '..' over a mount-point results in 'dir' being exchanged for the mounted   directory-inode. NOTE! We set mounted, so that we can iput the new dir */			sb=get_super((*dir)->i_dev);			if (sb->s_imount) {				iput(*dir);				(*dir)=sb->s_imount;				(*dir)->i_count++;			}		}	}	if (!(block = (*dir)->i_zone[0]))		return NULL;	if (!(bh = bread((*dir)->i_dev,block)))		return NULL;	i = 0;	de = (struct dir_entry *) bh->b_data;	while (i < entries) {		if ((char *)de >= BLOCK_SIZE+bh->b_data) {			brelse(bh);			bh = NULL;			if (!(block = bmap(*dir,i/DIR_ENTRIES_PER_BLOCK)) ||			    !(bh = bread((*dir)->i_dev,block))) {				i += DIR_ENTRIES_PER_BLOCK;				continue;			}			de = (struct dir_entry *) bh->b_data;		}		if (match(namelen,name,de)) {			*res_dir = de;			return bh;		}		de++;		i++;	}	brelse(bh);	return NULL;}/* *	add_entry() * * adds a file entry to the specified directory, using the same * semantics as find_entry(). It returns NULL if it failed. * * NOTE!! The inode part of 'de' is left at 0 - which means you * may not sleep between calling this and putting something into * the entry, as someone else might have used it while you slept. */static struct buffer_head * add_entry(struct m_inode * dir,	const char * name, int namelen, struct dir_entry ** res_dir){	int block,i;	struct buffer_head * bh;	struct dir_entry * de;	*res_dir = NULL;#ifdef NO_TRUNCATE	if (namelen > NAME_LEN)		return NULL;#else	if (namelen > NAME_LEN)		namelen = NAME_LEN;#endif	if (!namelen)		return NULL;	if (!(block = dir->i_zone[0]))		return NULL;	if (!(bh = bread(dir->i_dev,block)))		return NULL;	i = 0;	de = (struct dir_entry *) bh->b_data;	while (1) {		if ((char *)de >= BLOCK_SIZE+bh->b_data) {			brelse(bh);			bh = NULL;			block = create_block(dir,i/DIR_ENTRIES_PER_BLOCK);			if (!block)				return NULL;			if (!(bh = bread(dir->i_dev,block))) {				i += DIR_ENTRIES_PER_BLOCK;				continue;			}			de = (struct dir_entry *) bh->b_data;		}		if (i*sizeof(struct dir_entry) >= dir->i_size) {			de->inode=0;			dir->i_size = (i+1)*sizeof(struct dir_entry);			dir->i_dirt = 1;			dir->i_ctime = CURRENT_TIME;		}		if (!de->inode) {			dir->i_mtime = CURRENT_TIME;			for (i=0; i < NAME_LEN ; i++)				de->name[i]=(i<namelen)?get_fs_byte(name+i):0;			bh->b_dirt = 1;			*res_dir = de;			return bh;		}		de++;		i++;	}	brelse(bh);	return NULL;}/* *	get_dir() * * Getdir traverses the pathname until it hits the topmost directory. * It returns NULL on failure. */static struct m_inode * get_dir(const char * pathname){	char c;	const char * thisname;	struct m_inode * inode;	struct buffer_head * bh;	int namelen,inr,idev;	struct dir_entry * de;	if (!current->root || !current->root->i_count)		panic("No root inode");	if (!current->pwd || !current->pwd->i_count)		panic("No cwd inode");	if ((c=get_fs_byte(pathname))=='/') {		inode = current->root;		pathname++;	} else if (c)		inode = current->pwd;	else		return NULL;	/* empty name is bad */	inode->i_count++;	while (1) {		thisname = pathname;		if (!S_ISDIR(inode->i_mode) || !permission(inode,MAY_EXEC)) {			iput(inode);			return NULL;		}		for(namelen=0;(c=get_fs_byte(pathname++))&&(c!='/');namelen++)			/* nothing */ ;		if (!c)			return inode;		if (!(bh = find_entry(&inode,thisname,namelen,&de))) {			iput(inode);			return NULL;		}		inr = de->inode;		idev = inode->i_dev;		brelse(bh);		iput(inode);		if (!(inode = iget(idev,inr)))			return NULL;	}}/* *	dir_namei() * * dir_namei() returns the inode of the directory of the * specified name, and the name within that directory. */static struct m_inode * dir_namei(const char * pathname,	int * namelen, const char ** name){	char c;	const char * basename;	struct m_inode * dir;	if (!(dir = get_dir(pathname)))		return NULL;	basename = pathname;	while (c=get_fs_byte(pathname++))		if (c=='/')			basename=pathname;	*namelen = pathname-basename-1;	*name = basename;	return dir;}/* *	namei() * * is used by most simple commands to get the inode of a specified name. * Open, link etc use their own routines, but this is enough for things * like 'chmod' etc. */struct m_inode * namei(const char * pathname){	const char * basename;	int inr,dev,namelen;	struct m_inode * dir;	struct buffer_head * bh;	struct dir_entry * de;	if (!(dir = dir_namei(pathname,&namelen,&basename)))		return NULL;	if (!namelen)			/* special case: '/usr/' etc */		return dir;	bh = find_entry(&dir,basename,namelen,&de);	if (!bh) {		iput(dir);		return NULL;	}	inr = de->inode;	dev = dir->i_dev;	brelse(bh);	iput(dir);	dir=iget(dev,inr);	if (dir) {		dir->i_atime=CURRENT_TIME;		dir->i_dirt=1;	}	return dir;}/* *	open_namei() * * namei for open - this is in fact almost the whole open-routine. */int open_namei(const char * pathname, int flag, int mode,	struct m_inode ** res_inode){	const char * basename;	int inr,dev,namelen;	struct m_inode * dir, *inode;	struct buffer_head * bh;	struct dir_entry * de;	if ((flag & O_TRUNC) && !(flag & O_ACCMODE))		flag |= O_WRONLY;	mode &= 0777 & ~current->umask;	mode |= I_REGULAR;	if (!(dir = dir_namei(pathname,&namelen,&basename)))		return -ENOENT;	if (!namelen) {			/* special case: '/usr/' etc */		if (!(flag & (O_ACCMODE|O_CREAT|O_TRUNC))) {			*res_inode=dir;			return 0;		}		iput(dir);		return -EISDIR;	}	bh = find_entry(&dir,basename,namelen,&de);	if (!bh) {		if (!(flag & O_CREAT)) {			iput(dir);			return -ENOENT;		}		if (!permission(dir,MAY_WRITE)) {			iput(dir);			return -EACCES;		}		inode = new_inode(dir->i_dev);		if (!inode) {			iput(dir);			return -ENOSPC;		}		inode->i_uid = current->euid;		inode->i_mode = mode;		inode->i_dirt = 1;		bh = add_entry(dir,basename,namelen,&de);		if (!bh) {			inode->i_nlinks--;			iput(inode);			iput(dir);			return -ENOSPC;		}		de->inode = inode->i_num;		bh->b_dirt = 1;		brelse(bh);		iput(dir);		*res_inode = inode;		return 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
972aa.com艺术欧美| 激情国产一区二区 | 91麻豆蜜桃一区二区三区| 国产亚洲综合色| 成a人片亚洲日本久久| 中文字幕免费观看一区| 在线精品视频一区二区三四| 日本v片在线高清不卡在线观看| 亚洲国产乱码最新视频| 日韩一区二区三区四区五区六区| 亚洲va欧美va国产va天堂影院| 欧美亚洲愉拍一区二区| 美女爽到高潮91| 中文字幕一区二区三区不卡| 欧美中文字幕不卡| 国产精品88888| 亚洲大片精品永久免费| 中文字幕乱码亚洲精品一区| 欧美亚洲丝袜传媒另类| 国产a区久久久| 五月天久久比比资源色| 国产精品免费视频观看| 欧美日韩另类一区| 成人av电影免费观看| 精品一区二区在线视频| 亚洲一区在线播放| 国产精品视频一二三区 | 国产精品亚洲综合一区在线观看| 一区二区三区精品在线观看| 国产亚洲欧美色| 精品国产乱码久久| 91精品国产综合久久久久久久久久| 国产精品亚洲视频| 国产在线不卡一卡二卡三卡四卡| 亚洲成人精品一区| 亚洲午夜一二三区视频| 1区2区3区精品视频| 国产精品毛片无遮挡高清| 久久精品夜夜夜夜久久| 欧美激情综合在线| 国产精品久久久久9999吃药| 亚洲人亚洲人成电影网站色| 亚洲天堂中文字幕| 亚洲国产精品久久艾草纯爱| 午夜精品123| 国产在线精品视频| 在线不卡的av| 亚洲一本大道在线| 日韩高清国产一区在线| 国产一区二区三区精品视频| av动漫一区二区| 欧美一区二区三区视频免费播放 | 欧美日韩第一区日日骚| 日韩你懂的在线播放| 国产精品国产馆在线真实露脸 | 亚洲综合一区在线| 久久精品国内一区二区三区| 粉嫩欧美一区二区三区高清影视| 一本色道综合亚洲| 国产丝袜欧美中文另类| 亚洲午夜久久久| 99久久伊人精品| 精品区一区二区| 一片黄亚洲嫩模| 成人av网址在线观看| 久久精品欧美一区二区三区不卡 | 国产精品美女久久久久久久久| 欧美国产综合一区二区| 中文字幕日韩一区| 成人手机电影网| 精品国产精品一区二区夜夜嗨| 国产精品激情偷乱一区二区∴| 丝袜美腿高跟呻吟高潮一区| 色综合久久88色综合天天6| 欧美国产欧美综合| 国产河南妇女毛片精品久久久 | 欧美视频三区在线播放| 中文字幕高清一区| 精品一区二区三区视频在线观看| 91精品国产综合久久久久| 午夜精品视频在线观看| 91精品国产乱码久久蜜臀| 免费人成网站在线观看欧美高清| 91精品久久久久久久99蜜桃| 奇米888四色在线精品| 欧美不卡一区二区三区四区| 久久国产视频网| 国产精品欧美一区喷水| 色999日韩国产欧美一区二区| 综合电影一区二区三区| 欧美视频在线观看一区| 久久精品99久久久| 日韩一区中文字幕| 制服丝袜中文字幕一区| 成人免费高清视频| 日本午夜精品视频在线观看| 亚洲精品一区二区三区影院| 国产伦精一区二区三区| 亚洲第四色夜色| 国产精品不卡在线| 7777精品伊人久久久大香线蕉的 | 成人美女视频在线观看| 亚洲综合久久久久| 国产精品久久久久一区二区三区 | 欧美电影在线免费观看| 成人av电影观看| 国产成人精品影视| 日日摸夜夜添夜夜添国产精品| 中文字幕不卡三区| 国产色婷婷亚洲99精品小说| 午夜视频在线观看一区| 国产视频一区二区在线观看| 久久久久久久综合狠狠综合| 欧美一区二区精品在线| 色婷婷综合视频在线观看| 成人午夜激情影院| 国产精品99久久久久| 老司机午夜精品| 麻豆一区二区在线| 美腿丝袜一区二区三区| 狠狠色丁香婷综合久久| 五月激情综合网| 麻豆91精品视频| 激情欧美日韩一区二区| 国产乱子伦一区二区三区国色天香| 日韩精品色哟哟| 蜜臀国产一区二区三区在线播放| 美女网站视频久久| 国产乱国产乱300精品| 成人小视频在线| 91麻豆视频网站| 欧美一级黄色片| 久久久久久久久岛国免费| 国产精品伦一区| 天天色 色综合| 成人激情文学综合网| 99精品偷自拍| 欧美乱妇一区二区三区不卡视频| 在线综合+亚洲+欧美中文字幕| 久久久久国产精品麻豆ai换脸| 国产精品国模大尺度视频| 日日摸夜夜添夜夜添国产精品| 国产一区二区三区香蕉| 欧美日韩精品一区二区三区蜜桃| 国产三级精品视频| 亚洲综合色丁香婷婷六月图片| 国内精品久久久久影院一蜜桃| 99re亚洲国产精品| 亚洲精品在线免费观看视频| 一区二区三区不卡视频| 成人精品视频一区二区三区| 久久综合色婷婷| 欧美韩日一区二区三区| 欧美熟乱第一页| 精品国产精品网麻豆系列| 亚洲国产成人av网| 91美女精品福利| 亚洲欧美日韩精品久久久久| 国内精品免费**视频| 91精品国产欧美一区二区18| 一级精品视频在线观看宜春院| 99久久婷婷国产综合精品| 日本一区二区三级电影在线观看 | 中文字幕一区二区三区四区不卡| 国内成人精品2018免费看| 婷婷综合五月天| 欧美视频在线不卡| 肉肉av福利一精品导航| 91精品国产综合久久久久久久久久| 中文字幕日本乱码精品影院| 色爱区综合激月婷婷| 亚洲一二三区视频在线观看| 欧美亚男人的天堂| 裸体一区二区三区| 中文字幕av一区 二区| 99re6这里只有精品视频在线观看| 中文字幕一区二区三区不卡在线| 91在线视频免费观看| 日韩和欧美的一区| 精品久久久久久综合日本欧美| 国产jizzjizz一区二区| 亚洲第一搞黄网站| 日本一区二区三区四区在线视频 | 成人av先锋影音| 日韩**一区毛片| 亚洲欧洲制服丝袜| 精品国产欧美一区二区| 欧美色图在线观看| 国产精品一二一区| 美女诱惑一区二区| 亚洲第一电影网| 亚洲中国最大av网站| 91精品国产日韩91久久久久久| 免费黄网站欧美| 香蕉影视欧美成人| 亚洲男人天堂一区| 欧美国产在线观看| 亚洲国产精品av| 精品久久久久久亚洲综合网| 欧美日韩视频在线第一区|