f5
This commit is contained in:
parent
61a5953a0f
commit
b40ea37ea0
27
minishell.c
27
minishell.c
|
@ -103,6 +103,8 @@ void handler_sigtstp(int sig_num)
|
||||||
siglongjmp(goto_prompt, sig_num);
|
siglongjmp(goto_prompt, sig_num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO handler dans un autre fichier
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
initialiser(&jobs);
|
initialiser(&jobs);
|
||||||
|
@ -131,6 +133,7 @@ int main(int argc, char *argv[])
|
||||||
prompting = 0;
|
prompting = 0;
|
||||||
|
|
||||||
// TODO: créer fonction "builtin" ?
|
// TODO: créer fonction "builtin" ?
|
||||||
|
// continue ou break en fonction de l'entier de retour
|
||||||
if (cmd == NULL)
|
if (cmd == NULL)
|
||||||
{ // EOF
|
{ // EOF
|
||||||
break;
|
break;
|
||||||
|
@ -226,11 +229,10 @@ int main(int argc, char *argv[])
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// compter le nombre de commandes séparées par des pipes
|
|
||||||
int nb_pipe = -1;
|
int nb_pipe = -1;
|
||||||
char ***cursor = cmd->seq;
|
char ***cursor = cmd->seq;
|
||||||
while (*cursor)
|
while (*cursor)
|
||||||
{
|
{ // compter le nombre de commandes séparées par des pipes
|
||||||
cursor++;
|
cursor++;
|
||||||
nb_pipe++;
|
nb_pipe++;
|
||||||
}
|
}
|
||||||
|
@ -254,18 +256,18 @@ int main(int argc, char *argv[])
|
||||||
if (cmd->in)
|
if (cmd->in)
|
||||||
{ // "<"
|
{ // "<"
|
||||||
file_in = open(cmd->in, O_RDONLY);
|
file_in = open(cmd->in, O_RDONLY);
|
||||||
dup2(file_in, 0);
|
dup2(file_in, STDIN_FILENO);
|
||||||
}
|
}
|
||||||
if (cmd->out)
|
if (cmd->out)
|
||||||
{ // ">"
|
{ // ">"
|
||||||
file_out = open(cmd->out, O_CREAT | O_TRUNC | O_WRONLY, 0640);
|
file_out = open(cmd->out, O_CREAT | O_TRUNC | O_WRONLY, 0640);
|
||||||
dup2(file_out, 1);
|
dup2(file_out, STDOUT_FILENO);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nb_pipe > 0)
|
if (nb_pipe > 0)
|
||||||
{ // "|" présent(s) dans la commande
|
{ // "|"
|
||||||
for (int i = 0; i <= nb_pipe; i++)
|
for (int i = 0; i <= nb_pipe; i++)
|
||||||
{ // on crée itérativement nb_pipe fils et pipes
|
{ // on créé itérativement nb_pipe fils et pipes
|
||||||
if (pipe(pipes[i]) < 0)
|
if (pipe(pipes[i]) < 0)
|
||||||
{ // pipe failed ?
|
{ // pipe failed ?
|
||||||
fprintf(stderr, "ERROR: pipe error, (%d) %s\n", errno, strerror(errno));
|
fprintf(stderr, "ERROR: pipe error, (%d) %s\n", errno, strerror(errno));
|
||||||
|
@ -329,13 +331,11 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
for (int i = 0; i <= nb_pipe; i++)
|
for (int i = 0; i <= nb_pipe; i++)
|
||||||
{ // on attend chaque sous-fils
|
{ // on attend chaque sous-fils
|
||||||
pid_t id = waitpid(sous_fils[i], &wait_code, 0);
|
if (waitpid(sous_fils[i], &wait_code, 0) == -1)
|
||||||
|
|
||||||
if (id == -1)
|
|
||||||
{ // wait fail ?
|
{ // wait fail ?
|
||||||
fprintf(stderr, "ERROR: waiting for %d failed, (%d) %s\n", wait_code, errno, strerror(errno));
|
fprintf(stderr, "ERROR: waiting for %d failed, (%d) %s\n", wait_code, errno, strerror(errno));
|
||||||
exit(errno);
|
exit(errno);
|
||||||
}
|
} // TODO: factoriser dans une fonction, cf dessous ?
|
||||||
if (wait_code)
|
if (wait_code)
|
||||||
{ // execvp fail ?
|
{ // execvp fail ?
|
||||||
fprintf(stderr, "ERROR: child failed, (%d) %s\n", wait_code, strerror(wait_code));
|
fprintf(stderr, "ERROR: child failed, (%d) %s\n", wait_code, strerror(wait_code));
|
||||||
|
@ -344,7 +344,7 @@ int main(int argc, char *argv[])
|
||||||
exit(0); // on termine le fils
|
exit(0); // on termine le fils
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // pas de piping
|
{ // pas de pipes dans la commande
|
||||||
execvp(cmd->seq[0][0], cmd->seq[0]);
|
execvp(cmd->seq[0][0], cmd->seq[0]);
|
||||||
fprintf(stderr, "ERROR: execvp failed, (%d) %s\n", errno, strerror(errno));
|
fprintf(stderr, "ERROR: execvp failed, (%d) %s\n", errno, strerror(errno));
|
||||||
exit(errno); // si execvp échoue on exit avec une erreur
|
exit(errno); // si execvp échoue on exit avec une erreur
|
||||||
|
@ -359,9 +359,7 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // foreground
|
{ // foreground
|
||||||
pid_t id = waitpid(pid_fils, &wait_code, 0);
|
if (waitpid(pid_fils, &wait_code, 0) == -1)
|
||||||
|
|
||||||
if (id == -1)
|
|
||||||
{ // wait fail ?
|
{ // wait fail ?
|
||||||
fprintf(stderr, "ERROR: waiting for %d failed, (%d) %s\n", wait_code, errno, strerror(errno));
|
fprintf(stderr, "ERROR: waiting for %d failed, (%d) %s\n", wait_code, errno, strerror(errno));
|
||||||
exit(errno);
|
exit(errno);
|
||||||
|
@ -374,5 +372,6 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
liberer(&jobs);
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
Loading…
Reference in a new issue