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