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

📄 msdos_filerw.c

📁 阿基米德操作系统的源代码
💻 C
字号:

/////////////////////////////////////////////////////////////////////
#include "general.h"
#include "s_isdirreg.h"
#include "min_max.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_file_rddir(struct file * filep, char * buf, int length)
{
	struct m_inode			* temp_inodep;
	struct buffer_head		* temp_bh;
	struct msdos_dir_entry	* temp_de;
	int	temp_sector,temp_sector0,temp_offset,temp_left,temp_left0,temp_left1,temp_count,temp_i;

	temp_inodep	= filep->f_inode;
	if ((temp_left = length / (MSDOS_NAME_LEN + 10)) <= 0)
		return 0;
	temp_count = 0;
	while (temp_left)
	{
		temp_sector0 = filep->f_pos / SECTOR_SIZE;
		if (!(temp_sector = msdos_smap(temp_inodep,temp_sector0,0)) ||
			!(temp_bh = sread(temp_sector,&temp_de,0x80)))
		return temp_count;
		temp_offset = filep->f_pos % SECTOR_SIZE;
		temp_left0	= (SECTOR_SIZE - temp_offset) / 32;
		temp_left1	= MIN(temp_left,temp_left0);
		
		temp_de	= (struct msdos_dir_entry *)((unsigned char *)temp_de + temp_offset);
		while (temp_left1)
		{
			if (temp_de->dir_name[0] == 0x00)
			{
				srelse(temp_bh);
				return temp_count;
			}
			if ((temp_de->dir_name[0] != 0xe5) && (temp_de->dir_name[0] != 0x05))
			{
				for (temp_i = 0; temp_i < MSDOS_NAME_LEN; temp_i++)
					current_name[temp_i] = temp_de->dir_name[temp_i];
				change_current_name0();

				for (temp_i = 0; temp_i < MSDOS_NAME_LEN + 1; temp_i++)
					put_gs_byte(current_name[temp_i],buf++);
				put_gs_byte(temp_de->dir_mode,buf++);
				put_gs_long(temp_de->dir_mtime,(long *)buf);
				buf = buf + 4;
				put_gs_long(temp_de->dir_size,(long *)buf);
				buf = buf + 4;
				
				temp_count++;
				temp_left--;
			}
			temp_left0--;
			temp_left1 = MIN(temp_left,temp_left0);
			temp_de++;
			filep->f_pos = filep->f_pos + 32;
		}
		srelse(temp_bh);
	}
	return temp_count;
}

int msdos_file_read(struct file * filep, char * buf, int count)
{
	struct m_inode			* temp_inodep;
	struct buffer_head		* temp_bh;
	struct msdos_dir_entry	* temp_de;
	char					* temp_pChar;
	int	temp_sector,temp_sector0,temp_offset,temp_left,temp_chars;

	temp_inodep = filep->f_inode;
	if ((temp_left = count) <= 0)
		return 0;
	while (temp_left)
	{
		temp_sector0 = filep->f_pos / SECTOR_SIZE;
		if (!(temp_sector = msdos_smap(temp_inodep,temp_sector0,0)) ||
			!(temp_bh = sread(temp_sector,&temp_de,0)))
			break;
		temp_offset = filep->f_pos % SECTOR_SIZE;
		temp_chars	= MIN(SECTOR_SIZE - temp_offset, temp_left);
		filep->f_pos= filep->f_pos + temp_chars;
		temp_left	= temp_left - temp_chars;

		temp_pChar	= (unsigned char *)temp_de + temp_offset;
		while (temp_chars--)
			put_gs_byte(*temp_pChar++,buf++);
		srelse(temp_bh);
	}
	return (count - temp_left);
}

