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