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

📄 file_capability.c

📁 国内一位牛人自己开发的操作系统
💻 C
字号:

#include"kernel.h"

void init_file_information()
{
	int i,j;
	struct system_file_information *info;

	for(i=0;i<MEMORY_BODY_NUMBER;i++){
		info=&(os->system_file[i]);
		info->semaphore_id=(-1);
		for(j=0;j<FILE_NUMBER;j++){
			info->system_file[j].right=NO_ACCESS_RIGHT;
			RESET_CAPABILITY(info->system_file[j].
				capability);
		}
	};
	for(i=0;i<PROCESS_NUMBER;i++)
		for(j=0;j<USER_FILE_NUMBER;j++){
			os->process[i].file[j].memory_body_id=(-1);
			os->process[i].file[j].system_file_id=(-1);
			os->process[i].file[j].map_length=(-1);
			os->process[i].file[j].right=NO_ACCESS_RIGHT;
			RESET_CAPABILITY(os->process[i].file[j].
				capability);
		}
	for(i=0;i<THREAD_NUMBER;i++)
		for(j=0;j<USER_FILE_NUMBER;j++){
			os->thread[i].file[j].memory_body_id=(-1);
			os->thread[i].file[j].system_file_id=(-1);
			os->thread[i].file[j].map_length=(-1);
			os->thread[i].file[j].right=NO_ACCESS_RIGHT;
			RESET_CAPABILITY(os->thread[i].file[j].
				capability);
		}
	return;
}

int set_system_file_capability(
	int memory_body_id,int file_id,int right,
	struct capability *capability)
{
	struct system_file_information *s_i;
	struct capability *c;

	if((memory_body_id<0)||(memory_body_id>=MEMORY_BODY_NUMBER))
		return -1;
	if((file_id<0)||(file_id>=FILE_NUMBER))
		return -1;

	s_i=&(os->system_file[memory_body_id]);
	c=&(s_i->system_file[file_id].capability);
	COPY_CAPABILITY((*capability),(*c));
	s_i->system_file[file_id].right=right;
	return file_id;
}

int set_thread_file_capability(
	int thread_id,int thread_file_id,int map_length,int right,
	struct capability *file_capability,
	int memory_body_id,int file_id)
{
	struct user_file_information *u_i;

	if((thread_id<0)||(thread_id>=THREAD_NUMBER))
		return -1;
	if((thread_file_id<0)||(thread_file_id>=USER_FILE_NUMBER))
		return -2;
	if((memory_body_id<0)||(memory_body_id>=MEMORY_BODY_NUMBER))
		return -3;
	if((file_id<0)||(file_id>=FILE_NUMBER))
		return -4;

	
	u_i=&(os->thread[thread_id].file[thread_file_id]);
	u_i->memory_body_id=memory_body_id;
	u_i->system_file_id=file_id;
	u_i->map_length=map_length;
	u_i->right=right;

	COPY_CAPABILITY((*file_capability),(u_i->capability));

	return file_id;
}

int set_process_file_capability(
	int process_id,int process_file_id,int map_length,int right,
	struct capability *file_capability,
	int memory_body_id,int file_id)
{
	struct user_file_information *u_i;

	if((process_id<0)||(process_id>=PROCESS_NUMBER))
		return -1;
	if((process_file_id<0)||(process_file_id>=USER_FILE_NUMBER))
		return -2;
	if((memory_body_id<0)||(memory_body_id>=MEMORY_BODY_NUMBER))
		return -3;
	if((file_id<0)||(file_id>=FILE_NUMBER))
		return -4;


	u_i=&(os->process[process_id].file[process_file_id]);
	u_i->memory_body_id=memory_body_id;
	u_i->system_file_id=file_id;
	u_i->map_length=map_length;
	u_i->right=right;

	COPY_CAPABILITY((*file_capability),(u_i->capability));

	return file_id;
}

static int can_thread_access_file(int thread_id,int thread_file_id,
	int *memory_body_id,int *map_length,int *right)
{
	int file_id;
	struct user_file_information *u_i;
	struct capability *c;

	if((thread_id<0)||(thread_id>=THREAD_NUMBER))
		return -1;
	if((thread_file_id<0)||(thread_file_id>=USER_FILE_NUMBER))
		return -2;
	u_i=&(os->thread[thread_id].file[thread_file_id]);
	*memory_body_id=u_i->memory_body_id;
	if(((*memory_body_id)<0)
	||((*memory_body_id)>=MEMORY_BODY_NUMBER))
		return -3;
	file_id=u_i->system_file_id;
	if((file_id<0)||(file_id>=FILE_NUMBER))
		return -4;
	c=&(os->system_file[*memory_body_id].
		system_file[file_id].capability);
	if(!KERNEL_COMPARE_CAPABILITY((*c),(u_i->capability)))
		return -5;

	*map_length=os->thread[thread_id].file[thread_file_id].
		map_length;
	*right=(os->thread[thread_id].file[thread_file_id].right)
		&(os->system_file[*memory_body_id].
			system_file[file_id].right);
	return file_id;
}

static int can_process_access_file(int process_id,int process_file_id,
	int *memory_body_id,int *map_length,int *right)
{
	int file_id;
	struct user_file_information *u_i;
	struct capability *c;

	if((process_id<0)||(process_id>=PROCESS_NUMBER))
		return -1;
	if((process_file_id<0)||(process_file_id>=USER_FILE_NUMBER))
		return -2;
	u_i=&(os->process[process_id].file[process_file_id]);
	*memory_body_id=u_i->memory_body_id;
	if(((*memory_body_id)<0)
	||((*memory_body_id)>=MEMORY_BODY_NUMBER))
		return -3;
	file_id=u_i->system_file_id;
	if((file_id<0)||(file_id>=FILE_NUMBER))
		return -4;
	c=&(os->system_file[*memory_body_id].
		system_file[file_id].capability);

	if(!KERNEL_COMPARE_CAPABILITY((*c),(u_i->capability)))
		return -5;

	*map_length=os->process[process_id].file[process_file_id].
		map_length;
	*right=(os->process[process_id].file[process_file_id].right)
		&(os->system_file[*memory_body_id].
			system_file[file_id].right);
	return file_id;
}

int can_access_file(int thread_id,int process_id,int user_file_id,
	int *memory_body_id,int *map_length,int *right)
{
	int return_value;
	return_value=can_process_access_file(
		process_id,user_file_id,
		memory_body_id,map_length,right);
	if(return_value<0)
		return_value=can_thread_access_file(
			thread_id,user_file_id,
			memory_body_id,map_length,right);
	return return_value;
}

⌨️ 快捷键说明

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