⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msdos_iget.c

📁 阿基米德操作系统的源代码
💻 C
字号:

//////////////////////////////////////////////////////////////////////////////////////////
#include "general.h"

#include "hd_info_struct.h"
#include "dir_entry.h"
#include "msdos_dir_entry.h"
#include "d_inode.h"
#include "m_inode.h"
#include "buffer_head.h"
#include "fat_cache.h"
#include "file.h"
#include "hd_request_struct.h"
#include "super_block.h"

#include "common_head.h"
//////////////////////////////////////////////////////////////////////////////////////////
struct buffer_head * msdos_iget0(int dir_firstsector, struct msdos_dir_entry ** res_dir)
{
	struct buffer_head		* temp_bh;
	struct msdos_dir_entry  * temp_de, * temp_de0;
	int    temp_sector;

	*res_dir = NULL;
	if (!dir_firstsector)
		return NULL;

	temp_sector = dir_firstsector + 31;
	if (!(temp_bh = sread(temp_sector, &temp_de, 0x80)))
		return NULL;
	temp_de++;
	temp_sector = temp_de->dir_firstsector;
	srelse(temp_bh);

	msdos_smap0(temp_sector);
	if (!(temp_sector = msdos_smap1()))
		return NULL;
	if (!(temp_bh = sread(temp_sector,&temp_de,0x80)))
		return NULL;
	temp_de0	= temp_de;
	while (1)
	{
		if (temp_de >= temp_de0 + 16)
		{
			srelse(temp_bh);
			if (!(temp_sector = msdos_smap1()))
				return NULL;
			if (!(temp_bh = sread(temp_sector,&temp_de,0x80)))
				return NULL;
			temp_de0 = temp_de;
		}
		if (temp_de->dir_name[0] == 0)
			break;
		if ((temp_de->dir_name[0] != 0xe5) && (temp_de->dir_name[0] != 0x05) && (temp_de->dir_firstsector == dir_firstsector))
			{
				*res_dir = temp_de;
				return temp_bh;
			}
		temp_de++;
	}
	srelse(temp_bh);
	return NULL;
}

struct m_inode * msdos_iget(struct msdos_dir_entry * de, unsigned long inr, int parent_flag)
{
	struct m_inode * temp_inode;
	struct buffer_head * temp_bh;
	struct msdos_dir_entry * temp_de;
	int	   temp_firstsector;

	temp_firstsector	= de->dir_firstsector;

	temp_inode = inode_table;
	while (temp_inode < inode_table + NR_INODE) {
		if (temp_inode->i_dev == 0 && temp_inode->i_num && temp_inode->i_zone[0] == temp_firstsector) {
			temp_inode->i_count++;
			return temp_inode;
		}
		temp_inode++;
	}
	temp_inode = get_empty_inode();
	if (!temp_inode)
		return NULL;
	
	if (parent_flag)
	{
		if (!(temp_bh = msdos_iget0(temp_firstsector,&temp_de)))
		{
			temp_inode->i_count		= 0;
			return NULL;
		}
		else
		{
			temp_inode->i_mode		= temp_de->dir_mode;
			temp_inode->i_nlinks	= 1;
			temp_inode->i_mtime		= temp_de->dir_mtime;
			temp_inode->i_size		= temp_de->dir_size;
			temp_inode->i_zone[0]	= temp_de->dir_firstsector;
			temp_inode->i_dev		= 0;
			temp_inode->i_num		= temp_bh->b_blocknr * BLOCK_SIZE + ((unsigned long)temp_de) - ((unsigned long)(temp_bh->b_data));
			srelse(temp_bh);
		}
	}
	else
	{
		temp_inode->i_mode		= de->dir_mode;
		temp_inode->i_nlinks	= 1;
		temp_inode->i_mtime		= de->dir_mtime;
		temp_inode->i_size		= de->dir_size;
		temp_inode->i_zone[0]	= de->dir_firstsector;
		temp_inode->i_dev		= 0;
		temp_inode->i_num		= inr;	
	}

	return temp_inode;
}

void msdos_iput(struct m_inode * inode)
{
	struct buffer_head * temp_bh;
	struct msdos_dir_entry * temp_de;
	unsigned long temp_block, temp_offset;
	
	if (!inode || (!inode->i_count))
		return;
	inode->i_count--;
	if (inode->i_count)
		return;
	if (inode->i_dirt || !inode->i_nlinks)
	{
		temp_block	= inode->i_num;
		temp_offset	= temp_block % BLOCK_SIZE;
		temp_block	= temp_block / BLOCK_SIZE;
		if (!(temp_bh	= bread(0,temp_block,0x80)))
			return;
		temp_de	= (struct msdos_dir_entry *)(temp_bh->b_data + temp_offset);
		if (inode->i_dirt)
		{
			temp_de->dir_mode			=	inode->i_mode;
			temp_de->dir_mtime			=	inode->i_mtime;
			temp_de->dir_firstsector	=	inode->i_zone[0];
			temp_de->dir_size			=	inode->i_size;
			temp_bh->b_dirt				=   1;
			inode->i_dirt				=	0;
		}
		if (!inode->i_nlinks)
		{
			temp_de->dir_name[0]		= 0xe5;
			temp_bh->b_dirt				= 1;
			memset(inode,0,sizeof(*inode));
		}
		brelse(temp_bh);
	}
	return;
}

/////////////////////////////////////////////////////////////////////
int msdos_read_inode(struct m_inode * inode)
{
	struct buffer_head * temp_bh;
	struct msdos_dir_entry * temp_de;
	unsigned long temp_block, temp_offset;
	
	if (!inode || (inode->i_dev != 0) || (inode->i_num <= MSDOS_ROOT_INO))
		return 0;
	temp_block	= inode->i_num;
	temp_offset	= temp_block % BLOCK_SIZE;
	temp_block	= temp_block / BLOCK_SIZE;
	if (!(temp_bh	= bread(0,temp_block,0x80)))
		return 0;
	temp_de	= (struct msdos_dir_entry *)(temp_bh->b_data + temp_offset);

	inode->i_mode		= temp_de->dir_mode;
	inode->i_nlinks		= 1;
	inode->i_mtime		= temp_de->dir_mtime;
	inode->i_size		= temp_de->dir_size;
	inode->i_zone[0]	= temp_de->dir_firstsector;

	brelse(temp_bh);
	inode->i_dirt		= 0;
	return 1;
}

int msdos_write_inode(struct m_inode * inode)
{
	struct buffer_head * temp_bh;
	struct msdos_dir_entry * temp_de;
	unsigned long temp_block, temp_offset;
	
	if (!inode || (inode->i_dev != 0) || (inode->i_num <= MSDOS_ROOT_INO))
		return 0;
	if (inode->i_dirt == 0)
		return 1;
	temp_block	= inode->i_num;
	temp_offset	= temp_block % BLOCK_SIZE;
	temp_block	= temp_block / BLOCK_SIZE;
	if (!(temp_bh	= bread(0,temp_block,0x80)))
		return 0;
	temp_de	= (struct msdos_dir_entry *)(temp_bh->b_data + temp_offset);

	temp_de->dir_mode			=	inode->i_mode;
	temp_de->dir_mtime			=	inode->i_mtime;
	temp_de->dir_firstsector	=	inode->i_zone[0];
	temp_de->dir_size			=	inode->i_size;
	temp_bh->b_dirt				=   1;
	brelse(temp_bh);
	inode->i_dirt				=	0;
	return 1;
}
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -