📄 msdos_sys_mkdir.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_sys_mkdir(const char * pathname){ struct m_inode * temp_dir; struct buffer_head * temp_bh , * temp_bh0; struct msdos_dir_entry * temp_de , * temp_de0; const char * basename;
int temp_namelen, temp_fatno, temp_sector, temp_i;
unsigned long temp_file_datetime;
if (!(temp_dir = msdos_dir_namei(pathname,&temp_namelen,&basename)))
return -1;
if (!change_current_name() || (current_dir_type > 0))
{
msdos_iput(temp_dir);
return -1;
}
if ((temp_bh = msdos_find_entry(temp_dir,&temp_de)) != NULL)
{
srelse(temp_bh);
msdos_iput(temp_dir);
return -1;
}
if (!(temp_bh = msdos_add_entry(temp_dir,&temp_de)))
{
msdos_iput(temp_dir);
return -1;
}
if ((temp_fatno = new_cluster()) <= 0)
{
temp_de->dir_name[0] = 0xe5;
temp_bh->b_dirt = 1;
srelse(temp_bh);
msdos_iput(temp_dir);
return -1;
}
temp_sector = 31 + temp_fatno;
if (!(temp_bh0 = sread(temp_sector,&temp_de0,0x80))) ////0x80 ?? or 0x00 !!
{
free_cluster(temp_fatno);
temp_de->dir_name[0] = 0xe5;
temp_bh->b_dirt = 1;
srelse(temp_bh);
msdos_iput(temp_dir);
return -1;
}
temp_file_datetime = file_datetime;
for (temp_i = 0; temp_i < MSDOS_NAME_LEN; temp_i++)
temp_de0->dir_name[temp_i] = sys_dir_name0[temp_i];
temp_de0->dir_mode = 0x10;
temp_de0->dir_mtime = temp_file_datetime;
temp_de0->dir_firstsector = temp_fatno;
temp_de0->dir_size = 0;
temp_de0++;
for (temp_i = 0; temp_i < MSDOS_NAME_LEN; temp_i++)
temp_de0->dir_name[temp_i] = sys_dir_name1[temp_i];
temp_de0->dir_mode = 0x10;
temp_de0->dir_mtime = temp_file_datetime;
temp_de0->dir_firstsector = temp_dir->i_zone[0];
temp_de0->dir_size = 0;
temp_bh0->b_dirt = 1;
srelse(temp_bh0);
temp_de->dir_mode = 0x10;
temp_de->dir_mtime = temp_file_datetime;
temp_de->dir_firstsector = temp_fatno;
temp_de->dir_size = 0;
temp_bh->b_dirt = 1;
srelse(temp_bh);
msdos_iput(temp_dir);
return 0;
}
int msdos_empty_dir(struct m_inode * dir){ struct buffer_head * temp_bh; struct msdos_dir_entry * temp_de, * temp_de0; int temp_sector, temp_sector0;
temp_sector0 = 0;
if (!(temp_sector = msdos_smap(dir,temp_sector0,0)))
return 0;
if (!(temp_bh = sread(temp_sector, &temp_de, 0x80)))
return 0;
temp_de0 = temp_de;
if (!msdos_match0(temp_de))
{
srelse(temp_bh);
return 0;
}
temp_de++;
if (!msdos_match1(temp_de))
{
srelse(temp_bh);
return 0;
}
temp_de++;
while (1)
{
if (temp_de >= temp_de0 + 16)
{
srelse(temp_bh);
temp_sector0++;
if (!(temp_sector = msdos_smap(dir,temp_sector0,0)))
return 1;
if (!(temp_bh = sread(temp_sector, &temp_de, 0x80)))
return 0;
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))
{
srelse(temp_bh);
return 0;
}
temp_de++;
}
srelse(temp_bh);
return 1;
}
int msdos_sys_rmdir(const char * name){ 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; if (!(temp_dir = msdos_dir_namei(name,&temp_namelen,&basename))) return -1; if (!change_current_name() || !(temp_bh = msdos_find_entry(temp_dir,&temp_de)))
{ msdos_iput(temp_dir); 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));
if (!S_MSDOS_ISDIR(current_dir_entry.dir_mode) || current_dir_type ||
!(temp_inode = msdos_iget(¤t_dir_entry, temp_inr, 0)))
{
srelse(temp_bh);
msdos_iput(temp_dir);
return -1;
}
if ((temp_inode->i_count > 1) || !msdos_empty_dir(temp_inode))
{
msdos_iput(temp_inode);
srelse(temp_bh);
msdos_iput(temp_dir);
return -1;
}
fat_free(temp_inode,0);
temp_inode->i_nlinks = 0;
temp_inode->i_dirt = 1;
msdos_iput(temp_inode);
srelse(temp_bh);
msdos_iput(temp_dir);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -