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

📄 msdos_sys_mkdir.c

📁 阿基米德操作系统的源代码
💻 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(&current_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 + -