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

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

?? dir.c

?? linux環(huán)境下基于FAT的文件系統(tǒng)的通用代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* *  linux/fs/fat/dir.c * *  directory handling functions for fat-based filesystems * *  Written 1992,1993 by Werner Almesberger * *  Hidden files 1995 by Albert Cahalan <albert@ccs.neu.edu> <adc@coe.neu.edu> * *  VFAT extensions by Gordon Chaffee <chaffee@plateau.cs.berkeley.edu> *  Merged with msdos fs by Henrik Storner <storner@osiris.ping.dk> *  Rewritten for constant inumbers. Plugged buffer overrun in readdir(). AV *  Short name translation 1999, 2001 by Wolfram Pienkoss <wp@bszh.de> */#include <linux/module.h>#include <linux/slab.h>#include <linux/time.h>#include <linux/smp_lock.h>#include <linux/buffer_head.h>#include <linux/compat.h>#include <asm/uaccess.h>#include "fat.h"static inline loff_t fat_make_i_pos(struct super_block *sb,				    struct buffer_head *bh,				    struct msdos_dir_entry *de){	return ((loff_t)bh->b_blocknr << MSDOS_SB(sb)->dir_per_block_bits)		| (de - (struct msdos_dir_entry *)bh->b_data);}static inline void fat_dir_readahead(struct inode *dir, sector_t iblock,				     sector_t phys){	struct super_block *sb = dir->i_sb;	struct msdos_sb_info *sbi = MSDOS_SB(sb);	struct buffer_head *bh;	int sec;	/* This is not a first sector of cluster, or sec_per_clus == 1 */	if ((iblock & (sbi->sec_per_clus - 1)) || sbi->sec_per_clus == 1)		return;	/* root dir of FAT12/FAT16 */	if ((sbi->fat_bits != 32) && (dir->i_ino == MSDOS_ROOT_INO))		return;	bh = sb_find_get_block(sb, phys);	if (bh == NULL || !buffer_uptodate(bh)) {		for (sec = 0; sec < sbi->sec_per_clus; sec++)			sb_breadahead(sb, phys + sec);	}	brelse(bh);}/* Returns the inode number of the directory entry at offset pos. If bh is   non-NULL, it is brelse'd before. Pos is incremented. The buffer header is   returned in bh.   AV. Most often we do it item-by-item. Makes sense to optimize.   AV. OK, there we go: if both bh and de are non-NULL we assume that we just   AV. want the next entry (took one explicit de=NULL in vfat/namei.c).   AV. It's done in fat_get_entry() (inlined), here the slow case lives.   AV. Additionally, when we return -1 (i.e. reached the end of directory)   AV. we make bh NULL. */static int fat__get_entry(struct inode *dir, loff_t *pos,			  struct buffer_head **bh, struct msdos_dir_entry **de){	struct super_block *sb = dir->i_sb;	sector_t phys, iblock;	unsigned long mapped_blocks;	int err, offset;next:	if (*bh)		brelse(*bh);	*bh = NULL;	iblock = *pos >> sb->s_blocksize_bits;	err = fat_bmap(dir, iblock, &phys, &mapped_blocks, 0);	if (err || !phys)		return -1;	/* beyond EOF or error */	fat_dir_readahead(dir, iblock, phys);	*bh = sb_bread(sb, phys);	if (*bh == NULL) {		printk(KERN_ERR "FAT: Directory bread(block %llu) failed\n",		       (llu)phys);		/* skip this block */		*pos = (iblock + 1) << sb->s_blocksize_bits;		goto next;	}	offset = *pos & (sb->s_blocksize - 1);	*pos += sizeof(struct msdos_dir_entry);	*de = (struct msdos_dir_entry *)((*bh)->b_data + offset);	return 0;}static inline int fat_get_entry(struct inode *dir, loff_t *pos,				struct buffer_head **bh,				struct msdos_dir_entry **de){	/* Fast stuff first */	if (*bh && *de &&	    (*de - (struct msdos_dir_entry *)(*bh)->b_data) < MSDOS_SB(dir->i_sb)->dir_per_block - 1) {		*pos += sizeof(struct msdos_dir_entry);		(*de)++;		return 0;	}	return fat__get_entry(dir, pos, bh, de);}/* * Convert Unicode 16 to UTF-8, translated Unicode, or ASCII. * If uni_xlate is enabled and we can't get a 1:1 conversion, use a * colon as an escape character since it is normally invalid on the vfat * filesystem. The following four characters are the hexadecimal digits * of Unicode value. This lets us do a full dump and restore of Unicode * filenames. We could get into some trouble with long Unicode names, * but ignore that right now. * Ahem... Stack smashing in ring 0 isn't fun. Fixed. */static int uni16_to_x8(unsigned char *ascii, const wchar_t *uni, int len,		       int uni_xlate, struct nls_table *nls){	const wchar_t *ip;	wchar_t ec;	unsigned char *op, nc;	int charlen;	int k;	ip = uni;	op = ascii;	while (*ip && ((len - NLS_MAX_CHARSET_SIZE) > 0)) {		ec = *ip++;		if ( (charlen = nls->uni2char(ec, op, NLS_MAX_CHARSET_SIZE)) > 0) {			op += charlen;			len -= charlen;		} else {			if (uni_xlate == 1) {				*op = ':';				for (k = 4; k > 0; k--) {					nc = ec & 0xF;					op[k] = nc > 9	? nc + ('a' - 10)							: nc + '0';					ec >>= 4;				}				op += 5;				len -= 5;			} else {				*op++ = '?';				len--;			}		}	}	if (unlikely(*ip)) {		printk(KERN_WARNING "FAT: filename was truncated while "		       "converting.");	}	*op = 0;	return (op - ascii);}static inline int fat_uni_to_x8(struct msdos_sb_info *sbi, const wchar_t *uni,				unsigned char *buf, int size){	if (sbi->options.utf8)		return utf8_wcstombs(buf, uni, size);	else		return uni16_to_x8(buf, uni, size, sbi->options.unicode_xlate,				   sbi->nls_io);}static inline intfat_short2uni(struct nls_table *t, unsigned char *c, int clen, wchar_t *uni){	int charlen;	charlen = t->char2uni(c, clen, uni);	if (charlen < 0) {		*uni = 0x003f;	/* a question mark */		charlen = 1;	}	return charlen;}static inline intfat_short2lower_uni(struct nls_table *t, unsigned char *c, int clen, wchar_t *uni){	int charlen;	wchar_t wc;	charlen = t->char2uni(c, clen, &wc);	if (charlen < 0) {		*uni = 0x003f;	/* a question mark */		charlen = 1;	} else if (charlen <= 1) {		unsigned char nc = t->charset2lower[*c];		if (!nc)			nc = *c;		if ( (charlen = t->char2uni(&nc, 1, uni)) < 0) {			*uni = 0x003f;	/* a question mark */			charlen = 1;		}	} else		*uni = wc;	return charlen;}static inline intfat_shortname2uni(struct nls_table *nls, unsigned char *buf, int buf_size,		  wchar_t *uni_buf, unsigned short opt, int lower){	int len = 0;	if (opt & VFAT_SFN_DISPLAY_LOWER)		len =  fat_short2lower_uni(nls, buf, buf_size, uni_buf);	else if (opt & VFAT_SFN_DISPLAY_WIN95)		len = fat_short2uni(nls, buf, buf_size, uni_buf);	else if (opt & VFAT_SFN_DISPLAY_WINNT) {		if (lower)			len = fat_short2lower_uni(nls, buf, buf_size, uni_buf);		else			len = fat_short2uni(nls, buf, buf_size, uni_buf);	} else		len = fat_short2uni(nls, buf, buf_size, uni_buf);	return len;}static inline int fat_name_match(struct msdos_sb_info *sbi,				 const unsigned char *a, int a_len,				 const unsigned char *b, int b_len){	if (a_len != b_len)		return 0;	if (sbi->options.name_check != 's')		return !nls_strnicmp(sbi->nls_io, a, b, a_len);	else		return !memcmp(a, b, a_len);}enum { PARSE_INVALID = 1, PARSE_NOT_LONGNAME, PARSE_EOF, };/** * fat_parse_long - Parse extended directory entry. * * This function returns zero on success, negative value on error, or one of * the following: * * %PARSE_INVALID - Directory entry is invalid. * %PARSE_NOT_LONGNAME - Directory entry does not contain longname. * %PARSE_EOF - Directory has no more entries. */static int fat_parse_long(struct inode *dir, loff_t *pos,			  struct buffer_head **bh, struct msdos_dir_entry **de,			  wchar_t **unicode, unsigned char *nr_slots){	struct msdos_dir_slot *ds;	unsigned char id, slot, slots, alias_checksum;	if (!*unicode) {		*unicode = __getname();		if (!*unicode) {			brelse(*bh);			return -ENOMEM;		}	}parse_long:	slots = 0;	ds = (struct msdos_dir_slot *)*de;	id = ds->id;	if (!(id & 0x40))		return PARSE_INVALID;	slots = id & ~0x40;	if (slots > 20 || !slots)	/* ceil(256 * 2 / 26) */		return PARSE_INVALID;	*nr_slots = slots;	alias_checksum = ds->alias_checksum;	slot = slots;	while (1) {		int offset;		slot--;		offset = slot * 13;		fat16_towchar(*unicode + offset, ds->name0_4, 5);		fat16_towchar(*unicode + offset + 5, ds->name5_10, 6);		fat16_towchar(*unicode + offset + 11, ds->name11_12, 2);		if (ds->id & 0x40)			(*unicode)[offset + 13] = 0;		if (fat_get_entry(dir, pos, bh, de) < 0)			return PARSE_EOF;		if (slot == 0)			break;		ds = (struct msdos_dir_slot *)*de;		if (ds->attr != ATTR_EXT)			return PARSE_NOT_LONGNAME;		if ((ds->id & ~0x40) != slot)			goto parse_long;		if (ds->alias_checksum != alias_checksum)			goto parse_long;	}	if ((*de)->name[0] == DELETED_FLAG)		return PARSE_INVALID;	if ((*de)->attr == ATTR_EXT)		goto parse_long;	if (IS_FREE((*de)->name) || ((*de)->attr & ATTR_VOLUME))		return PARSE_INVALID;	if (fat_checksum((*de)->name) != alias_checksum)		*nr_slots = 0;	return 0;}/* * Maximum buffer size of short name. * [(MSDOS_NAME + '.') * max one char + nul] * For msdos style, ['.' (hidden) + MSDOS_NAME + '.' + nul] */#define FAT_MAX_SHORT_SIZE	((MSDOS_NAME + 1) * NLS_MAX_CHARSET_SIZE + 1)/* * Maximum buffer size of unicode chars from slots. * [(max longname slots * 13 (size in a slot) + nul) * sizeof(wchar_t)] */#define FAT_MAX_UNI_CHARS	((MSDOS_SLOTS - 1) * 13 + 1)#define FAT_MAX_UNI_SIZE	(FAT_MAX_UNI_CHARS * sizeof(wchar_t))/* * Return values: negative -> error, 0 -> not found, positive -> found, * value is the total amount of slots, including the shortname entry. */int fat_search_long(struct inode *inode, const unsigned char *name,		    int name_len, struct fat_slot_info *sinfo){	struct super_block *sb = inode->i_sb;	struct msdos_sb_info *sbi = MSDOS_SB(sb);	struct buffer_head *bh = NULL;	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 work[MSDOS_NAME];	unsigned char bufname[FAT_MAX_SHORT_SIZE];	unsigned short opt_shortname = sbi->options.shortname;	loff_t cpos = 0;	int chl, i, j, last_u, err, len;	err = -ENOENT;	while (1) {		if (fat_get_entry(inode, &cpos, &bh, &de) == -1)			goto end_of_dir;parse_record:		nr_slots = 0;		if (de->name[0] == DELETED_FLAG)			continue;		if (de->attr != ATTR_EXT && (de->attr & ATTR_VOLUME))			continue;		if (de->attr != ATTR_EXT && IS_FREE(de->name))			continue;		if (de->attr == ATTR_EXT) {			int status = fat_parse_long(inode, &cpos, &bh, &de,						    &unicode, &nr_slots);			if (status < 0) {				err = status;				goto end_of_dir;			} else if (status == PARSE_INVALID)				continue;			else if (status == PARSE_NOT_LONGNAME)				goto parse_record;			else if (status == PARSE_EOF)				goto end_of_dir;		}		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_u = 0; i < 8;) {			if (!work[i])				break;			chl = fat_shortname2uni(nls_disk, &work[i], 8 - i,						&bufuname[j++], opt_shortname,						de->lcase & CASE_LOWER_BASE);			if (chl <= 1) {				if (work[i] != ' ')					last_u = j;			} else {				last_u = j;			}			i += chl;		}		j = last_u;		fat_short2uni(nls_disk, ".", 1, &bufuname[j++]);		for (i = 8; i < MSDOS_NAME;) {			if (!work[i])				break;			chl = fat_shortname2uni(nls_disk, &work[i],						MSDOS_NAME - i,						&bufuname[j++], opt_shortname,						de->lcase & CASE_LOWER_EXT);			if (chl <= 1) {				if (work[i] != ' ')					last_u = j;			} else {				last_u = j;			}			i += chl;		}		if (!last_u)			continue;		/* Compare shortname */		bufuname[last_u] = 0x0000;		len = fat_uni_to_x8(sbi, bufuname, bufname, sizeof(bufname));		if (fat_name_match(sbi, name, name_len, bufname, len))			goto found;		if (nr_slots) {			void *longname = unicode + FAT_MAX_UNI_CHARS;			int size = PATH_MAX - FAT_MAX_UNI_SIZE;			/* Compare longname */			len = fat_uni_to_x8(sbi, unicode, longname, size);			if (fat_name_match(sbi, name, name_len, longname, len))				goto found;		}	}found:	nr_slots++;	/* include the de */	sinfo->slot_off = cpos - nr_slots * sizeof(*de);	sinfo->nr_slots = nr_slots;	sinfo->de = de;	sinfo->bh = bh;	sinfo->i_pos = fat_make_i_pos(sb, sinfo->bh, sinfo->de);	err = 0;end_of_dir:	if (unicode)		__putname(unicode);	return err;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产剧情一区二区| 99久久综合国产精品| 激情五月激情综合网| 国产1区2区3区精品美女| av不卡一区二区三区| 欧美三区在线视频| 久久久国产精华| 一区二区三区精品| 国产乱人伦偷精品视频免下载| av一二三不卡影片| 69p69国产精品| 中文字幕一区二区三| 日本不卡高清视频| 95精品视频在线| 日韩一区二区三区在线视频| 国产精品女主播av| 免费观看日韩电影| 91蜜桃在线免费视频| 日韩欧美123| 亚洲综合久久久久| 福利一区在线观看| 欧美一区日韩一区| 亚洲欧美另类图片小说| 精品在线视频一区| 欧美亚洲一区二区在线| 久久久久国产精品麻豆| 五月激情丁香一区二区三区| www.亚洲人| 精品国产成人系列| 午夜亚洲国产au精品一区二区| 成人一区在线观看| 精品国产亚洲一区二区三区在线观看| 亚洲美女淫视频| 国产一区二三区| 91精品国产麻豆国产自产在线| 国产精品成人免费在线| 国产一区二区在线免费观看| 3d成人h动漫网站入口| 亚洲色大成网站www久久九九| 国产精品自拍在线| 日韩久久久精品| 日韩中文字幕一区二区三区| 91欧美一区二区| 中文字幕欧美激情| 国产一区二区视频在线| 欧美一区二区女人| 视频一区二区三区在线| 在线免费观看不卡av| 亚洲视频在线一区| 成人午夜视频福利| 国产日韩欧美激情| 国产精品综合一区二区三区| 欧美xxxxx裸体时装秀| 丝袜亚洲另类欧美| 一区二区三区日韩精品| 成人小视频在线观看| 久久新电视剧免费观看| 美女网站在线免费欧美精品| 在线电影国产精品| 午夜精品福利在线| 欧美久久久久久久久久| 午夜激情一区二区| 欧美另类z0zxhd电影| 午夜久久久久久| 欧美系列亚洲系列| 亚洲一区二区欧美| 欧洲国内综合视频| 亚洲国产成人高清精品| 欧美日韩久久久| 午夜欧美在线一二页| 欧美视频自拍偷拍| 日韩精品久久久久久| 在线不卡的av| 久久电影网电视剧免费观看| 精品91自产拍在线观看一区| 狠狠色综合播放一区二区| 欧美精品一区男女天堂| 国产精品综合一区二区三区| 日本一区二区三区dvd视频在线| 成人免费av在线| 亚洲三级在线观看| 欧美性一区二区| 丝袜亚洲另类丝袜在线| 欧美mv日韩mv国产网站| 国产不卡在线一区| 亚洲人吸女人奶水| 欧美人体做爰大胆视频| 久草中文综合在线| 久久精品人人做| 91在线porny国产在线看| 一区二区激情视频| 欧美一区二区三区在| 国产一区二区三区香蕉 | 天堂在线一区二区| 日韩三级电影网址| 国产精品影视网| 亚洲视频香蕉人妖| 欧美喷水一区二区| 国内成人自拍视频| 亚洲人午夜精品天堂一二香蕉| 欧美视频一区二区三区四区| 久久精品免费观看| 欧美国产精品久久| 欧美午夜理伦三级在线观看| 日韩国产欧美三级| 久久久久久久久久久黄色| 99riav久久精品riav| 亚洲18女电影在线观看| 亚洲精品一区二区三区在线观看| 成人国产精品免费观看动漫| 亚洲一区二区三区美女| 精品久久久久久久久久久久久久久久久 | 粉嫩av一区二区三区在线播放| 亚洲激情自拍视频| 精品99久久久久久| 一本色道久久综合亚洲aⅴ蜜桃| 在线亚洲免费视频| 久久国产福利国产秒拍| 亚洲精品五月天| 精品国产一区二区三区av性色| 97se亚洲国产综合自在线不卡| 午夜精品福利久久久| 日本一区二区三区久久久久久久久不 | 久久综合久久综合久久| 欧美伊人久久久久久久久影院 | 国产午夜精品一区二区三区视频| 色成年激情久久综合| 久久电影网站中文字幕| 一区二区三区中文免费| 久久精品人人做人人综合| 欧美日韩一区二区在线观看| 国产99精品在线观看| 日本91福利区| 一区二区理论电影在线观看| 久久精品日韩一区二区三区| 884aa四虎影成人精品一区| caoporn国产一区二区| 韩国一区二区在线观看| 亚洲一区二区三区国产| 国产精品三级视频| 欧美变态tickle挠乳网站| 欧美亚洲精品一区| 成人国产免费视频| 国产一区在线观看视频| 石原莉奈在线亚洲三区| 亚洲色图制服诱惑| 欧美精彩视频一区二区三区| 日韩久久久精品| 欧美日韩国产a| 色嗨嗨av一区二区三区| 成人国产亚洲欧美成人综合网| 韩国理伦片一区二区三区在线播放| 一区二区三区鲁丝不卡| 亚洲欧美怡红院| 国产性天天综合网| 欧美大片一区二区三区| 欧美日韩一区中文字幕| 色综合久久久久久久久久久| 高清国产一区二区三区| 青青草原综合久久大伊人精品 | 欧美三级中文字| 97se亚洲国产综合在线| 成人av高清在线| 国产xxx精品视频大全| 国产精品中文欧美| 国内精品伊人久久久久av影院| 蜜臀a∨国产成人精品| 五月天丁香久久| 亚洲第四色夜色| 午夜精品久久久久久久99水蜜桃 | 亚洲欧洲av在线| 欧美激情在线免费观看| 久久久久久久久久久久久久久99| 91丨porny丨中文| 亚洲最新视频在线观看| 国产成人在线观看免费网站| 中文字幕在线不卡| 欧美日韩一二区| 欧美视频完全免费看| 色94色欧美sute亚洲线路一久| av中文字幕亚洲| 成人av在线电影| 99精品视频一区二区| 99视频一区二区三区| 色综合夜色一区| 91国产成人在线| 欧美日韩国产大片| 91麻豆精品国产91久久久久久| 91精品国产色综合久久久蜜香臀| 欧美电影一区二区| 欧美电影免费观看高清完整版 | 无码av免费一区二区三区试看| 亚洲成av人片一区二区梦乃 | 欧美va亚洲va| 久久久亚洲高清| 国产精品网站一区| 一区二区免费看| 日本亚洲最大的色成网站www| 蓝色福利精品导航| 国产成人三级在线观看|