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

📄 msdos_find_entry.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_find_entry(struct m_inode * dir, struct msdos_dir_entry ** res_dir)
{
	struct buffer_head		* temp_bh;
	struct msdos_dir_entry  * temp_de, * temp_de0;
	int    temp_sector, temp_sector0;

	*res_dir = NULL;

	temp_sector0	= 0;
	temp_sector		= msdos_smap(dir,temp_sector0,0);
	if (!temp_sector)
		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);

			temp_sector0++;
			temp_sector	= msdos_smap(dir,temp_sector0,0);
			if (!temp_sector)
				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))
			if (msdos_match(temp_de))
			{
				*res_dir = temp_de;
				return temp_bh;
			}
		temp_de++;
	}
	srelse(temp_bh);
	return NULL;
}

struct buffer_head * msdos_add_entry(struct m_inode * dir, struct msdos_dir_entry ** res_dir)
{
	struct buffer_head		* temp_bh;
	struct msdos_dir_entry  * temp_de, * temp_de0;
	int    temp_sector, temp_sector0;
	int	   temp_i;

	*res_dir = NULL;

	temp_sector0	= 0;
	temp_sector		= msdos_smap(dir,temp_sector0,0);
	if (!temp_sector)
		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);

			temp_sector0++;
			temp_sector	= msdos_smap(dir,temp_sector0,1);
			if (!temp_sector)
				return NULL;
			if (!(temp_bh = sread(temp_sector,&temp_de,0x80)))
				return NULL;
			temp_de0	= temp_de;
		}

		if ((temp_de->dir_name[0] == 0xe5) || (temp_de->dir_name[0] == 0))
		{
			for (temp_i = 0; temp_i < MSDOS_NAME_LEN; temp_i++)
				temp_de->dir_name[temp_i] = current_name[temp_i];
			temp_bh->b_dirt	= 1;
			*res_dir	= temp_de;
			return temp_bh;
		}
		temp_de++;
	}
	srelse(temp_bh);
	return NULL;
}


⌨️ 快捷键说明

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