This commit is contained in:
Laureηt 2021-05-23 15:49:32 +02:00
parent 61a5953a0f
commit b40ea37ea0

View file

@ -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;
} }