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

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

?? ext2fs.c

?? 嵌入式試驗箱S3C2410的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 (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一区二区三区免费野_久草精品视频
亚洲一区二区三区四区五区黄| 国产亚洲精品久| 99麻豆久久久国产精品免费| 久久精品国产久精国产爱| 一区二区成人在线观看| 国产精品国产三级国产| 欧美国产禁国产网站cc| 日本一区二区视频在线观看| 国产夜色精品一区二区av| 国产日韩欧美电影| 亚洲国产成人一区二区三区| 国产午夜精品久久久久久久| 久久精品亚洲精品国产欧美kt∨| 久久精品视频在线免费观看| 国产日产欧产精品推荐色| 国产亚洲精久久久久久| 中日韩av电影| 悠悠色在线精品| 日韩国产精品久久久| 久久电影网站中文字幕| 国产精品一区二区免费不卡| 不卡的av网站| 欧美三级韩国三级日本三斤| 日韩精品一区二区在线观看| 久久精品欧美日韩精品| 亚洲欧美日韩在线| 视频一区视频二区中文| 国产专区欧美精品| 欧美三区在线观看| 精品国产乱码久久久久久免费| 久久精品一区二区三区av| 亚洲乱码国产乱码精品精小说| 亚洲高清免费视频| 国产精品一区二区男女羞羞无遮挡 | 成人午夜免费av| 一本色道**综合亚洲精品蜜桃冫| 欧美亚洲动漫精品| 精品乱码亚洲一区二区不卡| 国产精品美女久久久久久久| 天堂久久久久va久久久久| 国产一区在线看| 欧美系列日韩一区| 久久影院视频免费| 一区二区三区电影在线播| 人人爽香蕉精品| 色综合久久中文综合久久97| 日韩精品自拍偷拍| 亚洲午夜影视影院在线观看| 国产精品白丝jk白祙喷水网站| 日本韩国一区二区三区视频| 久久久久久9999| 视频一区二区中文字幕| 91免费观看国产| 精品日韩欧美一区二区| 亚洲高清久久久| av在线免费不卡| 久久久久国产成人精品亚洲午夜| 亚洲成人动漫av| 99精品黄色片免费大全| 久久综合一区二区| 日韩制服丝袜先锋影音| 91丝袜高跟美女视频| 国产免费观看久久| 精品亚洲免费视频| 日韩欧美一卡二卡| 日日摸夜夜添夜夜添精品视频| 色婷婷国产精品综合在线观看| 久久久亚洲欧洲日产国码αv| 日韩高清欧美激情| 欧美人伦禁忌dvd放荡欲情| 亚洲人123区| 99re亚洲国产精品| 国产精品久久久久久久岛一牛影视| 国产一区二区免费看| 欧美本精品男人aⅴ天堂| 日韩精品电影在线观看| 欧美理论在线播放| 午夜成人免费电影| 欧美精品xxxxbbbb| 午夜电影一区二区三区| 欧美网站一区二区| 亚洲电影第三页| 69堂成人精品免费视频| 日韩黄色免费电影| 日韩一区二区电影网| 秋霞电影网一区二区| 欧美大片在线观看| 国产一区二区三区在线观看免费| 精品国产一区二区三区av性色| 九九九精品视频| 久久色视频免费观看| 国产一区二区三区日韩| 国产精品系列在线| 在线视频国内自拍亚洲视频| 天堂久久久久va久久久久| 在线不卡一区二区| 麻豆91在线观看| 欧美国产激情二区三区| 91在线视频播放地址| 亚洲国产精品天堂| 精品国产一区久久| 91在线观看高清| 亚洲成人av电影| 欧美成人国产一区二区| 不卡一区中文字幕| 午夜精品久久久| 久久影院午夜论| 色先锋资源久久综合| 日本 国产 欧美色综合| 国产精品水嫩水嫩| 欧美精品久久一区| 成人做爰69片免费看网站| 亚洲最大成人网4388xx| 欧美刺激脚交jootjob| av亚洲精华国产精华精| 日韩一区欧美二区| 亚洲品质自拍视频网站| 欧美电影免费提供在线观看| 91美女片黄在线观看91美女| 美女一区二区三区在线观看| 国产精品久99| 欧美成人三级电影在线| 日本乱人伦一区| 国产伦精一区二区三区| 午夜视频一区二区三区| 国产欧美日韩在线视频| 日韩一区二区在线免费观看| youjizz久久| 韩国精品在线观看| 午夜欧美电影在线观看| 国产精品嫩草影院av蜜臀| 精品剧情v国产在线观看在线| 色综合久久天天| 国产精品亚洲专一区二区三区| 午夜国产精品影院在线观看| 中文字幕一区二区日韩精品绯色| 精品国产乱码久久久久久老虎| 精品视频一区三区九区| jlzzjlzz欧美大全| 国产乱理伦片在线观看夜一区| 亚洲成人av在线电影| 亚洲精品欧美在线| 中文字幕人成不卡一区| 国产视频一区在线播放| 26uuu久久综合| 欧美一区午夜视频在线观看| 欧美日韩亚洲综合一区二区三区| 972aa.com艺术欧美| 成人av在线一区二区三区| 国产精品伊人色| 国产一区二区三区最好精华液| 九九九精品视频| 国产综合色产在线精品| 激情文学综合插| 国产麻豆成人传媒免费观看| 极品少妇一区二区| 国内精品自线一区二区三区视频| 麻豆传媒一区二区三区| 免费成人深夜小野草| 日本va欧美va瓶| 久久69国产一区二区蜜臀| 蜜桃一区二区三区在线| 精品在线一区二区| 国产在线播放一区| 国产福利电影一区二区三区| 国产不卡视频一区二区三区| www.在线欧美| 欧美性猛交xxxxxxxx| 4438x成人网最大色成网站| 欧美一区二区免费视频| 亚洲精品一区二区三区99| 久久麻豆一区二区| 亚洲天堂精品视频| 午夜欧美一区二区三区在线播放| 青草av.久久免费一区| 国产自产2019最新不卡| eeuss鲁片一区二区三区在线观看| 色呦呦日韩精品| 欧美日高清视频| 久久久五月婷婷| 亚洲丝袜自拍清纯另类| 婷婷亚洲久悠悠色悠在线播放| 麻豆国产精品官网| 99久久精品免费| 91精品一区二区三区久久久久久| 精品久久久久99| 亚洲精品国产精品乱码不99| 日韩av电影免费观看高清完整版| 国产专区综合网| 欧洲av在线精品| 日韩久久久精品| 自拍偷在线精品自拍偷无码专区| 日本欧美一区二区在线观看| 国产成人aaa| 欧美肥妇bbw| 中文av字幕一区| 亚洲va在线va天堂| 成人综合日日夜夜| 91精品国产综合久久精品性色| 国产精品久久久久久久第一福利|