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

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

?? namei.c

?? 內核是系統的心臟
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 *  linux/fs/sysv/namei.c
 *
 *  minix/namei.c
 *  Copyright (C) 1991, 1992  Linus Torvalds
 *
 *  coh/namei.c
 *  Copyright (C) 1993  Pascal Haible, Bruno Haible
 *
 *  sysv/namei.c
 *  Copyright (C) 1993  Bruno Haible
 */

#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/sysv_fs.h>
#include <linux/string.h>
#include <linux/stat.h>
#include <linux/errno.h>

/* compare strings: name[0..len-1] (not zero-terminated) and
 * buffer[0..] (filled with zeroes up to buffer[0..maxlen-1])
 */
static inline int namecompare(int len, int maxlen,
	const char * name, const char * buffer)
{
	if (len >= maxlen || !buffer[len]) {
		unsigned char same;
		__asm__("repe ; cmpsb ; setz %0"
			:"=q" (same)
			:"S" ((long) name),"D" ((long) buffer),"c" (len)
			:"cx","di","si");
		return same;
	}
	/* if (len<maxlen && buffer[len]) then buffer is longer than name */
	return 0;
}

/*
 * ok, we cannot use strncmp, as the name is not in our data space. [Now it is!]
 * Thus we'll have to use sysv_match. No big problem. Match also makes
 * some sanity tests.
 *
 * NOTE! unlike strncmp, sysv_match returns 1 for success, 0 for failure.
 */
static int sysv_match(int len, const char * name, struct sysv_dir_entry * de)
{
	if (!de->inode || len > SYSV_NAMELEN)
		return 0;
	/* "" means "." ---> so paths like "/usr/lib//libc.a" work */
	if (!len && (de->name[0]=='.') && (de->name[1]=='\0'))
		return 1;
	return namecompare(len,SYSV_NAMELEN,name,de->name);
}

/*
 *	sysv_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.
 */
static struct buffer_head * sysv_find_entry(struct inode * dir,
	const char * name, int namelen, struct sysv_dir_entry ** res_dir)
{
	struct super_block * sb;
	unsigned long pos, block, offset; /* pos = block * block_size + offset */
	struct buffer_head * bh;
	char * bh_data;

	*res_dir = NULL;
	if (!dir)
		return NULL;
	sb = dir->i_sb;
	if (namelen > SYSV_NAMELEN)
		if (sb->sv_truncate)
			namelen = SYSV_NAMELEN;
		else
			return NULL;
	bh = NULL;
	pos = block = offset = 0;
	while (pos < dir->i_size) {
		if (!bh) {
			bh = sysv_file_bread(dir,block,0,&bh_data);
			if (!bh) {
				/* offset = 0; */ block++;
				pos += sb->sv_block_size;
				continue;
			}
		}
		if (sysv_match(namelen, name,
			       *res_dir = (struct sysv_dir_entry *) (bh_data + offset) ))
			return bh;
		pos += SYSV_DIRSIZE;
		offset += SYSV_DIRSIZE;
		if (offset < sb->sv_block_size)
			continue;
		brelse(bh);
		bh = NULL;
		offset = 0; block++;
	}
	brelse(bh);
	*res_dir = NULL;
	return NULL;
}

int sysv_lookup(struct inode * dir,const char * name, int len,
	struct inode ** result)
{
	int ino;
	struct sysv_dir_entry * de;
	struct buffer_head * bh;

	*result = NULL;
	if (!dir)
		return -ENOENT;
	if (!S_ISDIR(dir->i_mode)) {
		iput(dir);
		return -ENOENT;
	}
	if (!(bh = sysv_find_entry(dir,name,len,&de))) {
		iput(dir);
		return -ENOENT;
	}
	ino = de->inode;
	brelse(bh);
	if (!(*result = iget(dir->i_sb,ino))) {
		iput(dir);
		return -EACCES;
	}
	iput(dir);
	return 0;
}

