Nouvelle gestion des erreurs (ya moyen d’avoir tout casser)
This commit is contained in:
parent
64a3e1b1ca
commit
e1b008fce4
3 changed files with 55 additions and 32 deletions
|
@ -12,41 +12,52 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
/**
|
||||
* error(): gère les erreurs selon leur code et leur type
|
||||
* @code: code de l’erreur, voir les différents codes plus bas
|
||||
* @code: code de l’erreur, voir les différents codes dans le fichier .h
|
||||
* @type: NON_FATAL_ERROR pour continuer l’exécution
|
||||
* FATAL_ERROR pour stoper le programme
|
||||
* @message: message à afficher pour + d’infos ou erreur non implémentée
|
||||
*
|
||||
* 1 erreur lors de la création des pipes
|
||||
* 2 chemin inexistant
|
||||
* 3 erreur lors du fork
|
||||
*/
|
||||
void error(int code, int type, char *message)
|
||||
{
|
||||
switch (code)
|
||||
{
|
||||
case 1:
|
||||
printf("Erreur lors de la création des pipes.\n");
|
||||
break;
|
||||
case 2:
|
||||
printf("Chemin inexistant.\n");
|
||||
break;
|
||||
case 3:
|
||||
printf("Le fork a échoué, le processus enfant a été avorté.\n");
|
||||
break;
|
||||
if (code == 0)
|
||||
return;
|
||||
|
||||
default:
|
||||
if (message == NULL)
|
||||
printf("Erreur inconnue.\n");
|
||||
else
|
||||
printf("%s\n", message);
|
||||
const char *txt_error = strerror(code);
|
||||
if (errno == EINVAL)
|
||||
{
|
||||
switch (code)
|
||||
{
|
||||
case ERR_PIPE_CREATION:
|
||||
fprintf(stderr, "Erreur lors de la création des pipes.\n");
|
||||
break;
|
||||
case ERR_FORK:
|
||||
fprintf(stderr, "Le fork a échoué, le processus enfant a été avorté.\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
if (message == NULL)
|
||||
fprintf(stderr, "Erreur inconnue.\n");
|
||||
else
|
||||
fprintf(stderr, "%s\n", message);
|
||||
}
|
||||
if (message != NULL)
|
||||
fprintf(stderr, "Message complémentaire :\n%s\n", message);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (message != NULL)
|
||||
{
|
||||
errno = code;
|
||||
perror(message);
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "%s\n", txt_error);
|
||||
}
|
||||
|
||||
if (message != NULL)
|
||||
printf("Message complémentaire :\n%s\n", message);
|
||||
|
||||
if (type == FATAL_ERROR)
|
||||
exit(code);
|
||||
|
@ -95,7 +106,10 @@ int native_command(char *command[])
|
|||
*/
|
||||
void change_dir(char *dir)
|
||||
{
|
||||
if (chdir(dir))
|
||||
error(2, NON_FATAL_ERROR, "Un nom de fichier au lieu d’un dossier \
|
||||
a pu etre passé en paramètres.");
|
||||
if (chdir(dir) < 0)
|
||||
{
|
||||
char txt_error[MAX_LENGTH] = "cd: ";
|
||||
strcat(txt_error, dir);
|
||||
error(errno, NON_FATAL_ERROR, txt_error);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,6 +14,9 @@
|
|||
#define FATAL_ERROR 1
|
||||
#define NON_FATAL_ERROR 0
|
||||
|
||||
#define ERR_PIPE_CREATION 200 /* erreur lors de la création des pipes */
|
||||
#define ERR_FORK 201 /* erreur lors du fork */
|
||||
|
||||
void error(int code, int type, char *message);
|
||||
int native_command(char *command[]);
|
||||
void change_dir(char *dir);
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
int main()
|
||||
|
@ -26,12 +27,12 @@ int main()
|
|||
char *commands[MAX_LENGTH];
|
||||
char *args[MAX_LENGTH];
|
||||
|
||||
int pid, index = 0, end = 0; /* end permet de savoir quand s’arreter */
|
||||
int pid, result, index = 0, end = 0; /* end permet de savoir quand s’arreter */
|
||||
int my_pipe[2];
|
||||
setenv("HELLO", "test", 1);
|
||||
|
||||
if (pipe(my_pipe) == -1)
|
||||
error(1, FATAL_ERROR, NULL);
|
||||
error(ERR_PIPE_CREATION, FATAL_ERROR, NULL);
|
||||
|
||||
for (int i = 0; i < MAX_LENGTH; i++)
|
||||
{
|
||||
|
@ -50,7 +51,7 @@ int main()
|
|||
{
|
||||
pid = fork();
|
||||
if (pid < 0)
|
||||
error(3, FATAL_ERROR, NULL);
|
||||
error(ERR_FORK, FATAL_ERROR, NULL);
|
||||
|
||||
if (!pid) /* le fils */
|
||||
{
|
||||
|
@ -70,7 +71,7 @@ int main()
|
|||
* de sortie */
|
||||
|
||||
execvp(args[0], args);
|
||||
exit(0);
|
||||
exit(errno);
|
||||
}
|
||||
|
||||
/* lorsqu’on arrive à la dernière commande, on peut fermer le pipe et
|
||||
|
@ -79,8 +80,13 @@ int main()
|
|||
{
|
||||
close(my_pipe[0]);
|
||||
close(my_pipe[1]);
|
||||
waitpid(pid, NULL, 0);
|
||||
waitpid(pid, &result, 0);
|
||||
}
|
||||
else
|
||||
wait(&result);
|
||||
|
||||
if(WIFEXITED(result))
|
||||
error(WEXITSTATUS(result), NON_FATAL_ERROR, NULL);
|
||||
}
|
||||
|
||||
for (int i = 0; i < MAX_LENGTH; i++)
|
||||
|
@ -108,7 +114,7 @@ int main()
|
|||
free(args[i]);
|
||||
free(commands[i]);
|
||||
}
|
||||
error(1, FATAL_ERROR, NULL);
|
||||
error(ERR_PIPE_CREATION, FATAL_ERROR, NULL);
|
||||
}
|
||||
index = 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue