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

📄 sys_chdriver.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 sys_chdriver(long new_driver, unsigned char * buf, unsigned long length)
{
	struct m_inode * temp_inode;
	unsigned char	 temp_path[256];
	unsigned char  * temp_pChar;
	unsigned char  * temp_buf;
	int				 i,j;

	if ((new_driver >= nr_super_blocks) || !buf || (length < 256))
		return -1;
	///////////////////////////////////////////////////////////////
	if (current_driver == 0)
	{
		msdos_iput(current_pwd);
		current_root->i_count++;
		current_pwd = current_root;
	}
	the_super_block[current_driver].s_driver_root = current_root;
	the_super_block[current_driver].s_driver_pwd  = current_pwd;

	for (i = 0; i <= current_pwd_pathlength; i++)
		pwd_path_table[current_driver][i] = current_pwd_path[i];
	pwd_pathlength_table[current_driver] = current_pwd_pathlength;
	///////////////////////////////////////////////////////////////
	current_root = the_super_block[new_driver].s_driver_root;
	current_pwd  = the_super_block[new_driver].s_driver_pwd;

	current_root_pathlength = root_pathlength_table[new_driver];
	current_pwd_pathlength	= pwd_pathlength_table[new_driver];
	for (i = 0; i <= current_root_pathlength; i++)
		current_root_path[i] = root_path_table[new_driver][i];
	for (i = 0; i <= current_pwd_pathlength; i++)
	{
		current_pwd_path[i]	 = pwd_path_table[new_driver][i];
		temp_path[i]		 = current_pwd_path[i];
	}

	i	= current_pwd_pathlength;
	while (i)
	{
		j = temp_path[i];
		temp_path[i] = '\\';
		i = j;
	}

	current_driver = new_driver;
	if (current_driver == 0)
	{
		floppy_workstate = 1;
		if (msdos_read_super())
		{
			temp_pChar	= temp_path;
			temp_buf	= buf;
			temp_pChar++;
			temp_pChar++;
			for (i = 2; i <= current_pwd_pathlength; i++) 
				put_gs_byte(*temp_pChar++, temp_buf++);
			put_gs_byte(0, temp_buf++);

			if (!(temp_inode = msdos_namei(buf)))
				current_pwd_pathlength = 2;
			else if (!S_MSDOS_ISDIR(temp_inode->i_mode)) 
			{
				msdos_iput(temp_inode);
				current_pwd_pathlength = 2;
			}
			else
			{
				msdos_iput(current_pwd);
				current_pwd = temp_inode;
			}
		}
		else
			current_pwd_pathlength = 2;
		if (floppy_workstate != 1)
			invalid_fd(1);
	}

	temp_pChar	= temp_path;
	temp_buf	= buf;
	put_gs_byte(0x0d,temp_buf++);
	put_gs_byte(0x0a,temp_buf++);
	for (i = 0; i <= current_pwd_pathlength; i++) 
		put_gs_byte(*temp_pChar++, temp_buf++);
	put_gs_byte('>', temp_buf++);
	put_gs_byte(0, temp_buf++);
	///////////////////////////////////////////////////////////////
	return (current_pwd_pathlength + 2);
}int sys_reload(void)
{
	if (current_driver)
		return 0;
	if (current_pwd != current_root)
	{
		memset(current_pwd,0,sizeof(*current_pwd));
		current_root->i_count++;
		current_pwd = current_root;
		current_pwd_pathlength = 2;
	}

	floppy_workstate = 1;
	msdos_read_super();

	if (floppy_workstate != 1)
		invalid_fd(1);

	return 0;
}

int sys_getpath(unsigned char * buf, unsigned long length, unsigned long * driver_ptr)
{
	unsigned char	 temp_path[256];
	unsigned char  * temp_pChar;
	unsigned char  * temp_buf;
	int				 i,j;

	if (!buf || (length < 256))
		return -1;

	if (driver_ptr != NULL)
		put_gs_long(current_driver,(long *)driver_ptr);

	for (i = 0; i <= current_pwd_pathlength; i++)
		temp_path[i]	= current_pwd_path[i];

	i	= current_pwd_pathlength;
	while (i)
	{
		j = temp_path[i];
		temp_path[i] = '\\';
		i = j;
	}

	temp_pChar	= temp_path;
	temp_buf	= buf;
	put_gs_byte(0x0d,temp_buf++);
	put_gs_byte(0x0a,temp_buf++);
	for (i = 0; i <= current_pwd_pathlength; i++) 
		put_gs_byte(*temp_pChar++, temp_buf++);
	put_gs_byte('>', temp_buf++);
	put_gs_byte(0, temp_buf++);

	return (current_pwd_pathlength + 2);
}

int sys_getsize(unsigned int fd)
{
	if ((fd >= NR_FILE) || (file_table[fd].f_count == 0) || (file_table[fd].f_inode == NULL))
		return -1;

	return file_table[fd].f_inode->i_size;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -