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

📄 msdos_open_namei.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_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(&current_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 + -