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 + -
显示快捷键?