www.pudn.com > LFYOS.zip > file_capability.c


 
#include"kernel.h" 
 
void init_file_information() 
{ 
	int i,j; 
	struct system_file_information *info; 
 
	for(i=0;isystem_file[i]); 
		info->semaphore_id=(-1); 
		for(j=0;jsystem_file[j].right=NO_ACCESS_RIGHT; 
			RESET_CAPABILITY(info->system_file[j]. 
				capability); 
		} 
	}; 
	for(i=0;iprocess[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;ithread[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; 
}