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

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

?? ext2fs.c

?? UBOOT 源碼
?? 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一区二区三区免费野_久草精品视频
另类小说色综合网站| 欧美日韩一区中文字幕| 一卡二卡欧美日韩| 久久久国产一区二区三区四区小说| 欧美三级午夜理伦三级中视频| 久久久亚洲高清| 日韩国产欧美一区二区三区| 亚洲一区二区免费视频| 亚洲综合区在线| 成人高清伦理免费影院在线观看| 国产成人精品免费视频网站| 国产1区2区3区精品美女| 成人av电影在线| 日韩视频不卡中文| 久久亚洲综合av| 国产精品久久久久精k8| 中文文精品字幕一区二区| 中文字幕一区二区三区不卡在线 | 欧美经典一区二区三区| 欧美男女性生活在线直播观看| 欧美日韩国产电影| 亚洲特黄一级片| 午夜精品免费在线| 九色|91porny| 成人精品鲁一区一区二区| 一本久道久久综合中文字幕| 欧美天堂一区二区三区| 日本一区二区成人| 日本aⅴ亚洲精品中文乱码| 免费成人小视频| 欧美精品久久99| 日本一区二区三区视频视频| 韩国精品在线观看| 在线一区二区三区四区| 日韩精品一区二区三区蜜臀| 国产精品色哟哟| 成人晚上爱看视频| 中文天堂在线一区| 99国产精品久久| 日韩精品一区在线| 激情成人午夜视频| 国产欧美一区二区三区网站| 成人激情小说网站| 亚洲女同一区二区| 国模套图日韩精品一区二区 | jizzjizzjizz欧美| 日韩精品一区二区三区中文精品| 日本欧美一区二区三区| 91精品国产综合久久国产大片| 国产精品欧美一区喷水| 成人爱爱电影网址| 一区二区三区在线视频免费| 欧美日韩一区二区欧美激情| 免费精品视频在线| 国产日韩欧美制服另类| 色婷婷综合久色| 日韩精品一二三四| 一本大道久久a久久综合| 亚洲综合激情网| 日韩免费成人网| www.av亚洲| 丝袜诱惑亚洲看片| 国产欧美一区二区三区在线看蜜臀 | 成a人片亚洲日本久久| 中文字幕欧美日韩一区| 91亚洲精品久久久蜜桃网站| 欧美成人精品高清在线播放 | 欧美国产欧美综合| 欧洲生活片亚洲生活在线观看| 国产日韩欧美高清在线| 91久久奴性调教| 韩国欧美国产一区| 亚洲综合在线电影| 久久亚区不卡日本| 欧美伊人久久大香线蕉综合69 | 1024国产精品| 欧美一区二区私人影院日本| 国产精品白丝av| 精品剧情在线观看| 在线看国产日韩| 成人妖精视频yjsp地址| 伊人色综合久久天天人手人婷| 99久久99久久精品免费看蜜桃| 婷婷六月综合亚洲| 亚洲欧美视频一区| 久久精品欧美一区二区三区不卡 | 粗大黑人巨茎大战欧美成人| 天天综合天天综合色| 青青草97国产精品免费观看 | 1024成人网| 精品国产乱码久久久久久蜜臀| 视频一区二区不卡| 亚洲天堂精品视频| 国产精品视频在线看| 日韩午夜激情视频| 欧美日韩精品一区二区在线播放| 国产69精品久久99不卡| 久久爱www久久做| 日日嗨av一区二区三区四区| 亚洲最大色网站| 国产精品久久久久久久岛一牛影视| 日韩一区二区免费在线电影| 欧美日韩一卡二卡三卡| 91视视频在线观看入口直接观看www| 国模无码大尺度一区二区三区| 日欧美一区二区| 性久久久久久久久| 欧美精品一区二区三区久久久| 欧美日韩亚洲综合| 欧美羞羞免费网站| 欧美三级三级三级| 欧美日韩一区二区三区在线| 91首页免费视频| 91福利精品视频| 欧美中文一区二区三区| 欧洲色大大久久| 欧美日韩国产一区| 3d成人h动漫网站入口| 国产成人午夜精品5599| 国内外成人在线| 国产福利91精品| www.色精品| 色激情天天射综合网| 久久婷婷色综合| 久久久久久久电影| 精品99久久久久久| 欧美国产精品一区二区| 国产精品短视频| 亚洲在线视频网站| 日本午夜一区二区| 精品一区二区成人精品| 国产大片一区二区| 91欧美一区二区| 欧美日韩精品高清| 精品欧美一区二区久久| 国产欧美日本一区二区三区| 亚洲视频综合在线| 日韩精品成人一区二区在线| 蜜桃av一区二区三区电影| 亚洲欧美色图小说| 天天色综合成人网| 国产精品18久久久久久久网站| 粉嫩aⅴ一区二区三区四区五区| 一本久久综合亚洲鲁鲁五月天| 欧美情侣在线播放| 国产欧美精品一区aⅴ影院| 国产精品久久久久久久久久免费看| 一区二区三区国产精华| 精品一区二区三区欧美| 成人午夜av在线| 欧美人妇做爰xxxⅹ性高电影| 久久久99精品久久| 亚洲午夜av在线| 一区二区在线电影| 久久99久久99| 色婷婷亚洲一区二区三区| 日韩精品一区二区三区中文不卡| 欧美国产成人精品| 日本强好片久久久久久aaa| 成人不卡免费av| 欧美成人a视频| 一区二区欧美精品| 国产河南妇女毛片精品久久久| 欧美亚洲综合色| 国产拍欧美日韩视频二区| 肉丝袜脚交视频一区二区| 国产99精品国产| 欧美一级二级三级乱码| 亚洲乱码国产乱码精品精小说| 精品一区二区三区影院在线午夜| 97久久精品人人做人人爽50路| 欧美一级理论性理论a| 亚洲品质自拍视频| 国产福利视频一区二区三区| 日韩欧美黄色影院| 亚洲国产精品一区二区www在线| 成人性生交大合| 精品国产三级a在线观看| 亚洲大片免费看| 91麻豆6部合集magnet| 国产色产综合色产在线视频 | 国产精品911| 精品日韩欧美在线| 奇米777欧美一区二区| 欧美性色黄大片手机版| 综合久久国产九一剧情麻豆| 国产精品白丝jk白祙喷水网站| 日韩午夜小视频| 免费亚洲电影在线| 欧美老女人在线| 五月开心婷婷久久| 欧美性极品少妇| 亚洲午夜精品网| 欧亚洲嫩模精品一区三区| 日韩不卡手机在线v区| 91国产免费看| 亚洲线精品一区二区三区八戒| 成人av网址在线| 中文一区二区完整视频在线观看| 激情综合五月天|