/*
 *	sysv_add_entry()
 *
 * adds a file entry to the specified directory, returning a possible
 * error value if it fails.
 *
 * 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 int sysv_add_entry(struct inode * dir,
	const char * name, int namelen,
	struct buffer_head ** res_buf,
	struct sysv_dir_entry ** res_dir)
{
	struct super_block * sb;
	int i;
	unsigned long pos, block, offset; /* pos = block * block_size + offset */
	struct buffer_head * bh;
	char * bh_data;
	struct sysv_dir_entry * de;

	*res_buf = NULL;
	*res_dir = NULL;
	if (!dir)
		return -ENOENT;
	sb = dir->i_sb;
	if (namelen > SYSV_NAMELEN)
		if (sb->sv_truncate)
			namelen = SYSV_NAMELEN;
		else
			return -ENAMETOOLONG;
	if (!namelen)
		return -ENOENT;
	bh = NULL;
	pos = block = offset = 0;
	while (1) {
		if (!bh) {
			bh = sysv_file_bread(dir,block,1,&bh_data);
			if (!bh)
				return -ENOSPC;
		}
		de = (struct sysv_dir_entry *) (bh_data + offset);
		pos += SYSV_DIRSIZE;
		offset += SYSV_DIRSIZE;
		if (pos > dir->i_size) {
			de->inode = 0;
			dir->i_size = pos;
			dir->i_dirt = 1;
		}
		if (de->inode) {
			if (namecompare(namelen, SYSV_NAMELEN, name, de->name)) {
				brelse(bh);
				return -EEXIST;
			}
		} else {
			dir->i_mtime = dir->i_ctime = CURRENT_TIME;
			for (i = 0; i < SYSV_NAMELEN ; i++)
				de->name[i] = (i < namelen) ? name[i] : 0;
			bh->b_dirt = 1;
			*res_dir = de;
			break;
		}
		if (offset < sb->sv_block_size)
			continue;
		brelse(bh);
		bh = NULL;
		offset = 0; block++;
	}
	*res_buf = bh;
	return 0;
}

int sysv_create(struct inode * dir,const char * name, int len, int mode,
	struct inode ** result)
{
	int error;
	struct inode * inode;
	struct buffer_head * bh;
	struct sysv_dir_entry * de;

	*result = NULL;
	if (!dir)
		return -ENOENT;
	inode = sysv_new_inode(dir);
	if (!inode) {
		iput(dir);
		return -ENOSPC;
	}
	if (inode->i_sb->sv_block_size_ratio_bits == 0) /* block_size == BLOCK_SIZE ? */
		inode->i_op = &sysv_file_inode_operations_with_bmap;
	else
		inode->i_op = &sysv_file_inode_operations;
	inode->i_mode = mode;
	inode->i_dirt = 1;
	error = sysv_add_entry(dir,name,len, &bh ,&de);
	if (error) {
		inode->i_nlink--;
		inode->i_dirt = 1;
		iput(inode);
		iput(dir);
		return error;
	}
	de->inode = inode->i_ino;
	bh->b_dirt = 1;
	brelse(bh);
	iput(dir);
	*result = inode;
	return 0;
}

