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

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

?? dir.c

?? linux環(huán)境下基于FAT的文件系統(tǒng)的通用代碼
?? C
?? 第 1 頁 / 共 3 頁
字號(hào):
EXPORT_SYMBOL_GPL(fat_search_long);struct fat_ioctl_filldir_callback {	void __user *dirent;	int result;	/* for dir ioctl */	const char *longname;	int long_len;	const char *shortname;	int short_len;};static int __fat_readdir(struct inode *inode, struct file *filp, void *dirent,			 filldir_t filldir, int short_only, int both){	struct super_block *sb = inode->i_sb;	struct msdos_sb_info *sbi = MSDOS_SB(sb);	struct buffer_head *bh;	struct msdos_dir_entry *de;	struct nls_table *nls_disk = sbi->nls_disk;	unsigned char nr_slots;	wchar_t bufuname[14];	wchar_t *unicode = NULL;	unsigned char c, work[MSDOS_NAME];	unsigned char bufname[FAT_MAX_SHORT_SIZE], *ptname = bufname;	unsigned short opt_shortname = sbi->options.shortname;	int isvfat = sbi->options.isvfat;	int nocase = sbi->options.nocase;	const char *fill_name = NULL;	unsigned long inum;	unsigned long lpos, dummy, *furrfu = &lpos;	loff_t cpos;	int chi, chl, i, i2, j, last, last_u, dotoffset = 0, fill_len = 0;	int ret = 0;	lock_super(sb);	cpos = filp->f_pos;	/* Fake . and .. for the root directory. */	if (inode->i_ino == MSDOS_ROOT_INO) {		while (cpos < 2) {			if (filldir(dirent, "..", cpos+1, cpos, MSDOS_ROOT_INO, DT_DIR) < 0)				goto out;			cpos++;			filp->f_pos++;		}		if (cpos == 2) {			dummy = 2;			furrfu = &dummy;			cpos = 0;		}	}	if (cpos & (sizeof(struct msdos_dir_entry) - 1)) {		ret = -ENOENT;		goto out;	}	bh = NULL;get_new:	if (fat_get_entry(inode, &cpos, &bh, &de) == -1)		goto end_of_dir;parse_record:	nr_slots = 0;	/*	 * Check for long filename entry, but if short_only, we don't	 * need to parse long filename.	 */	if (isvfat && !short_only) {		if (de->name[0] == DELETED_FLAG)			goto record_end;		if (de->attr != ATTR_EXT && (de->attr & ATTR_VOLUME))			goto record_end;		if (de->attr != ATTR_EXT && IS_FREE(de->name))			goto record_end;	} else {		if ((de->attr & ATTR_VOLUME) || IS_FREE(de->name))			goto record_end;	}	if (isvfat && de->attr == ATTR_EXT) {		int status = fat_parse_long(inode, &cpos, &bh, &de,					    &unicode, &nr_slots);		if (status < 0) {			filp->f_pos = cpos;			ret = status;			goto out;		} else if (status == PARSE_INVALID)			goto record_end;		else if (status == PARSE_NOT_LONGNAME)			goto parse_record;		else if (status == PARSE_EOF)			goto end_of_dir;		if (nr_slots) {			void *longname = unicode + FAT_MAX_UNI_CHARS;			int size = PATH_MAX - FAT_MAX_UNI_SIZE;			int len = fat_uni_to_x8(sbi, unicode, longname, size);			fill_name = longname;			fill_len = len;			/* !both && !short_only, so we don't need shortname. */			if (!both)				goto start_filldir;		}	}	if (sbi->options.dotsOK) {		ptname = bufname;		dotoffset = 0;		if (de->attr & ATTR_HIDDEN) {			*ptname++ = '.';			dotoffset = 1;		}	}	memcpy(work, de->name, sizeof(de->name));	/* see namei.c, msdos_format_name */	if (work[0] == 0x05)		work[0] = 0xE5;	for (i = 0, j = 0, last = 0, last_u = 0; i < 8;) {		if (!(c = work[i]))			break;		chl = fat_shortname2uni(nls_disk, &work[i], 8 - i,					&bufuname[j++], opt_shortname,					de->lcase & CASE_LOWER_BASE);		if (chl <= 1) {			ptname[i++] = (!nocase && c>='A' && c<='Z') ? c+32 : c;			if (c != ' ') {				last = i;				last_u = j;			}		} else {			last_u = j;			for (chi = 0; chi < chl && i < 8; chi++) {				ptname[i] = work[i];				i++; last = i;			}		}	}	i = last;	j = last_u;	fat_short2uni(nls_disk, ".", 1, &bufuname[j++]);	ptname[i++] = '.';	for (i2 = 8; i2 < MSDOS_NAME;) {		if (!(c = work[i2]))			break;		chl = fat_shortname2uni(nls_disk, &work[i2], MSDOS_NAME - i2,					&bufuname[j++], opt_shortname,					de->lcase & CASE_LOWER_EXT);		if (chl <= 1) {			i2++;			ptname[i++] = (!nocase && c>='A' && c<='Z') ? c+32 : c;			if (c != ' ') {				last = i;				last_u = j;			}		} else {			last_u = j;			for (chi = 0; chi < chl && i2 < MSDOS_NAME; chi++) {				ptname[i++] = work[i2++];				last = i;			}		}	}	if (!last)		goto record_end;	i = last + dotoffset;	j = last_u;	if (isvfat) {		bufuname[j] = 0x0000;		i = fat_uni_to_x8(sbi, bufuname, bufname, sizeof(bufname));	}	if (nr_slots) {		/* hack for fat_ioctl_filldir() */		struct fat_ioctl_filldir_callback *p = dirent;		p->longname = fill_name;		p->long_len = fill_len;		p->shortname = bufname;		p->short_len = i;		fill_name = NULL;		fill_len = 0;	} else {		fill_name = bufname;		fill_len = i;	}start_filldir:	lpos = cpos - (nr_slots + 1) * sizeof(struct msdos_dir_entry);	if (!memcmp(de->name, MSDOS_DOT, MSDOS_NAME))		inum = inode->i_ino;	else if (!memcmp(de->name, MSDOS_DOTDOT, MSDOS_NAME)) {		inum = parent_ino(filp->f_path.dentry);	} else {		loff_t i_pos = fat_make_i_pos(sb, bh, de);		struct inode *tmp = fat_iget(sb, i_pos);		if (tmp) {			inum = tmp->i_ino;			iput(tmp);		} else			inum = iunique(sb, MSDOS_ROOT_INO);	}	if (filldir(dirent, fill_name, fill_len, *furrfu, inum,		    (de->attr & ATTR_DIR) ? DT_DIR : DT_REG) < 0)		goto fill_failed;record_end:	furrfu = &lpos;	filp->f_pos = cpos;	goto get_new;end_of_dir:	filp->f_pos = cpos;fill_failed:	brelse(bh);	if (unicode)		__putname(unicode);out:	unlock_super(sb);	return ret;}static int fat_readdir(struct file *filp, void *dirent, filldir_t filldir){	struct inode *inode = filp->f_path.dentry->d_inode;	return __fat_readdir(inode, filp, dirent, filldir, 0, 0);}#define FAT_IOCTL_FILLDIR_FUNC(func, dirent_type)			   \static int func(void *__buf, const char *name, int name_len,		   \			     loff_t offset, u64 ino, unsigned int d_type)  \{									   \	struct fat_ioctl_filldir_callback *buf = __buf;			   \	struct dirent_type __user *d1 = buf->dirent;			   \	struct dirent_type __user *d2 = d1 + 1;				   \									   \	if (buf->result)						   \		return -EINVAL;						   \	buf->result++;							   \									   \	if (name != NULL) {						   \		/* dirent has only short name */			   \		if (name_len >= sizeof(d1->d_name))			   \			name_len = sizeof(d1->d_name) - 1;		   \									   \		if (put_user(0, d2->d_name)			||	   \		    put_user(0, &d2->d_reclen)			||	   \		    copy_to_user(d1->d_name, name, name_len)	||	   \		    put_user(0, d1->d_name + name_len)		||	   \		    put_user(name_len, &d1->d_reclen))			   \			goto efault;					   \	} else {							   \		/* dirent has short and long name */			   \		const char *longname = buf->longname;			   \		int long_len = buf->long_len;				   \		const char *shortname = buf->shortname;			   \		int short_len = buf->short_len;				   \									   \		if (long_len >= sizeof(d1->d_name))			   \			long_len = sizeof(d1->d_name) - 1;		   \		if (short_len >= sizeof(d1->d_name))			   \			short_len = sizeof(d1->d_name) - 1;		   \									   \		if (copy_to_user(d2->d_name, longname, long_len)	|| \		    put_user(0, d2->d_name + long_len)			|| \		    put_user(long_len, &d2->d_reclen)			|| \		    put_user(ino, &d2->d_ino)				|| \		    put_user(offset, &d2->d_off)			|| \		    copy_to_user(d1->d_name, shortname, short_len)	|| \		    put_user(0, d1->d_name + short_len)			|| \		    put_user(short_len, &d1->d_reclen))			   \			goto efault;					   \	}								   \	return 0;							   \efault:									   \	buf->result = -EFAULT;						   \	return -EFAULT;							   \}FAT_IOCTL_FILLDIR_FUNC(fat_ioctl_filldir, __fat_dirent)static int fat_ioctl_readdir(struct inode *inode, struct file *filp,			     void __user *dirent, filldir_t filldir,			     int short_only, int both){	struct fat_ioctl_filldir_callback buf;	int ret;	buf.dirent = dirent;	buf.result = 0;	mutex_lock(&inode->i_mutex);	ret = -ENOENT;	if (!IS_DEADDIR(inode)) {		ret = __fat_readdir(inode, filp, &buf, filldir,				    short_only, both);	}	mutex_unlock(&inode->i_mutex);	if (ret >= 0)		ret = buf.result;	return ret;}static int fat_dir_ioctl(struct inode *inode, struct file *filp,			 unsigned int cmd, unsigned long arg){	struct __fat_dirent __user *d1 = (struct __fat_dirent __user *)arg;	int short_only, both;	switch (cmd) {	case VFAT_IOCTL_READDIR_SHORT:		short_only = 1;		both = 0;		break;	case VFAT_IOCTL_READDIR_BOTH:		short_only = 0;		both = 1;		break;	default:		return fat_generic_ioctl(inode, filp, cmd, arg);	}	if (!access_ok(VERIFY_WRITE, d1, sizeof(struct __fat_dirent[2])))		return -EFAULT;	/*	 * Yes, we don't need this put_user() absolutely. However old	 * code didn't return the right value. So, app use this value,	 * in order to check whether it is EOF.	 */	if (put_user(0, &d1->d_reclen))		return -EFAULT;	return fat_ioctl_readdir(inode, filp, d1, fat_ioctl_filldir,				 short_only, both);}#ifdef CONFIG_COMPAT#define	VFAT_IOCTL_READDIR_BOTH32	_IOR('r', 1, struct compat_dirent[2])#define	VFAT_IOCTL_READDIR_SHORT32	_IOR('r', 2, struct compat_dirent[2])FAT_IOCTL_FILLDIR_FUNC(fat_compat_ioctl_filldir, compat_dirent)static long fat_compat_dir_ioctl(struct file *filp, unsigned cmd,				 unsigned long arg){	struct inode *inode = filp->f_path.dentry->d_inode;	struct compat_dirent __user *d1 = compat_ptr(arg);	int short_only, both;	switch (cmd) {	case VFAT_IOCTL_READDIR_SHORT32:		short_only = 1;		both = 0;		break;	case VFAT_IOCTL_READDIR_BOTH32:		short_only = 0;		both = 1;		break;	default:		return -ENOIOCTLCMD;	}	if (!access_ok(VERIFY_WRITE, d1, sizeof(struct compat_dirent[2])))		return -EFAULT;	/*	 * Yes, we don't need this put_user() absolutely. However old	 * code didn't return the right value. So, app use this value,	 * in order to check whether it is EOF.	 */	if (put_user(0, &d1->d_reclen))		return -EFAULT;	return fat_ioctl_readdir(inode, filp, d1, fat_compat_ioctl_filldir,				 short_only, both);}#endif /* CONFIG_COMPAT */const struct file_operations fat_dir_operations = {	.llseek		= generic_file_llseek,	.read		= generic_read_dir,	.readdir	= fat_readdir,	.ioctl		= fat_dir_ioctl,#ifdef CONFIG_COMPAT	.compat_ioctl	= fat_compat_dir_ioctl,#endif	.fsync		= file_fsync,};static int fat_get_short_entry(struct inode *dir, loff_t *pos,			       struct buffer_head **bh,			       struct msdos_dir_entry **de){	while (fat_get_entry(dir, pos, bh, de) >= 0) {		/* free entry or long name entry or volume label */		if (!IS_FREE((*de)->name) && !((*de)->attr & ATTR_VOLUME))			return 0;	}	return -ENOENT;}/* * The ".." entry can not provide the "struct fat_slot_info" informations * for inode. So, this function provide the some informations only. */int fat_get_dotdot_entry(struct inode *dir, struct buffer_head **bh,			 struct msdos_dir_entry **de, loff_t *i_pos){	loff_t offset;	offset = 0;	*bh = NULL;	while (fat_get_short_entry(dir, &offset, bh, de) >= 0) {		if (!strncmp((*de)->name, MSDOS_DOTDOT, MSDOS_NAME)) {			*i_pos = fat_make_i_pos(dir->i_sb, *bh, *de);			return 0;		}	}	return -ENOENT;}EXPORT_SYMBOL_GPL(fat_get_dotdot_entry);/* See if directory is empty */int fat_dir_empty(struct inode *dir){	struct buffer_head *bh;	struct msdos_dir_entry *de;	loff_t cpos;	int result = 0;	bh = NULL;	cpos = 0;	while (fat_get_short_entry(dir, &cpos, &bh, &de) >= 0) {		if (strncmp(de->name, MSDOS_DOT   , MSDOS_NAME) &&		    strncmp(de->name, MSDOS_DOTDOT, MSDOS_NAME)) {			result = -ENOTEMPTY;			break;		}	}	brelse(bh);	return result;}EXPORT_SYMBOL_GPL(fat_dir_empty);/* * fat_subdirs counts the number of sub-directories of dir. It can be run * on directories being created. */int fat_subdirs(struct inode *dir){	struct buffer_head *bh;	struct msdos_dir_entry *de;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩免费在线视频| 91福利国产成人精品照片| 国产精品成人一区二区三区夜夜夜| 99精品视频在线观看免费| 欧美激情综合五月色丁香小说| 97aⅴ精品视频一二三区| 亚洲成av人在线观看| 国产视频911| 欧美午夜一区二区三区免费大片| 精品一区二区三区免费视频| 国产色综合一区| 9191成人精品久久| 丁香婷婷综合五月| 免费人成精品欧美精品| 久久综合久久久久88| 欧美亚洲图片小说| 成人精品免费网站| 看电影不卡的网站| 一区二区日韩电影| 久久亚洲综合av| 欧美精品v国产精品v日韩精品| 高清国产一区二区| 天天综合日日夜夜精品| 亚洲色图20p| 中文字幕精品一区| 精品粉嫩超白一线天av| 欧美综合亚洲图片综合区| 国产精品99久久久| 毛片av一区二区| 亚洲国产精品一区二区久久恐怖片| 日韩欧美三级在线| 欧美三级三级三级爽爽爽| 成人性视频免费网站| 精品无码三级在线观看视频 | 亚洲精品在线电影| 91麻豆精品国产91久久久久久久久| 国产精品一卡二卡| 激情综合色综合久久综合| 婷婷国产在线综合| 精品福利在线导航| 欧美zozo另类异族| 日韩一级二级三级精品视频| 3d成人h动漫网站入口| 欧美性欧美巨大黑白大战| 99视频精品全部免费在线| 不卡的电视剧免费网站有什么| 国产成人在线电影| 国产在线国偷精品产拍免费yy| 日本欧美一区二区三区| 日韩av一区二区三区| 亚洲成人1区2区| 视频一区二区中文字幕| 亚洲人成在线播放网站岛国| 国产精品国模大尺度视频| 中文字幕一区二区三区四区 | 亚洲综合一区在线| 一区二区三区日韩精品| 五月激情综合网| 久久成人麻豆午夜电影| 国产在线观看一区二区| www.亚洲在线| 欧美日韩国产乱码电影| 日韩一区二区三区视频在线观看| 2021中文字幕一区亚洲| 综合久久综合久久| 首页国产欧美日韩丝袜| 国产在线看一区| 91视频免费看| 欧美一区二区在线不卡| 久久九九久久九九| 夜色激情一区二区| 久久99日本精品| www.亚洲色图| 欧美另类videos死尸| 久久亚区不卡日本| 亚洲精品成人悠悠色影视| 亚洲大片免费看| 国产黄人亚洲片| 欧美日韩久久久一区| 国产亚洲一区字幕| 亚洲成人777| 成人av小说网| 欧美一区二区三区四区高清| 国产人成亚洲第一网站在线播放| 亚洲制服丝袜一区| 国产成人精品影视| 欧美美女直播网站| 久久免费电影网| 午夜一区二区三区在线观看| 成人久久视频在线观看| 日韩一区二区中文字幕| 亚洲欧洲日韩在线| 激情图片小说一区| 欧美色综合久久| 国产蜜臀av在线一区二区三区| 亚洲bt欧美bt精品| 成人美女视频在线观看18| 欧美电影免费观看完整版| 亚洲一二三四在线观看| 丁香激情综合五月| 精品国产一区二区三区忘忧草| 一区二区三区在线观看欧美| 国产成人丝袜美腿| 91精品国产色综合久久不卡蜜臀 | 狠狠v欧美v日韩v亚洲ⅴ| 在线观看亚洲a| 中文字幕免费不卡在线| 精品一区二区成人精品| 欧美精品日日鲁夜夜添| 一区二区三区色| 91免费在线看| 国产精品第四页| 国产一区二区不卡老阿姨| 日韩欧美一区在线| 亚洲成人免费在线观看| 91麻豆产精品久久久久久| 国产精品久久久久久久蜜臀 | 欧美日韩精品电影| 亚洲精品日韩一| 91麻豆国产福利精品| 亚洲国产成人私人影院tom| 国产精品一区在线观看乱码| 欧美一级高清片| 麻豆国产91在线播放| 欧美日韩精品一区二区三区蜜桃| 一区二区久久久| 91麻豆免费观看| 亚洲激情自拍视频| 色狠狠色狠狠综合| 亚洲国产视频一区二区| 在线视频一区二区三区| 一个色在线综合| 在线影院国内精品| 亚洲国产精品欧美一二99| 欧美日韩中文一区| 婷婷中文字幕一区三区| 欧美精品久久久久久久多人混战| 香蕉久久一区二区不卡无毒影院| 欧美日韩国产经典色站一区二区三区| 亚洲午夜免费视频| 欧美老肥妇做.爰bbww| 亚洲bt欧美bt精品| 欧美猛男男办公室激情| 美女一区二区三区在线观看| 日韩一二三区视频| 国产在线视频不卡二| 久久精品欧美日韩| av不卡在线观看| 亚洲精品自拍动漫在线| 欧美在线高清视频| 视频一区免费在线观看| 精品国产乱码久久久久久1区2区| 国产资源在线一区| 亚洲欧洲av另类| 欧美自拍偷拍一区| 麻豆成人久久精品二区三区红| 久久色中文字幕| 波多野结衣亚洲| 亚洲综合视频在线观看| 91精品国产91热久久久做人人 | 国产一区二区三区免费在线观看| 日韩一区二区三区av| 国产99久久精品| 亚洲一区二区三区在线看| 日韩欧美电影一二三| 国产精品中文欧美| 中文子幕无线码一区tr| 欧美午夜不卡视频| 国产综合色在线| 一区二区在线观看不卡| 欧美成人bangbros| 色婷婷香蕉在线一区二区| 欧美aa在线视频| 中文字幕亚洲视频| 欧美久久久久久久久| 国产精品一区二区久激情瑜伽| 欧美国产欧美综合| 欧美日韩国产精品成人| 国产成人h网站| 亚洲高清久久久| 精品免费视频.| 91免费国产视频网站| 黄网站免费久久| 夜夜嗨av一区二区三区四季av| 日韩欧美国产一区在线观看| 色悠悠久久综合| 国产精品一卡二卡在线观看| 亚洲成av人在线观看| 国产精品免费aⅴ片在线观看| 欧美日韩国产中文| 91在线观看视频| 国产黄人亚洲片| 蜜臀91精品一区二区三区| 亚洲免费观看高清| 久久天堂av综合合色蜜桃网| 欧美老肥妇做.爰bbww视频| 99视频在线精品| 国产白丝网站精品污在线入口| 日本亚洲三级在线| 亚洲小少妇裸体bbw|