Ejemplo n.º 1
0
int
main (int argc, char **argv) 
{

  // faire en sorte qu'interactive_mode = 0 lorsque le shell est distant 
  
  if (interactive_mode)
    {
      using_history();
    }
  else
    {
      //  mode distant 
    }
  
  while (1){
    if (my_yyparse () == 0) {  /* L'analyse a abouti */   
      afficher_expr(ExpressionAnalysee);
      status = evaluer_expr(ExpressionAnalysee);
      //printf("Salut %s",ExpressionAnalysee->type);
      fflush(stdout);
      expression_free(ExpressionAnalysee);
    }
    else {
      /* L'analyse de la ligne de commande a donn� une erreur */
    }
  }
  return 0;
}
Ejemplo n.º 2
0
int
main (int argc, char **argv) 
{
	if(argc == 2)
		interactive_mode = 0;

  // faire en sorte qu'interactive_mode = 0 lorsque le shell est distant 
  if (interactive_mode)
    {
      using_history();
    }
  else
    {
      //  mode distant 
    }
  
  while (1){
    if (my_yyparse () == 0) {  /* L'analyse a abouti */   
      // afficher_expr(ExpressionAnalysee);
      
      //printf("\n%s\n", ExpressionAnalysee->arguments[0]);

      evaluer_expr(ExpressionAnalysee);
      //echo(LongueurListe(ExpressionAnalysee->arguments), ExpressionAnalysee->arguments);
      
      // printf("\n%s\n", choices[4]);
      fflush(stdout);
      expression_free(ExpressionAnalysee);
    }
    else {
      /* L'analyse de la ligne de commande a donné une erreur */
    }
  }
   wait(NULL);
  return 0;
}
Ejemplo n.º 3
0
int evaluer_expr(Expression *e,int in,int out,int err,int bg){
pid_t pid;
switch (e->type) 
{	 
	case BG :{ /**                  Background                    **/
				pid = fork();
			if(pid == 0){
				 evaluer_expr(e -> gauche,0,1,2,1);
				 exit(0);
				}
			else{
				  waitpid(pid,NULL,WNOHANG);
				}
			};
		break;
		
	case PIPE :{/**                  PIPE                    **/
		int tube[2];
		if(pipe(tube) == -1){
			perror("tube");
		}
		pid = fork();
		if(pid == -1){
			perror("fork");
		}
		else if(pid == 0){// Cas du fils
			 close(tube[0]); 
			 evaluer_expr(e -> gauche,0,tube[1],2,0);
		}
		else{ //Cas du pére 
			 close(tube[1]); 
			 evaluer_expr(e -> droite,tube[0],1,2,0);
			}
			
			};
		break;
	
	case SEQUENCE :{/**                  SEQUENCE                    **/					
			pid = fork();
			if(pid == 0){
				 evaluer_expr(e -> gauche,0,1,2,0);
				 exit(0);
				}
			else{
				  waitpid(pid,NULL,0);
				  evaluer_expr(e -> droite,0,1,2,0);
				  
				}
		};
		break;
	
	case SEQUENCE_ET : {/**                  SEQUENCE ET                    **/
			pid = fork();
			int status_sequence_et;
			if(pid == 0){
			 execvp(e -> gauche -> arguments[0], &e-> gauche-> arguments[0]);
			 perror(e -> gauche -> arguments[0]);
			 exit(1);
		}
		else{
			wait(&status_sequence_et);
			if(WEXITSTATUS(status_sequence_et) == 0){
				evaluer_expr(e -> droite,0,1,2,0);
			}
			}
		};
		break;
	
	case SEQUENCE_OU : {/**                  SEQUENCE OU                    **/
			pid = fork();
			if(pid == 0){
				 evaluer_expr(e -> gauche,0,1,2,0);
				 exit(0);
				}
			else{
				  waitpid(pid,NULL,0);
				  evaluer_expr(e -> droite,0,1,2,0);
				}
		};
		break;

	case REDIRECTION_I : {/**                  REDIRECTION INPUT                    **/
			int fdin = open(e->arguments[0], O_RDONLY, 0666);	
            if(fdin == -1){
				perror("open");
			}
			evaluer_expr(e->gauche,fdin,1,2,0);
			
		};
		break;	
		
	case REDIRECTION_O : {/**                  REDIRECTION OUTPUT                    **/
		
			int fdout = open(e->arguments[0],O_CREAT | O_TRUNC | O_WRONLY, 0666);	
            if(fdout == -1){
				perror("open");
			}
			evaluer_expr(e->gauche,0,fdout,2,0);
		};
		break;
		
	case REDIRECTION_A : {/**                  REDIRECTION OUTPUT APPEND                    **/
		int fdout = open(e->arguments[0],O_CREAT | O_APPEND | O_WRONLY, 0666);	
            if(fdout == -1){
				perror("open");
			}
			evaluer_expr(e->gauche,0,fdout,2,0);
		};
		break;	
		
	case REDIRECTION_E : {/**                  REDIRECTION STDERR                    **/
			int fderr = open(e->arguments[0],O_CREAT | O_TRUNC | O_WRONLY, 0666);	
            if(fderr == -1){
				perror("open");
		
			}
			evaluer_expr(e->gauche,0,1,fderr,0);	
		};
		break;	
	
	case REDIRECTION_EO : {/**                  REDIRECTION STDERR & OUTPUT                    **/
	    	int fdout = open(e->arguments[0],O_CREAT | O_WRONLY, 0666);
			int fderr = open(e->arguments[0],O_CREAT | O_TRUNC | O_WRONLY, 0666);	
            if((fderr == -1) ){
				perror("open");
			}
			 if((fdout == -1) ){
				perror("open");
			}
			evaluer_expr(e->gauche,0,fdout,fderr,0);
		};
		break;
	case VIDE :
			break;
	
		
	default : {/**                  COMMANDE SIMPLE & INTERNES                    **/
		
		int intCmd = isCmdInt(e->arguments[0]);
		if(intCmd != -1){
			exec_cmd_int(intCmd,e);
			break ; 
		}
		else {
			  pid_t pid ;
			  pid = fork();
			  if(pid == 0){ // fils
				
			  if(in != 0){
				dup2(in,0);
				close(in);
			  }
			  if(out != 1){
				 dup2(out,1);
				 close(out);
			  }
			  if(err!=2){
				  dup2(err,2);
				  close(err);
			  }
			 execvp(e->arguments[0], &e->arguments[0]);
			 perror(e->arguments[0]);
			 exit(-1);
			 
			 
			}else{ // pére
			 
			  if(in != 0){
				close(in);
				}
				 
			  if(out != 1){
				close(out);
			  }

			   if(err!=2){
				  close(err);
			  }
			  if(!bg){
					waitpid(pid, &status , 0);
					status = WIFEXITED(status)?WEXITSTATUS(status):128+WTERMSIG(status);
					return status;
					}
			  
			}
		  }
			
		};
		break;
	}
}