int sysv_mknod(struct inode * dir, const char * name, int len, int mode, int rdev)
{
	int error;
	struct inode * inode;
	struct buffer_head * bh;
	struct sysv_dir_entry * de;

	if (!dir)
		return -ENOENT;
	bh = sysv_find_entry(dir,name,len,&de);
	if (bh) {
		brelse(bh);
		iput(dir);
		return -EEXIST;
	}
	inode = sysv_new_inode(dir);
	if (!inode) {
		iput(dir);
		return -ENOSPC;
	}
	inode->i_uid = current->euid;
	inode->i_mode = mode;
	inode->i_op = NULL;
	if (S_ISREG(inode->i_mode))
		if (inode->i_sb->sv_block_size_ratio_bits == 0) /* block_size == BLOCK_SIZE ? */
			inode->i_op = &sysv_file_inode_operations_with_bmap;
		else
			inode->i_op = &sysv_file_inode_operations;
	else if (S_ISDIR(inode->i_mode)) {
		inode->i_op = &sysv_dir_inode_operations;
		if (dir->i_mode & S_ISGID)
			inode->i_mode |= S_ISGID;
	}
	else if (S_ISLNK(inode->i_mode))
		inode->i_op = &sysv_symlink_inode_operations;
	else if (S_ISCHR(inode->i_mode))
		inode->i_op = &chrdev_inode_operations;
	else if (S_ISBLK(inode->i_mode))
		inode->i_op = &blkdev_inode_operations;
	else if (S_ISFIFO(inode->i_mode))
		init_fifo(inode);
	if (S_ISBLK(mode) || S_ISCHR(mode))
		inode->i_rdev = rdev;
	inode->i_dirt = 1;
	error = sysv_add_entry(dir, name, len, &bh, &de);
	if (error) {
		inode->i_nlink--;
		inode->i_dirt = 1;
		iput(inode);
		iput(dir);
		return error;
	}
	de->inode = inode->i_ino;
	bh->b_dirt = 1;
	brelse(bh);
	iput(dir);
	iput(inode);
	return 0;
}

int sysv_mkdir(struct inode * dir, const char * name, int len, int mode)
{
	int error;
	struct inode * inode;
	struct buffer_head * bh, *dir_block;
	char * bh_data;
	struct sysv_dir_entry * de;

	if (!dir) {
		iput(dir);
		return -EINVAL;
	}
	bh = sysv_find_entry(dir,name,len,&de);
	if (bh) {
		brelse(bh);
		iput(dir);
		return -EEXIST;
	}
	if (dir->i_nlink >= dir->i_sb->sv_link_max) {
		iput(dir);
		return -EMLINK;
	}
	inode = sysv_new_inode(dir);
	if (!inode) {
		iput(dir);
		return -ENOSPC;
	}
	inode->i_op = &sysv_dir_inode_operations;
	inode->i_size = 2 * SYSV_DIRSIZE;
	dir_block = sysv_file_bread(inode,0,1,&bh_data);
	if (!dir_block) {
		iput(dir);
		inode->i_nlink--;
		inode->i_dirt = 1;
		iput(inode);
		return -ENOSPC;
	}
	de = (struct sysv_dir_entry *) (bh_data + 0*SYSV_DIRSIZE);
	de->inode = inode->i_ino;
	strcpy(de->name,"."); /* rest of de->name is zero, see sysv_new_block */
	de = (struct sysv_dir_entry *) (bh_data + 1*SYSV_DIRSIZE);
	de->inode = dir->i_ino;
	strcpy(de->name,".."); /* rest of de->name is zero, see sysv_new_block */
	inode->i_nlink = 2;
	dir_block->b_dirt = 1;
	brelse(dir_block);
	inode->i_mode = S_IFDIR | (mode & 0777 & ~current->umask);
	if (dir->i_mode & S_ISGID)
		inode->i_mode |= S_ISGID;
	inode->i_dirt = 1;
	error = sysv_add_entry(dir, name, len, &bh, &de);
	if (error) {
		iput(dir);
		inode->i_nlink=0;
		iput(inode);
		return error;
	}
	de->inode = inode->i_ino;
	bh->b_dirt = 1;
	dir->i_nlink++;
	dir->i_dirt = 1;
	iput(dir);
	iput(inode);
	brelse(bh);
	return 0;
}

/*
 * routine to check that the specified directory is empty (for rmdir)
 */
