📄 msdos_open_namei.c
字号:
///////////////////////////////////////////////////////////////////////////////////////////////
#include "general.h"
#include "s_isdirreg.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"
///////////////////////////////////////////////////////////////////////////////////////////////
int msdos_open_namei(const char * pathname, unsigned char flag, unsigned char mode,struct m_inode ** res_inode,
unsigned char * buf,unsigned long length)
{
struct m_inode * temp_dir, * temp_inode;
struct buffer_head * temp_bh;
struct msdos_dir_entry * temp_de;
const char * basename;
unsigned long temp_idev, temp_inr, temp_namelen;
int temp_fatno;
char temp_char;
*res_inode = NULL;
if (!(temp_dir = msdos_dir_namei(pathname,&temp_namelen,&basename)))
return 0;
if (!temp_namelen || !change_current_name() || (current_dir_type > 0))
{
msdos_iput(temp_dir);
return 0;
}
////////////////////////////////////////////////
if (buf != NULL)
{
while ((temp_char = get_gs_byte(basename++)) != 0)
put_gs_byte(temp_char,buf++);
put_gs_byte(0,buf++);
}
////////////////////////////////////////////////
temp_bh = msdos_find_entry(temp_dir, &temp_de);
if (!temp_bh) {
if (!(flag & O_CREAT) || (mode & 0xf8) || !(temp_inode = get_empty_inode()))
{
msdos_iput(temp_dir);
return 0;
}
if (!(temp_bh = msdos_add_entry(temp_dir,&temp_de)))
{
temp_inode->i_count = 0;
msdos_iput(temp_dir);
return 0;
}
if ((temp_fatno = new_cluster()) == -1)
{
temp_de->dir_name[0] = 0xe5;
temp_bh->b_dirt = 1;
srelse(temp_bh);
temp_inode->i_count = 0;
msdos_iput(temp_dir);
return 0;
}
if (mode & I_WRITE)
mode = 0x00;
else
mode = 0x01;
temp_de->dir_mode = mode;
temp_de->dir_mtime = file_datetime;
temp_de->dir_firstsector = temp_fatno;
temp_de->dir_size = 0;
temp_bh->b_dirt = 1;
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);
msdos_iput(temp_dir);
*res_inode = temp_inode;
return 1;
}
current_dir_entry = *temp_de;
temp_idev = 0;
temp_inr = temp_bh->b_blocknr * BLOCK_SIZE + ((unsigned long)temp_de) - ((unsigned long)(temp_bh->b_data));
srelse(temp_bh);
msdos_iput(temp_dir);
if ((flag & O_EXCL) || !S_MSDOS_ISREG(current_dir_entry.dir_mode) || ((flag & O_WRONLY) && (current_dir_entry.dir_mode & 0x01)) ||
!(temp_inode = msdos_iget(¤t_dir_entry,temp_inr,0)))
return 0;
if (flag & O_TRUNC)
{
if (temp_inode->i_count > 1)
{
msdos_iput(temp_inode);
return 0;
}
fat_free(temp_inode, 1);
temp_inode->i_mtime = file_datetime;
temp_inode->i_size = 0;
temp_inode->i_dirt = 1;
msdos_iput(temp_inode);
temp_inode->i_count++;
do_clrsector(temp_inode->i_zone[0]);
}
*res_inode = temp_inode;
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -