📄 msdos_find_entry.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 + -