Пример #1
0
uint64_t sys_open_dir(const char *name){

	//printf("Inside the sys_open_dir\n");

	return kopendir(name);


}
Пример #2
0
uint64_t user_irq_handler(registers_t *regs)
{  
	int n = regs->rax;
	uint64_t ret,buf;
	int fd;
	int count;
	if(n == 0)
	{
		scheduling = 1;
		fd=regs->rdi;
		buf = regs->rsi;
		count = regs->rdx;
		if(fd==0)
		{
			kscanf((char*)buf,count);
			scheduling = 0;
			return (uint64_t)(strlen((char*)buf));
		}
		
	}

	if(n == 1)
	{
		buf=regs->rsi;
		count = regs->rdx;
		printf("%c",*(char*)buf);
		return (uint64_t)count;
	}
	else if(n==12)    //brk malloc
	{
		uint64_t ret=ksbrk((uint64_t)(regs->rdi));
		regs->rax=ret;
		return ret;
	}

	else if(n==15)    //opendir
	{
		struct files_list* dir=(struct files_list*)kopendir((char*)(regs->rdi));
		regs->rax=(uint64_t)(struct files_list*)dir;
		return (uint64_t)dir;
	}	



	else if(n==16)	  //readdir
	{
		uint64_t dent=kreaddir((uint64_t)(regs->rdi));
		regs->rax=dent;
		return dent;

	}
	if(n==79)//getcwd
	{   
		buf=regs->rdi;
		count=regs->rsi; 
		strcpy((char*)buf,pwd);
		//while(1);
		regs->rax=4;
		return 1;
	}
	
	if(n==80) //cchdir
	{  
		buf=regs->rdi;
		if(strcmp((char*)buf,"..")==0)
		{
			int len=strlen(pwd);
			int count=0;
			while(count<2)
			{ 
				if(pwd[len-1]=='/')
				count++;
				len--;
			}
			pwd[len+1]='\0'; 
			regs->rax=0;
			return 0;
		}	
		int k=strlen((char*)buf);
		if(*(char*)(buf+k-1)!='/')
		buf=(uint64_t)strcat((char*)buf,"/");
		
		if(pathlook((char*)buf))
		{	
			strcpy(pwd,(char*)buf);
			regs->rax=0;
			return 0;
		}
		char path[100];
		strcpy(path,pwd);
		buf=(uint64_t)strcat(path,(char*)buf);

		if(pathlook((char*)buf))
		{	
			strcpy(pwd,(char*)buf);
			regs->rax=0;
			return 0;
		}

		return 0;
	}
		
	/* Handler for getpid*/
	if (n == 39)
	{
		regs->rax = getpid();
	}

	/* Handler for getppid*/
	if (n == 110)
	{
		regs->rax = getppid();
	}

	/* Handler for fork*/
	if(n == 57)
	{
		 
		 int a = fork();
		regs->rax = a;
		return a;
		
	}
	/* Handler for execve*/
	if(n == 59)
	{
		uint64_t filename = regs->rdi;
		uint64_t argv = regs->rsi;
		uint64_t envp = regs->rdx;
		int a = execve((char *)filename,(char**)argv,(char**)envp);
		regs->rax = a;
		return a;
	}
	/* Handler for exit*/
	if(n == 60)
	{
		exit();
		return 1;	
	}
	/* Handler for waitpid*/
	if(n == 61)
	{
		waitpid();
		return 1;	
	}
	/* Handler for sleep*/
	if(n == 98)
	{
		uint64_t sleep = regs->rdi;
		struct task *temp = running;
		temp->task_state = WAITING;
		temp->sleep = 1;
		int pid = temp->ppid;
		temp->time_to_sleep = sleep;
		while(temp->next->pid != pid)
			temp = temp->next;
		temp->task_state = WAITING;
		temp->sleep = 1;
		temp->time_to_sleep = sleep;		
		scheduler();
	}
	/* Handler for kill*/
	if(n == 99)
	{
		uint64_t pid = regs->rdi;
		struct task *temp = running;
		while(temp->next->pid != pid)
		{	
			temp = temp->next;
		}
		temp->next = temp->next->next;
		scheduler();
		return 1; 
	}
	/* Handler for PS*/
	if(n == 100)
	{
		struct task *temp = running;
		printf("Process:%s  PID:%d\n",temp->name,temp->pid);
		while(temp->next != running)
		{	
			printf("Process:%s  PID:%d\n",temp->next->name,temp->next->pid);
			temp = temp->next;
		}
		return 1; 
	}

	ret=1;
	return (uint64_t)ret;
}