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

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

?? ext2fs.c

?? u-boot-1.1.6 源碼包
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * (C) Copyright 2004 *  esd gmbh <www.esd-electronics.com> *  Reinhard Arlt <reinhard.arlt@esd-electronics.com> * *  based on code from grub2 fs/ext2.c and fs/fshelp.c by * *  GRUB  --  GRand Unified Bootloader *  Copyright (C) 2003, 2004  Free Software Foundation, Inc. * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include <common.h>#if (CONFIG_COMMANDS & CFG_CMD_EXT2)#include <ext2fs.h>#include <malloc.h>#include <asm/byteorder.h>extern int ext2fs_devread (int sector, int byte_offset, int byte_len,			   char *buf);/* Magic value used to identify an ext2 filesystem.  */#define	EXT2_MAGIC		0xEF53/* Amount of indirect blocks in an inode.  */#define INDIRECT_BLOCKS		12/* Maximum lenght of a pathname.  */#define EXT2_PATH_MAX		4096/* Maximum nesting of symlinks, used to prevent a loop.  */#define	EXT2_MAX_SYMLINKCNT	8/* Filetype used in directory entry.  */#define	FILETYPE_UNKNOWN	0#define	FILETYPE_REG		1#define	FILETYPE_DIRECTORY	2#define	FILETYPE_SYMLINK	7/* Filetype information as used in inodes.  */#define FILETYPE_INO_MASK	0170000#define FILETYPE_INO_REG	0100000#define FILETYPE_INO_DIRECTORY	0040000#define FILETYPE_INO_SYMLINK	0120000/* Bits used as offset in sector */#define DISK_SECTOR_BITS        9/* Log2 size of ext2 block in 512 blocks.  */#define LOG2_EXT2_BLOCK_SIZE(data) (__le32_to_cpu (data->sblock.log2_block_size) + 1)/* Log2 size of ext2 block in bytes.  */#define LOG2_BLOCK_SIZE(data)	   (__le32_to_cpu (data->sblock.log2_block_size) + 10)/* The size of an ext2 block in bytes.  */#define EXT2_BLOCK_SIZE(data)	   (1 << LOG2_BLOCK_SIZE(data))/* The ext2 superblock.  */struct ext2_sblock {	uint32_t total_inodes;	uint32_t total_blocks;	uint32_t reserved_blocks;	uint32_t free_blocks;	uint32_t free_inodes;	uint32_t first_data_block;	uint32_t log2_block_size;	uint32_t log2_fragment_size;	uint32_t blocks_per_group;	uint32_t fragments_per_group;	uint32_t inodes_per_group;	uint32_t mtime;	uint32_t utime;	uint16_t mnt_count;	uint16_t max_mnt_count;	uint16_t magic;	uint16_t fs_state;	uint16_t error_handling;	uint16_t minor_revision_level;	uint32_t lastcheck;	uint32_t checkinterval;	uint32_t creator_os;	uint32_t revision_level;	uint16_t uid_reserved;	uint16_t gid_reserved;	uint32_t first_inode;	uint16_t inode_size;	uint16_t block_group_number;	uint32_t feature_compatibility;	uint32_t feature_incompat;	uint32_t feature_ro_compat;	uint32_t unique_id[4];	char volume_name[16];	char last_mounted_on[64];	uint32_t compression_info;};/* The ext2 blockgroup.  */struct ext2_block_group {	uint32_t block_id;	uint32_t inode_id;	uint32_t inode_table_id;	uint16_t free_blocks;	uint16_t free_inodes;	uint16_t pad;	uint32_t reserved[3];};/* The ext2 inode.  */struct ext2_inode {	uint16_t mode;	uint16_t uid;	uint32_t size;	uint32_t atime;	uint32_t ctime;	uint32_t mtime;	uint32_t dtime;	uint16_t gid;	uint16_t nlinks;	uint32_t blockcnt;	/* Blocks of 512 bytes!! */	uint32_t flags;	uint32_t osd1;	union {		struct datablocks {			uint32_t dir_blocks[INDIRECT_BLOCKS];			uint32_t indir_block;			uint32_t double_indir_block;			uint32_t tripple_indir_block;		} blocks;		char symlink[60];	} b;	uint32_t version;	uint32_t acl;	uint32_t dir_acl;	uint32_t fragment_addr;	uint32_t osd2[3];};/* The header of an ext2 directory entry.  */struct ext2_dirent {	uint32_t inode;	uint16_t direntlen;	uint8_t namelen;	uint8_t filetype;};struct ext2fs_node {	struct ext2_data *data;	struct ext2_inode inode;	int ino;	int inode_read;};/* Information about a "mounted" ext2 filesystem.  */struct ext2_data {	struct ext2_sblock sblock;	struct ext2_inode *inode;	struct ext2fs_node diropen;};typedef struct ext2fs_node *ext2fs_node_t;struct ext2_data *ext2fs_root = NULL;ext2fs_node_t ext2fs_file = NULL;int symlinknest = 0;uint32_t *indir1_block = NULL;int indir1_size = 0;int indir1_blkno = -1;uint32_t *indir2_block = NULL;int indir2_size = 0;int indir2_blkno = -1;static int ext2fs_blockgroup	(struct ext2_data *data, int group, struct ext2_block_group *blkgrp) {#ifdef DEBUG	printf ("ext2fs read blockgroup\n");#endif	return (ext2fs_devread		(((__le32_to_cpu (data->sblock.first_data_block) +		   1) << LOG2_EXT2_BLOCK_SIZE (data)),		 group * sizeof (struct ext2_block_group),		 sizeof (struct ext2_block_group), (char *) blkgrp));}static int ext2fs_read_inode	(struct ext2_data *data, int ino, struct ext2_inode *inode) {	struct ext2_block_group blkgrp;	struct ext2_sblock *sblock = &data->sblock;	int inodes_per_block;	int status;	unsigned int blkno;	unsigned int blkoff;	/* It is easier to calculate if the first inode is 0.  */	ino--;#ifdef DEBUG	printf ("ext2fs read inode %d\n", ino);#endif	status = ext2fs_blockgroup (data,				    ino /				    __le32_to_cpu (sblock->inodes_per_group),				    &blkgrp);	if (status == 0) {		return (0);	}	inodes_per_block = EXT2_BLOCK_SIZE (data) / 128;	blkno = (ino % __le32_to_cpu (sblock->inodes_per_group)) /		inodes_per_block;	blkoff = (ino % __le32_to_cpu (sblock->inodes_per_group)) %		inodes_per_block;#ifdef DEBUG	printf ("ext2fs read inode blkno %d blkoff %d\n", blkno, blkoff);#endif	/* Read the inode.  */	status = ext2fs_devread (((__le32_to_cpu (blkgrp.inode_table_id) +				   blkno) << LOG2_EXT2_BLOCK_SIZE (data)),				 sizeof (struct ext2_inode) * blkoff,				 sizeof (struct ext2_inode), (char *) inode);	if (status == 0) {		return (0);	}	return (1);}void ext2fs_free_node (ext2fs_node_t node, ext2fs_node_t currroot) {	if ((node != &ext2fs_root->diropen) && (node != currroot)) {		free (node);	}}static int ext2fs_read_block (ext2fs_node_t node, int fileblock) {	struct ext2_data *data = node->data;	struct ext2_inode *inode = &node->inode;	int blknr;	int blksz = EXT2_BLOCK_SIZE (data);	int log2_blksz = LOG2_EXT2_BLOCK_SIZE (data);	int status;	/* Direct blocks.  */	if (fileblock < INDIRECT_BLOCKS) {		blknr = __le32_to_cpu (inode->b.blocks.dir_blocks[fileblock]);	}	/* Indirect.  */	else if (fileblock < (INDIRECT_BLOCKS + (blksz / 4))) {		if (indir1_block == NULL) {			indir1_block = (uint32_t *) malloc (blksz);			if (indir1_block == NULL) {				printf ("** ext2fs read block (indir 1) malloc failed. **\n");				return (-1);			}			indir1_size = blksz;			indir1_blkno = -1;		}		if (blksz != indir1_size) {			free (indir1_block);			indir1_block = NULL;			indir1_size = 0;			indir1_blkno = -1;			indir1_block = (uint32_t *) malloc (blksz);			if (indir1_block == NULL) {				printf ("** ext2fs read block (indir 1) malloc failed. **\n");				return (-1);			}			indir1_size = blksz;		}		if ((__le32_to_cpu (inode->b.blocks.indir_block) <<		     log2_blksz) != indir1_blkno) {			status = ext2fs_devread (__le32_to_cpu(inode->b.blocks.indir_block) << log2_blksz,						 0, blksz,						 (char *) indir1_block);			if (status == 0) {				printf ("** ext2fs read block (indir 1) failed. **\n");				return (0);			}			indir1_blkno =				__le32_to_cpu (inode->b.blocks.					       indir_block) << log2_blksz;		}		blknr = __le32_to_cpu (indir1_block				       [fileblock - INDIRECT_BLOCKS]);	}	/* Double indirect.  */	else if (fileblock <		 (INDIRECT_BLOCKS + (blksz / 4 * (blksz / 4 + 1)))) {		unsigned int perblock = blksz / 4;		unsigned int rblock = fileblock - (INDIRECT_BLOCKS						   + blksz / 4);		if (indir1_block == NULL) {			indir1_block = (uint32_t *) malloc (blksz);			if (indir1_block == NULL) {				printf ("** ext2fs read block (indir 2 1) malloc failed. **\n");				return (-1);			}			indir1_size = blksz;			indir1_blkno = -1;		}		if (blksz != indir1_size) {			free (indir1_block);			indir1_block = NULL;			indir1_size = 0;			indir1_blkno = -1;			indir1_block = (uint32_t *) malloc (blksz);			if (indir1_block == NULL) {				printf ("** ext2fs read block (indir 2 1) malloc failed. **\n");				return (-1);			}			indir1_size = blksz;		}		if ((__le32_to_cpu (inode->b.blocks.double_indir_block) <<		     log2_blksz) != indir1_blkno) {			status = ext2fs_devread (__le32_to_cpu(inode->b.blocks.double_indir_block) << log2_blksz,						0, blksz,						(char *) indir1_block);			if (status == 0) {				printf ("** ext2fs read block (indir 2 1) failed. **\n");				return (-1);			}			indir1_blkno =				__le32_to_cpu (inode->b.blocks.double_indir_block) << log2_blksz;		}		if (indir2_block == NULL) {			indir2_block = (uint32_t *) malloc (blksz);			if (indir2_block == NULL) {				printf ("** ext2fs read block (indir 2 2) malloc failed. **\n");				return (-1);			}			indir2_size = blksz;			indir2_blkno = -1;		}		if (blksz != indir2_size) {			free (indir2_block);			indir2_block = NULL;			indir2_size = 0;			indir2_blkno = -1;			indir2_block = (uint32_t *) malloc (blksz);			if (indir2_block == NULL) {				printf ("** ext2fs read block (indir 2 2) malloc failed. **\n");				return (-1);			}			indir2_size = blksz;		}		if ((__le32_to_cpu (indir1_block[rblock / perblock]) <<		     log2_blksz) != indir1_blkno) {			status = ext2fs_devread (__le32_to_cpu(indir1_block[rblock / perblock]) << log2_blksz,						 0, blksz,						 (char *) indir2_block);			if (status == 0) {				printf ("** ext2fs read block (indir 2 2) failed. **\n");				return (-1);			}			indir2_blkno =				__le32_to_cpu (indir1_block[rblock / perblock]) << log2_blksz;		}		blknr = __le32_to_cpu (indir2_block[rblock % perblock]);	}	/* Tripple indirect.  */	else {		printf ("** ext2fs doesn't support tripple indirect blocks. **\n");		return (-1);	}#ifdef DEBUG	printf ("ext2fs_read_block %08x\n", blknr);#endif	return (blknr);}int ext2fs_read_file	(ext2fs_node_t node, int pos, unsigned int len, char *buf) {	int i;	int blockcnt;	int log2blocksize = LOG2_EXT2_BLOCK_SIZE (node->data);	int blocksize = 1 << (log2blocksize + DISK_SECTOR_BITS);	unsigned int filesize = __le32_to_cpu(node->inode.size);	/* Adjust len so it we can't read past the end of the file.  */	if (len > filesize) {		len = filesize;	}	blockcnt = ((len + pos) + blocksize - 1) / blocksize;	for (i = pos / blocksize; i < blockcnt; i++) {		int blknr;		int blockoff = pos % blocksize;		int blockend = blocksize;		int skipfirst = 0;		blknr = ext2fs_read_block (node, i);		if (blknr < 0) {			return (-1);		}		blknr = blknr << log2blocksize;		/* Last block.  */		if (i == blockcnt - 1) {			blockend = (len + pos) % blocksize;			/* The last portion is exactly blocksize.  */			if (!blockend) {				blockend = blocksize;			}		}		/* First block.  */		if (i == pos / blocksize) {			skipfirst = blockoff;			blockend -= skipfirst;		}		/* If the block number is 0 this block is not stored on disk but		   is zero filled instead.  */		if (blknr) {			int status;			status = ext2fs_devread (blknr, skipfirst, blockend, buf);			if (status == 0) {				return (-1);			}		} else {			memset (buf, blocksize - skipfirst, 0);		}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美日韩综合| 欧美大片日本大片免费观看| 国产一区二区三区视频在线播放| 三级不卡在线观看| 日韩一区精品视频| 蜜桃av噜噜一区| 国产在线不卡视频| 成人性生交大片免费看中文| 国产成人av电影免费在线观看| 国内精品国产成人国产三级粉色| 久草精品在线观看| 国产成人精品免费网站| 成人h动漫精品一区二区| 99视频在线精品| 欧美视频第二页| 日韩三级在线观看| 国产清纯在线一区二区www| 国产精品国产自产拍高清av | 亚洲国产精品欧美一二99| 亚洲综合久久久| 免费人成精品欧美精品| 国产精品一区二区久激情瑜伽| 国产激情一区二区三区桃花岛亚洲| 国产精品自拍网站| 成人午夜精品一区二区三区| 色综合久久中文字幕| 69堂精品视频| 中文字幕 久热精品 视频在线| 亚洲女爱视频在线| 精品在线你懂的| 一本大道av一区二区在线播放| 91精品国产综合久久精品| 欧美精品第1页| 国产精品理论片| 日韩精品免费专区| 亚洲视频香蕉人妖| 91精品国产麻豆| 久久精品国产亚洲5555| 国产区在线观看成人精品| 日精品一区二区三区| 国产成人精品免费在线| 欧美一级片免费看| 中文欧美字幕免费| 国模娜娜一区二区三区| 亚洲午夜久久久| 日韩一区二区影院| 老司机一区二区| 国产精品九色蝌蚪自拍| 99久久er热在这里只有精品66| 欧美视频自拍偷拍| 久久精品国产99| 国产日韩精品一区二区三区在线| 日本亚洲免费观看| 色综合一区二区三区| 亚洲1区2区3区4区| 欧美在线观看一区二区| 亚洲国产精品欧美一二99| 欧美综合久久久| 国产欧美va欧美不卡在线| 久久精品国产网站| 国产精品一线二线三线精华| 欧美日韩精品是欧美日韩精品| 婷婷国产在线综合| 欧美又粗又大又爽| 欧美一区二区成人6969| 成人av在线一区二区三区| 色综合久久久久久久久久久| 91精品国产入口在线| 日韩欧美成人一区| 中文一区在线播放| 亚洲欧美日韩中文播放 | 在线不卡a资源高清| 中文字幕日韩一区| 欧美麻豆精品久久久久久| 欧美片在线播放| 国产精品91xxx| 久久婷婷久久一区二区三区| 国产精品视频在线看| 国产在线日韩欧美| 日韩欧美一级二级三级久久久| 国产99久久久国产精品潘金| 亚洲国产一区视频| 久久日一线二线三线suv| 欧美日韩中文精品| 国产精品888| 日韩激情一二三区| 亚洲色图第一区| 日本一区二区三区免费乱视频 | 中文字幕av一区二区三区免费看| 在线视频一区二区三| 成人网页在线观看| 精品一区二区成人精品| 亚洲va欧美va人人爽午夜| 综合久久国产九一剧情麻豆| 久久夜色精品一区| 日韩精品中文字幕一区| 91麻豆精品久久久久蜜臀| 一本一道久久a久久精品| 成人黄色av电影| 国产风韵犹存在线视精品| 精品一区二区三区在线视频| 五月天丁香久久| 亚洲电影在线播放| 亚洲国产精品欧美一二99| 亚洲激情在线激情| 亚洲丝袜自拍清纯另类| 亚洲国产岛国毛片在线| 久久中文娱乐网| 精品国产3级a| 久久精品视频一区| 久久久久久久网| 国产日韩影视精品| 欧美国产在线观看| 欧美激情在线观看视频免费| 久久婷婷综合激情| 欧美激情一区二区| 中文字幕 久热精品 视频在线 | 精品伊人久久久久7777人| 日韩成人精品在线| 日本欧美一区二区三区| 日本怡春院一区二区| 日韩精品91亚洲二区在线观看| 亚洲国产综合人成综合网站| 午夜精品aaa| 美女诱惑一区二区| 国产精品影视在线观看| 成人性生交大合| av欧美精品.com| 在线观看国产91| 欧美精品久久久久久久多人混战 | 亚洲超丰满肉感bbw| 视频一区二区三区入口| 麻豆精品久久精品色综合| 国产美女在线精品| 91蝌蚪porny成人天涯| 精品污污网站免费看| 欧美一级夜夜爽| 国产欧美日韩不卡免费| 亚洲免费看黄网站| 青娱乐精品在线视频| 国产精品一品二品| 色婷婷久久一区二区三区麻豆| 欧美日韩精品欧美日韩精品 | 91成人免费在线视频| 欧美久久久久久久久中文字幕| 91精品在线免费观看| 2020国产精品久久精品美国| 亚洲美女视频在线| 久久国产综合精品| 成人激情午夜影院| 欧美妇女性影城| 国产精品久久久久一区二区三区 | 日产国产高清一区二区三区| 黑人巨大精品欧美黑白配亚洲| 成人黄色免费短视频| 欧美日韩一区二区电影| 久久先锋影音av| 亚洲午夜激情av| 国产成人啪免费观看软件| 在线观看国产91| 久久精品人人做人人爽97| 午夜视频久久久久久| 成人激情午夜影院| 日韩免费看网站| 亚洲国产视频一区二区| 粉嫩aⅴ一区二区三区四区五区 | 91亚洲精华国产精华精华液| 91精品啪在线观看国产60岁| 中文字幕免费不卡在线| 日韩成人av影视| 91视频一区二区三区| 久久天堂av综合合色蜜桃网| 亚洲国产成人tv| 99精品久久只有精品| 久久久久久久久蜜桃| 日本在线播放一区二区三区| 欧美在线一区二区三区| 国产三级久久久| 国产中文字幕精品| 日韩欧美一区二区在线视频| 一二三四区精品视频| 成人国产精品免费观看视频| 久久在线免费观看| 蜜臂av日日欢夜夜爽一区| 欧美色网站导航| 亚洲一区二三区| 在线欧美日韩精品| 亚洲欧美色综合| 色婷婷综合久久| 亚洲视频一区在线观看| 99re这里只有精品视频首页| 国产丝袜美腿一区二区三区| 国内久久精品视频| 久久久久国产精品麻豆| 精品在线播放午夜| 久久亚洲春色中文字幕久久久| 国产一区二区成人久久免费影院| 日韩精品专区在线| 韩国理伦片一区二区三区在线播放| 日韩欧美一级二级|