-
Notifications
You must be signed in to change notification settings - Fork 0
/
shell_fct.c
118 lines (99 loc) · 3.67 KB
/
shell_fct.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include "cmd.h"
int process_membres( Cmd* cmd, int i );
int exec_cmd( Cmd* cmd )
{
return process_membres( cmd, 0 );
}
int Pipe[2];
int process_membres( Cmd* cmd, int i )
{
pid_t fils;
if( ( fils = fork() ) == 0 ) //fils
{
//printf("Je suis %s\n", cmd->cmd_args[i][0] );
//*************************** Mise en place des Pipes et Appel recursif *************************************************
if( i != (cmd->nb_membres - 1) ) // Ils ont tous besoin d'un pipe sauf le dernier
{
//printf("Je suis %s je crée un pipe \n", cmd->cmd_args[i][0] );
pipe( Pipe );
}
if( i < (cmd->nb_membres - 1) ) // appel recursif !!!!! Equivaut a un Fork attention au contexte !!!!!!
{
//printf("Je vais faire un appel recursif je suis %s\n", cmd->cmd_args[i][0]);
int j = i + 1;
process_membres( cmd, j );
}
if( i != 0 ) // Ils redirigent tous leur entrée standard sauf le 1er
{
//printf("Je suis %s je redirige mon entrée standard\n", cmd->cmd_args[i][0] );
close( 0 ); dup( Pipe[0] ); close( Pipe[0] ); close( Pipe[1] );
}
if( i != (cmd->nb_membres - 1) ) // Ils redirigent tous leur sorties sauf le dernier
{
//printf("Je suis %s je redirige ma sortie standard\n", cmd->cmd_args[i][0] );
close( 1 ); dup( Pipe[1] ); close( Pipe[0] ); close( Pipe[1] );
}
//*************************************************************************************************************************
//******************** Redirection standard ****************************
if( strcmp( cmd->redir[i][STDIN], "NULL" ) != 0 ) // redirection entrée standard
{
int fichier = open( cmd->redir[i][STDIN], O_RDONLY );
close( 0 );
dup( fichier );
close( fichier );
}
if( strcmp( cmd->redir[i][STDOUT], "NULL" ) != 0 ) // redirection sortie standard
{
int fichier;
if( cmd->type_redir[i][STDOUT] == RAPPEND ) //en mode ajout
{
fichier = open( cmd->redir[i][STDOUT], O_RDWR | O_APPEND );
}
else //en mode normal
{
fichier = open( cmd->redir[i][STDOUT], O_WRONLY | O_CREAT, 0777 );
}
close( 1 );
dup( fichier );
close( fichier );
}
if( strcmp( cmd->redir[i][STDERR], "NULL" ) != 0 ) // redirection sortie d'erreur standard
{
int fichier;
if( cmd->type_redir[i][STDERR] == RAPPEND ) // en mode ajout
{
fichier = open( cmd->redir[i][STDERR], O_RDWR | O_APPEND );
}
else // en mode normal
{
fichier = open( cmd->redir[i][STDERR], O_WRONLY | O_CREAT, 0777 );
}
close( 2 );
dup( fichier );
close( fichier );
}
//**********************************************************************
//************* Execution **********************************************
cmd->cmd_args[i] = (char**)realloc( cmd->cmd_args[i], (cmd->nb_args_membres[i] + 1) * sizeof( char*) );
cmd->cmd_args[i][ cmd->nb_args_membres[i] ] = NULL; //rajout d'un pointeur NULL dans la liste d'arguements pour execvp
execvp( cmd->cmd_args[i][0], cmd->cmd_args[i] );
}
else
{
if( i == 0 && cmd->attendreRetour == 1 ) // On attache que le 1er au shell les autres s'attendent via les pipes
{
int status;
waitpid( fils, &status, 0 );
return WIFEXITED(status);
}
}
}