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

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

?? ext2fs.c

?? u-boot1.3德國DENX小組開發的用于多種嵌入式CPU的bootloader
?? 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 defined(CONFIG_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一区二区三区免费野_久草精品视频
国产性色一区二区| 日韩一区二区不卡| 亚洲色图制服丝袜| 91麻豆成人久久精品二区三区| 国产精品乱码久久久久久| www.亚洲激情.com| 亚洲一区二区欧美激情| 欧美人妖巨大在线| 久久丁香综合五月国产三级网站| 精品久久久久久久久久久久久久久久久 | 91精品国产一区二区三区香蕉| 亚洲无人区一区| 91精品在线麻豆| 久久99精品久久久久久国产越南| 2022国产精品视频| 99热精品国产| 日韩精品色哟哟| 久久久精品日韩欧美| 91在线精品一区二区三区| 亚洲成av人片一区二区| 精品99一区二区| 91亚洲大成网污www| 欧美aaa在线| 综合婷婷亚洲小说| 日韩一区国产二区欧美三区| 粉嫩aⅴ一区二区三区四区| 亚洲黄一区二区三区| 日韩精品一区二区三区视频| 不卡的看片网站| 日本不卡视频在线观看| 中文字幕亚洲在| 欧美不卡123| 91高清视频免费看| 国产成人精品免费一区二区| 亚洲图片欧美色图| 国产精品天干天干在线综合| 欧美日韩国产成人在线免费| 国产乱淫av一区二区三区| 亚洲一二三四在线观看| 久久久久国产精品人| 欧美电影在线免费观看| 不卡av免费在线观看| 精品一区二区日韩| 亚洲一区免费视频| 亚洲欧洲日韩一区二区三区| 日韩视频在线你懂得| 久久伊99综合婷婷久久伊| 91麻豆.com| 成人av免费在线观看| 久久精品国产亚洲5555| 亚洲国产裸拍裸体视频在线观看乱了| 久久久精品综合| 精品国偷自产国产一区| 欧美精品在线一区二区| 欧美午夜一区二区三区| 波多野结衣中文一区| 国产乱国产乱300精品| 蜜臀99久久精品久久久久久软件| 亚洲地区一二三色| 亚洲综合激情网| 亚洲色图一区二区| 亚洲欧洲综合另类| 国产精品传媒入口麻豆| 国产精品素人一区二区| 久久久不卡影院| 久久综合九色综合欧美98| 日韩欧美一区二区在线视频| 欧美日韩激情一区| 欧美综合一区二区三区| 色天使色偷偷av一区二区| 91网站视频在线观看| 91在线porny国产在线看| 成人精品亚洲人成在线| 国产成人啪免费观看软件| 国产一区二区按摩在线观看| 国产麻豆精品在线| 国产成人精品免费视频网站| 成人精品电影在线观看| 国产精品综合视频| 国产电影一区二区三区| 国产福利91精品一区| 91理论电影在线观看| 日本大胆欧美人术艺术动态| 亚洲一区二区在线播放相泽| 亚洲靠逼com| 亚洲一区二区三区美女| 午夜一区二区三区视频| 午夜一区二区三区视频| 日本欧美在线看| 久久精品国产999大香线蕉| 奇米888四色在线精品| 久久99国产精品免费网站| k8久久久一区二区三区| 色综合久久久久久久| 欧美性做爰猛烈叫床潮| 欧美一区二区三区系列电影| 欧美成人乱码一区二区三区| 国产欧美日韩亚州综合| 中文字幕一区二区三区蜜月| 一个色在线综合| 奇米精品一区二区三区在线观看 | 91美女在线看| 91麻豆.com| 制服丝袜中文字幕一区| 久久久午夜精品理论片中文字幕| 欧美激情综合网| 亚洲综合精品自拍| 韩国女主播成人在线| 99在线精品视频| 51久久夜色精品国产麻豆| www国产亚洲精品久久麻豆| 综合中文字幕亚洲| 日本中文字幕一区| www.亚洲免费av| 69久久99精品久久久久婷婷 | 中文av一区特黄| 亚洲综合免费观看高清完整版在线| 美日韩黄色大片| 91一区一区三区| 日韩欧美久久久| 亚洲视频1区2区| 国产呦精品一区二区三区网站| 97超碰欧美中文字幕| 日韩午夜av电影| 亚洲精品一二三区| 国产精品99久久久久| 精品视频一区三区九区| 中日韩av电影| 美国毛片一区二区三区| 色久综合一二码| 国产片一区二区| 蜜臀精品一区二区三区在线观看| 97久久人人超碰| 久久久精品欧美丰满| 日韩制服丝袜av| 日本道在线观看一区二区| 久久蜜臀中文字幕| 日本在线观看不卡视频| 色综合中文综合网| 麻豆久久一区二区| 在线观看成人免费视频| 中文字幕精品一区二区精品绿巨人| 亚洲成av人片| 色狠狠色噜噜噜综合网| 国产欧美精品日韩区二区麻豆天美| 日本在线播放一区二区三区| 在线精品亚洲一区二区不卡| 国产精品天天看| 国产精品一卡二卡在线观看| 欧美一区二区视频在线观看2020| 亚洲欧美日韩一区二区 | 日韩一卡二卡三卡国产欧美| 一区二区三区在线视频观看| 国产精品一区二区免费不卡 | 久久久久久久久蜜桃| 蜜臀av性久久久久蜜臀aⅴ| 精品视频1区2区3区| 亚洲精品免费视频| 色综合久久99| 一区二区在线看| 欧美在线不卡一区| 亚洲综合自拍偷拍| 欧美午夜精品一区二区蜜桃| 亚洲免费成人av| 91黄色小视频| 一区二区在线观看免费 | 欧美日韩一区二区在线观看| 亚洲精品国产精品乱码不99| 欧美一区二区三区男人的天堂| 亚洲第四色夜色| 欧美一区二区三区公司| 蜜桃视频在线观看一区二区| 日韩一区二区高清| 国产一区999| 亚洲国产精品99久久久久久久久 | 久久精品国产99国产精品| 日韩精品资源二区在线| 精油按摩中文字幕久久| 久久综合久久综合久久| 成人久久久精品乱码一区二区三区| 亚洲国产成人午夜在线一区| av在线这里只有精品| 伊人开心综合网| 91精品国产综合久久久久| 久久99久久精品欧美| 国产午夜精品一区二区三区视频 | 美女精品一区二区| 久久久欧美精品sm网站| 本田岬高潮一区二区三区| 樱桃国产成人精品视频| 欧美日韩国产首页在线观看| 免费观看久久久4p| 国产偷v国产偷v亚洲高清| 99精品视频在线播放观看| 亚洲福利视频一区二区| 精品三级在线观看| 91影视在线播放| 日本欧美一区二区在线观看| 国产日韩成人精品| 在线观看国产91|