rishtik/src/boitoutil/essential_shell.c

116 lines
2.7 KiB
C
Raw Normal View History

/**
* @file essential_shell.c
* @author rick <rick@gnous.eu>
* @date 2021
*/
2021-02-20 17:34:43 +00:00
#include "vars.h"
#include "essential_shell.h"
2021-02-20 17:34:43 +00:00
#include "oui-dire.h"
#include <stdio.h>
#include <stdlib.h>
2021-02-18 16:20:46 +00:00
#include <string.h>
#include <unistd.h>
#include <errno.h>
2021-02-18 16:20:46 +00:00
/**
* native_command(): vérifie si la commande entrée par lutilisateur
* est implémenté dans le terminal
* @command: la commande et ses arguments à vérifier
2021-02-18 16:20:46 +00:00
*
* Vérifie si la commande entrée par lutilisateur est native.
* Si elle lest, le programme appelle la fonction pour exécuter la commande
* en lui passant en paramètre les arguments de la commande.
*
* Return: 0 si la commande nest pas native
* 1 si la commande est native
2021-02-18 16:20:46 +00:00
*/
int native_command(char *command[])
2021-02-18 16:20:46 +00:00
{
int ret = 1; /* 0 si commande non native */
if (!strcmp(command[0], "cd"))
change_dir(command[1]);
2021-02-20 17:34:43 +00:00
if (!strcmp(command[0], "ouï-dire") || !strcmp(command[0], "oui-dire")
|| !strcmp(command[0], "echo"))
{
char *tmp = calloc(MAX_LENGTH, sizeof(char));
int i = 1;
while (command[i] != NULL)
{
strcat(tmp, command[i]);
*(tmp + strlen(tmp)) = ' ';
i++;
}
if (i == 2)
*(tmp + strlen(tmp) - 1) = '\0';
echo(tmp);
}
else
ret = 0;
2021-02-18 16:20:46 +00:00
return ret;
}
/**
* change_dir(): fonction pour implémenter la commande cd
* @dir: le répertoire à ouvrir
*/
void change_dir(char *dir)
{
if (chdir(dir) < 0)
{
2021-02-21 19:42:54 +00:00
int code = errno;
char txt_error[MAX_LENGTH] = "cd: ";
strcat(txt_error, dir);
2021-02-21 19:42:54 +00:00
error(code, NON_FATAL_ERROR, txt_error);
}
}
2021-02-21 19:42:54 +00:00
/**
* error(): gère les erreurs selon leur code et leur type
* @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
*/
void error(int code, int type, char *message)
{
if (code == 0)
return;
/* 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 (type == FATAL_ERROR)
exit(code);
}