Nouvelle gestion des erreurs (ya moyen d’avoir tout casser)

This commit is contained in:
rick 2021-02-21 19:12:12 +01:00
parent 64a3e1b1ca
commit e1b008fce4
Signed by: Rick
GPG Key ID: 2B593F087240EE99
3 changed files with 55 additions and 32 deletions

View File

@ -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 lerreur, voir les différents codes plus bas
* @code: code de lerreur, voir les différents codes dans le fichier .h
* @type: NON_FATAL_ERROR pour continuer lexécution
* FATAL_ERROR pour stoper le programme
* @message: message à afficher pour + dinfos 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 dun 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);
}
}

View File

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

View File

@ -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 sarreter */
int pid, result, index = 0, end = 0; /* end permet de savoir quand sarreter */
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);
}
/* lorsquon 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;
}