int msdos_file_write(struct file * filep, char * buf, int count)
{
	struct m_inode			* temp_inodep;
	struct buffer_head		* temp_bh;
	struct msdos_dir_entry	* temp_de;
	char					* temp_pChar;
	int				temp_sector, temp_sector0, temp_offset, temp_left, temp_chars;
	unsigned long	temp_pos;

	temp_inodep	= filep->f_inode;
	if ((temp_left = count) <= 0)
		return 0;
	if (filep->f_flag & O_APPEND)
		temp_pos = temp_inodep->i_size;
	else
		temp_pos = filep->f_pos;
	while (temp_left) {
		temp_sector0	= temp_pos / SECTOR_SIZE;
		if (!(temp_sector = msdos_smap(temp_inodep, temp_sector0, 1)) ||
			!(temp_bh = sread(temp_sector, &temp_de,0)))
			break;
		temp_offset = temp_pos % SECTOR_SIZE;
		temp_chars	= MIN(SECTOR_SIZE - temp_offset, temp_left);
		temp_pos	= temp_pos  + temp_chars;
		temp_left	= temp_left - temp_chars;

		temp_pChar	= (unsigned char *)temp_de + temp_offset;
		while (temp_chars--)
			*temp_pChar++ = get_gs_byte(buf++);
		temp_bh->b_dirt = 1;
		srelse(temp_bh);
	}
	if (temp_pos > temp_inodep->i_size)
		temp_inodep->i_size  = temp_pos;
	temp_inodep->i_mtime	= file_datetime;
	temp_inodep->i_dirt		= 1;

	if (!(filep->f_flag & O_APPEND))
		filep->f_pos = temp_pos;

	return (count - temp_left);
}
int msdos_sys_lseek(unsigned int fd, int offset, int origin){	struct file    * temp_filep;
	struct m_inode * temp_inodep;	if ((fd >= NR_FILE) || (file_table[fd].f_count == 0))
		return -1;
	temp_filep	= &file_table[fd];
	temp_inodep	= temp_filep->f_inode;
	if (!temp_inodep)
		return -1;

	switch (origin) {		case 0:			if (offset < 0) 
				return -1;			temp_filep->f_pos = offset;			break;		case 1:			if (temp_filep->f_pos + offset < 0) 
				return -1;			temp_filep->f_pos = temp_filep->f_pos + offset;			break;		case 2:			if (temp_inodep->i_size + offset < 0) 
				return -1;			temp_filep->f_pos = temp_inodep->i_size + offset;			break;		default:			return -1;	}	return temp_filep->f_pos;}
int msdos_sys_rddir(char * buf,int length)
{
	struct file    * temp_filep;
	struct m_inode * temp_inodep;

	if (dir_file.f_count == 0)
		return -1;
    temp_filep	= &dir_file;
	temp_inodep	= temp_filep->f_inode;
	if (!buf || !temp_inodep || !S_MSDOS_ISDIR(temp_inodep->i_mode))
		return -1;
	if ((length <= 0) || (temp_filep->f_pos % 32))
		return 0;

	return msdos_file_rddir(temp_filep,buf,length);
}
int msdos_sys_read(unsigned int fd,char * buf,int count){	struct file    * temp_filep;	struct m_inode * temp_inodep;	if ((fd >= NR_FILE) || (file_table[fd].f_count == 0))
		return -1;	temp_filep	= &file_table[fd];
	temp_inodep	= temp_filep->f_inode;
	if (!buf || !temp_inodep || !(temp_filep->f_flag & O_RDONLY) || !S_MSDOS_ISREG(temp_inodep->i_mode))
		return -1;
	if (count <= 0)
		return 0;	if (temp_filep->f_pos + count > temp_inodep->i_size)		count = temp_inodep->i_size - temp_filep->f_pos;	if (count <= 0)		return 0;	return msdos_file_read(temp_filep,buf,count);}int msdos_sys_write(unsigned int fd,char * buf,int count){	struct file    * temp_filep;	struct m_inode * temp_inodep;		if ((fd >= NR_FILE) || (file_table[fd].f_count == 0))
		return -1;
	temp_filep	= &file_table[fd];
	temp_inodep	= temp_filep->f_inode;
	if (!buf || !temp_inodep || !(temp_filep->f_flag & O_WRONLY) || !S_MSDOS_ISREG(temp_inodep->i_mode))
		return -1;
	if (count <= 0)
		return 0;

	return msdos_file_write(temp_filep,buf,count);}

⌨️ 快捷键说明

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