📄 sys_chdriver.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 + -