static int empty_dir(struct inode * inode)
{
	struct super_block * sb;
	unsigned long pos, block, offset; /* pos = block * block_size + offset */
	struct buffer_head * bh;
	char * bh_data;
	struct sysv_dir_entry * de;

	if (!inode)
		return 1;
	block = 0;
	bh = NULL;
	pos = offset = 2*SYSV_DIRSIZE;
	if (inode->i_size % SYSV_DIRSIZE)
		goto bad_dir;
	if (inode->i_size < pos)
		goto bad_dir;
	bh = sysv_file_bread(inode,0,0,&bh_data);
	if (!bh)
		goto bad_dir;
	de = (struct sysv_dir_entry *) (bh_data + 0*SYSV_DIRSIZE);
	if (!de->inode || strcmp(de->name,"."))
		goto bad_dir;
	de = (struct sysv_dir_entry *) (bh_data + 1*SYSV_DIRSIZE);
	if (!de->inode || strcmp(de->name,".."))
		goto bad_dir;
	sb = inode->i_sb;
	while (pos < inode->i_size) {
		if (!bh) {
			bh = sysv_file_bread(inode,block,0,&bh_data);
			if (!bh) {
				/* offset = 0; */ block++;
				pos += sb->sv_block_size;
				continue;
			}
		}
		de = (struct sysv_dir_entry *) (bh_data + offset);
		pos += SYSV_DIRSIZE;
		offset += SYSV_DIRSIZE;
		if (de->inode) {
			brelse(bh);
			return 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
五月天国产精品| 国产成人精品影院| 国产精品无人区| 欧美视频在线一区| 高清视频一区二区| 日韩av电影免费观看高清完整版在线观看 | 国产欧美一区二区精品婷婷| 国产婷婷一区二区| 欧美日韩精品福利| jlzzjlzz国产精品久久| 极品尤物av久久免费看| 午夜视频在线观看一区| 亚洲人123区| 国产精品你懂的在线欣赏| 精品久久久久久久久久久久久久久久久 | 国产欧美视频在线观看| 欧美美女直播网站| 91影视在线播放| 国产精品影视天天线| 日日欢夜夜爽一区| 亚洲一区二区视频在线| 日韩一区有码在线| 欧美国产日韩一二三区| 久久婷婷国产综合国色天香| 日韩视频免费直播| 欧美日韩高清影院| 色噜噜狠狠成人网p站| 99视频精品在线| 高清不卡在线观看av| 久久91精品国产91久久小草| 日韩精品每日更新| 丝袜美腿亚洲色图| 午夜私人影院久久久久| 偷拍自拍另类欧美| 午夜精品福利在线| 日韩精品1区2区3区| 婷婷成人综合网| 肉色丝袜一区二区| 美女一区二区三区在线观看| 蜜臀av国产精品久久久久 | 日韩高清国产一区在线| 午夜私人影院久久久久| 日韩精品亚洲一区| 蜜桃视频在线观看一区| 日韩福利电影在线| 蜜桃免费网站一区二区三区| 捆绑紧缚一区二区三区视频| 奇米精品一区二区三区在线观看一| 丝袜a∨在线一区二区三区不卡 | 国产成人在线视频网址| 国产成人精品影视| 91浏览器打开| 欧美伊人久久大香线蕉综合69| 91福利小视频| 欧美一区二区三区不卡| 26uuu色噜噜精品一区二区| 中文字幕欧美国产| 亚洲欧美aⅴ...| 亚洲午夜一区二区| 美女一区二区在线观看| 国产成人综合在线播放| 99精品一区二区| 69精品人人人人| 久久影院视频免费| 亚洲欧洲性图库| 亚洲国产欧美日韩另类综合| 日本不卡123| 不卡的av在线| 欧美另类变人与禽xxxxx| 欧美va亚洲va在线观看蝴蝶网| 日本一区二区高清| 亚洲国产三级在线| 国产精品影视在线观看| 在线免费观看一区| 欧美mv日韩mv国产网站| 亚洲人123区| 激情亚洲综合在线| 在线影视一区二区三区| 日韩欧美美女一区二区三区| 国产精品国产三级国产普通话三级| 亚洲一级电影视频| 国产精品亚洲成人| 欧美视频一区二区| 国产亚洲成年网址在线观看| 亚洲一区电影777| 国产精品综合一区二区三区| 在线观看不卡一区| www亚洲一区| 亚洲福利视频导航| 成人免费视频播放| 91麻豆精品国产91| 自拍av一区二区三区| 免费视频一区二区| 色av一区二区| 亚洲国产成人私人影院tom| 日本人妖一区二区| 99久久精品国产一区二区三区| 精品免费一区二区三区| 一区二区视频在线| 国产精品综合一区二区三区| 4438成人网| 亚洲综合一二三区| 国产成人精品免费| 欧美一区二区成人6969| 亚洲精品美腿丝袜| 国产91丝袜在线播放0| 91精品国产91久久综合桃花| 亚洲免费在线观看视频| 99综合电影在线视频| 精品三级在线看| 亚洲成人福利片| 99热这里都是精品| 国产亚洲欧美日韩在线一区| 蜜臀91精品一区二区三区| 国产伦精品一区二区三区免费 | 美女www一区二区| 欧美体内she精视频| 亚洲欧洲国产日韩| 成人午夜激情视频| 久久老女人爱爱| 久草精品在线观看| 日韩欧美一区二区不卡| 日韩国产欧美在线视频| 欧美亚洲免费在线一区| 亚洲男女一区二区三区| 91视频免费观看| 亚洲视频狠狠干| 成人动漫一区二区三区| 欧美激情综合在线| 国产99精品视频| 国产精品久久久久影视| 成人av网站在线观看| 国产精品无圣光一区二区| 成人av电影在线网| 国产精品二三区| 一本大道久久a久久精品综合| 《视频一区视频二区| 91在线视频官网| 亚洲午夜精品17c| 欧美午夜电影网| 亚洲mv在线观看| 欧美一级日韩免费不卡| 另类小说图片综合网| 日韩亚洲欧美综合| 久久精品国产亚洲高清剧情介绍| 精品国产免费视频| 国产乱码精品一品二品| 国产精品美女久久久久aⅴ国产馆| 国产成人自拍网| 亚洲欧美日韩系列| 欧美日韩久久久| 蜜桃视频在线观看一区| 久久精品视频在线看| 成人app网站| 亚洲五码中文字幕| 日韩一区二区三| 国产成人精品一区二| 亚洲日本成人在线观看| 欧美三级视频在线播放| 日韩国产一二三区| 国产欧美一区在线| 在线中文字幕不卡| 奇米亚洲午夜久久精品| 中文字幕av一区二区三区免费看| 99久久婷婷国产综合精品| 亚洲高清免费视频| 2020国产成人综合网| 成人午夜视频在线观看| 亚洲综合成人网| 精品欧美乱码久久久久久1区2区| 在线精品亚洲一区二区不卡| 午夜av一区二区三区| 精品免费日韩av| 99riav久久精品riav| 天天色综合天天| 国产日韩在线不卡| 欧美丝袜丝交足nylons图片| 黑人巨大精品欧美一区| 亚洲免费观看高清完整版在线| 欧美一区二区视频在线观看| 波多野结衣视频一区| 三级久久三级久久| 国产精品九色蝌蚪自拍| 欧美一区二区三区精品| 色综合久久天天| 久久精品av麻豆的观看方式| 亚洲欧美日韩系列| 亚洲精品一区二区三区福利 | 色狠狠综合天天综合综合| 捆绑调教美女网站视频一区| 亚洲精品国久久99热| 精品久久久久一区| 欧美性大战久久| 成人av影院在线| 另类小说欧美激情| 亚洲一区二区三区中文字幕| 国产清纯白嫩初高生在线观看91 | 综合激情成人伊人| 精品日韩一区二区三区免费视频| 色哟哟日韩精品|