open.c
来自「参照MINIX3写的操作系统 用GCC+NASM+BOCHS开发」· C语言 代码 · 共 245 行
C
245 行
#include "../kernel.h"
#include "FileSystem.h"
#define DIRTORY 1
#define NORMAL 2
#define NR_FILPS 100
extern t_32 AllotInode(LPSuper Super);
extern LPInodeBuffer GetInode(unsigned long InodeNumber);
extern t_32 GetDirectory(t_32 FatherInodeNumber,char *Name);
extern t_bool AddDirectory(t_32 FatherInodeNumber,char *Name,t_32 ChildInodeNumber,t_32 Device);
extern t_32 ReadFile(LPInode pInode,t_32 StartPosition,t_32 Count,t_8 Mode,t_32 Dest);
extern t_32 WriteFile(LPSuper Super,LPInode pInode,t_32 Count,t_8 Mode,t_32 Dest);
//文件描述符
struct s_Filp {
t_16 Mode;//文件类型和访问权限
t_16 Count;//访问此文件的进程数
LPInodeBuffer pInodeBuffer;//文件的I结点
t_32 FilePos;//文件当前的位置
};
struct s_Filp Filp[NR_FILPS];
int FindFreeFilp()
{
int i=0;
for(i=0;i<NR_FILPS;i++)
if(Filp[i].Count==0)
return i;
return NULL;
}
/*
pickName:从oldName中提取第index个名字(以'/'为分隔符),结果保存在newName中
oldName:
newName:
index:
*/
PRIVATE void pickName(char *oldName,char *newName ,int index)
{
int i=0;
if(*oldName!='/')
return ;
oldName++;
for(i=1;i<index;i++)
{
while(*oldName!='/')
{
oldName++;
if(*oldName=='\0')
return ;
}
oldName++;
}
while(*oldName!='/'&&*oldName!='\0')
{
*newName=*oldName;
newName++;
oldName++;
}
*newName='\0';
}
/*
countName:计算name里面名字的个数(以'/'为分隔符)
name:
*/
t8 countName(char *name)
{
int i=0;
*name++;
while(*name!='\0')
{
if(*name=='/')
i++;
name++;
}
return i+1;
}
/*
createFile:创建文件
fileName :文件名(包含路径)
mode :文件模式
返回值 :成功返回大于等于0的整数,失败返回 -1
*/
int createFile(char *fileName, t8 mode )
//文件名(含路径),文件属性
{
int maxName=0;
int i=1;
char newName[32];
t32 fatherInodeNumber=2;
t32 newInode;
int handle;
LPInodeBuffer pInodeBuffer;
maxName=countName(fileName);
printk("maxName:%d\n",maxName);
for(i=1;i<maxName;i++)
{
pickName(fileName,newName ,i);
printk("fatherInodeNumber:%d\n",fatherInodeNumber);
printk("newName %s\n",newName);
printk("GetDirectory(fatherInodeNumber,newName) %d\n",GetDirectory(fatherInodeNumber,newName));
fatherInodeNumber=GetDirectory(fatherInodeNumber,newName);
if(fatherInodeNumber==ERROR)
{
printk("CreateFile FatherInodeNumber==0\n");
return -1;
}
}
pickName(fileName,newName ,i);
newInode=AllotInode(GetSuper());
if(AddDirectory(fatherInodeNumber,newName,newInode,0)== ERROR)
{
printk("CreateFile AddDirectory==0\n");
return -1;
}
handle=FindFreeFilp();
pInodeBuffer=GetInode(newInode);
printk("NewInode:%d\n",newInode);
//printk("GetInode(NewInode):%x\n",GetInode(NewInode));
//printk("GetInode(NewInode):%x\n",GetInode(NewInode));
Filp[handle].Count=1;
Filp[handle].pInodeBuffer=pInodeBuffer;
printk("Filp[Handle].pInodeBuffer=%x\n",Filp[handle].pInodeBuffer);
if(Filp[handle].pInodeBuffer==0)
{
printk("CreateFile Filp[handle].pInodeBuffer==NULL\n");
return -1;
}
Filp[handle].FilePos=0;
Filp[handle].Mode=mode;
return handle ;
}
/*
open:打开文件
fileName :文件名(包含路径)
mode :文件模式
返回值 :成功返回大于等于0的整数,失败返回 -1
*/
int open(char *fileName, t8 mode )
{
int maxName=0;
int i=0;
char newName[32];
t_32 fatherInodeNumber=2;
int handle;
LPInodeBuffer pInodeBuffer;
maxName=countName(fileName);
pickName(fileName,newName ,1);
for(i=1;i<=maxName;i++)
{
pickName(fileName,newName ,i);
fatherInodeNumber=GetDirectory(fatherInodeNumber,newName);
if(fatherInodeNumber==ERROR)
{
printk("fatherInodeNumber==0\n");
return -1;
}
}
handle=FindFreeFilp();
pInodeBuffer=GetInode(fatherInodeNumber);
printk("fatherInodeNumber:%d\n",fatherInodeNumber);
// printk("GetInode(FatherInodeNumber):%x\n",GetInode(FatherInodeNumber));
// printk("GetInode(FatherInodeNumber):%x\n",GetInode(FatherInodeNumber));
Filp[handle].Count++;
Filp[handle].pInodeBuffer=pInodeBuffer;
printk("Filp[Handle].pInodeBuffer=%x\n",Filp[handle].pInodeBuffer);
if(Filp[handle].pInodeBuffer==0)
{
printk("Filp[handle].pInodeBuffer==NULL\n");
return -1;
}
Filp[handle].FilePos=0;
Filp[handle].Mode=mode;
return handle ;
}
t32 sysReadFile(int handle,t32 buffer,t32 size)
{
t_32 filePos=0;
if(handle<0)
return -1;
if(Filp[handle].Count==0)
{
printk("The Filp Count is zero\n");
return -1;
}
if(Filp[handle].pInodeBuffer==NULL)
{
printk("The InodeBuffer is NULL\n");
return -1;
}
filePos=ReadFile(Filp[handle].pInodeBuffer->FileInode,Filp[handle].FilePos,size,Filp[handle].Mode,buffer);
Filp[handle].FilePos+=filePos;
return filePos;
}
t32 sysWriteFile(int handle,t32 buffer,t32 size)
{
t_32 filePos=0;
if(handle<0 )
return -1;
LPInodeBuffer pInodeBuffer=Filp[handle].pInodeBuffer;
if(Filp[handle].Count==0)
{
printk("The Filp Count is zero\n");
return -1;
}
if(pInodeBuffer==NULL)
{
printk("The InodeBuffer is NULL\n");
return -1;
}
printk("Filp[handle].pInodeBuffer=%x\n",Filp[handle].pInodeBuffer);
printk("pInodeNumber %d\n\n",Filp[handle].pInodeBuffer->InodeNumber);
filePos=WriteFile(GetSuper(),Filp[handle].pInodeBuffer->FileInode,size,Filp[handle].Mode,buffer);
Filp[handle].pInodeBuffer->Dirty=DIRTY;
printk("pInode->FileSize %d\n",Filp[handle].pInodeBuffer->FileInode->FileSize);
printk("pInodeNumber %d\n\n",Filp[handle].pInodeBuffer->InodeNumber);
//FreeInodeBuffer(Filp[handle].pInodeBuffer);
Filp[handle].FilePos+=filePos;
return filePos;
}
t_32 sysSeek(int Handle,t_32 Offset)
{
if(Filp[Handle].Count==0)
{
printk("The Filp Count is zero\n");
return -1;
}
if(Offset>Filp[Handle].pInodeBuffer->FileInode->FileSize)
return -1;
Filp[Handle].FilePos=Offset;
return Offset;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?