8L312 / minishell

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

A faire :

  • < : Done
  • : Done

  • << : Done
  • : Done

  • | : Done
  • $? : Done
  • LEAKS :

//Contenu des fichiers//

main.c : welcome, cpy_env, init_para, main

search_fct.c : search_fct, do_fct(+2), no_path

echo.c : ft_echo

ft_strstr.c : ft_strlen, ft_strstr

ft_calloc.c : ft_bzero, ft_calloc

ft_strdup.c : ft_strdup(+2)

ft_env.c : ft_env, ft_export, ft_unset(et ft_unset2), ft_getenv

ft_env2.c : env_cpy, env_cmp, empty_export

ft_pwd.c : ft_pwd

ft_cd.c : ft_cd, magic, update_pwd, update_oldpwd

ft_split.c : ft_split

ft_strjoin.c : ft_strjoin

init.c : prompt_init, free_malloc, free_malloc2

current_parser.c : get_dollar, current_parser(+ 2, 3 et 4)

current_parser2.c : current_parser5 (+ 6 et 7)

error_handler : error_handler (+2), error_unset

ft_cd.c : ft_memcmp, get_env, ft_cd

cmd_not_found.c : cmd_cmp, verif_fquote, cmd_not_found, cmd_not_found2

sig_handler.c : sig_handler

execve_default.c : ft_execve, free_exec, all_path_exec, exec_and_return(+2)

execve_default2.c : last_path, ft_check_path

welcome1.c : les welcome 1 a 5

welcome2.c : les welcome 6 a 10

ft_termios.c : ft_termios

ft_readline.c : ft_readline(+2), int_to_str_redi

search_redirect.c : search_redirect(+2 & 3), grep_spec(+1)

search_redirect2.c : grep_spec(2, 3, 4, 5)

search_redirect3.c : grepr, grepxec, split_grep

launch_redirect.c : unquoter, unquoter6, launch_redi(+1, 2);

init_redirect.c : int_to_str_redi, cpy_bf_redi

ft_cd_tool.c : ft_memcmp, ft_strncmp, get_env (fichier norminette)

unquoter : unquoter(2, 3, 4, 5, 7)

redirect_utils.c : ft_freeee_split_redi, choose_redi, rm_sp_grep, ft_exec_red(+2)

redirecter1and2.c : redi1(+1_2), redi2(+2_1)

redirecter3 : redi3(+3_1), file_eraser, pipe_af_red;

redireter4and5.c : redi5(+5_1);

ft_strcmp.c : ft_strcmp;

ft_putendl_fd.c : ft_putendl_fd

//Explications de la struct globale//

int exit_status

utilisé pour catch l'exit status de des commandes lancées (lu avec la var $?)

int main

utilisé pour reconnaitre le process principal notamment pour le CTRL+C qui, si non innhibé, va print un nouveau prompt sur tous les minishell ouverts.

//Explications de la struct//

char *prompt

C'est la ptite ligne qui apparait quand on attend une commande, je pensais la pimper un peu avec genre un utilisateur perso donne en arg quand on lance minishell... a voir.

char *current

la ligne de commande tapee qui contient du coup tous ce qui a a faire... Faudra voir pour la modifier selon les quotes, pipes,...

char *out

C'est en gros la string une fois qu'on a remove les quotes et add les variables d'environnement car la string current doit rester sans modif pour matcher avec l'historique

char *bait

string qui me sert quand le debut de current est quoté car la verif est un peu differente et c'est chiant

int cmd

int que search_fct a renvoye apres avoir cherche dans current.

char **env

stocke les variable d'environnement (pour les fonctions env et export)

struct termios term

utile pour ft_termios en gros on peut toucher aux parametre du terminal

char *split_redi

pointeur sur string pour stocker les differentes operations en cas de redirection, les args impaires sont systematiquement une string qui contient la redirection (par ex. {"echo judas", ">", "outfile"})

//Explication des fonctions//

int search_fct(char *str)

cherche si une des commandes que l'on doit coder est présente dans str et renvoie son numéro. Fonctions et leurs numéros : echo -n = 1; echo = 2; cd = 3; pwd = 4; export = 5; unset = 6; env = 7; exit = 8; cd .. = 9;

void do_fct(int cmd, t_para *para)

Reçoit en arg l'int revoyé par search_fct et exécute la commande correspondante.

void ft_echo(int mode, char *str)

Ecrit la str avec ou sans \n selon le mode : echo -n = mode 1; echo = mode 2;

int ft_strstr(char *str, char *tofind)

Un peu différente de la version originale. Cherche la premiere occurence de tofind dans str et renvoie l'index du caractere qui suit cette apparition ou 0 si aucune occurence n'apparait. (sera utile pour search_fct)

void ft_env(char **env)

meme que bash : ecrit toutes les variables d'environnement

int ft_export(t_para *para)

meme que bash : ajoute une variable d'environnement a la char **env

int ft_unset(t_para *para)

meme que bash : supprime les variable d'environnement designees si elles existent

void ft_pwd(void)

meme que bash : ecrit le chemin ou on se trouve

prompt_init(int argc, char **argv, t_para *para)

Met a jour le promt selon le pwd et le user(optionnel) donne en arg de ./minishell (="default_user" si pas d'argument)

int *current_parser(t_para *para)

Parse la string current et remove les quotes (singles et double) selon les regles, ajoute les variable d'environnement (genre $PWD), check si ya des ";" et remove les "" au besoin puis renvoie 0 si tout s'est bien passe ou un int d'erreur. La string para->out est finalement modifiee par pointeur.

char *get_dollar(char *current, int i, t_para *para)

il va chercher la variable d'environnement qui est a l'index [i] de la string current et renvoier la string correspondante ou NULL si aucune var_env ne correspond a la recherche.

void ft_cd(t_para *para, int cmd)

il effectue la commande cd le cd .. fonctinne aussi mais quand on l'effectue il ne met pas encore les parametre (env) du terminal a jour, j'ai aussi utiliser les numeros 3 et 9 de la variable cmd dans le main.

void error_handler(int error, t_ara *para)

il fait des actions selon le numero d'erreur envoie

0 = erreur de malloc : ecrit qu'un prob est arrive et quitte tout avec exit(0)

1 = quotes non fermees dans la current : ecrit que t'as pas fermee tes quotes

2 = presence d'une ; dans la current : ecrit qu'on handle pas ce cas

3 = ya eu une tentative de bait dans la para->current : utilise une version alternative de cmd_not_found

4 = erreur dans l'appel de minishell : Usage : ./minishell ([username])

5 = le fd utilise est pas TTY (man isatty) et c'est chiant pour l'utilisation de ft_termios

6 = une erreur est arrivee quand on a voulu toucher aux parametres de la struct termios

void cmd_not_found(char *str)

ecrit qu'aucune fonction ne correspond a la string passee en argument, elle set aussi le g_glob.exit_status à 127

void cmd_not_found2(char *str)

la meme mais c'est pour le cas ou ya eu le debut de la current qui etait quote ce qui change un peu la sortie

int verif_fquote(t_para *para, char *str)

verifie si le debut de str etait quoté car ca modifie un peu la recherche et la sortie. revoie 0 si on peut continuer sans soucis et 1 si l'argument pose soucis auquel cas on stock ledit argument dans para->bait.

int cmd_cmp(char *str)

utilisee pour verif_fquote : regarde dans str si ya un bait de fonction quotée avec un esape genre "echo ", renvoie 0 si RaS et 1 si probleme.

void ft_signal(void)

initialise le captage des signaux dans le main.

void sig_handler(int sig)

il gere les signaux envoyé ("CTRL+C" et "CTRL+") pour le CTRL+D c'est directement dans le main c'est plus tricky car CTRL+D fait quit le programme si le stdin a atteint EOF donc est NULL. il va aussi prendre le SIGUSR1 en compte qui est envoyé par un éventuel child issu d'un fork() pour signifier qu'un process enfant s'est mal terminé et set donc la g_glob.exit_status a 1 pour le $?.

int ft_execve(t_para *para)

si la commande passee dans para->current ne correspond a rien qu'on a du construire, il va tenter de lancer la commande avec le vrai shell. Si elle existe pas non plus dans le vrai shell, c'est comme meme minishell qui dit commande not found.

void ft_check_path(char **argv)

il va check les str de argv qu'on donne a execve() car si ya genre "/bin/ls" on doit que garder le ls de fin du coup on modifie les strings en fonctions

char *last_path(char *arg)

c'est lui qui fait la modif des str de argv dans ft_check_path juste plus haut.

char **all_path_exec(t_para *para, char *end

ça va chercher tous les chemins pssoible pour executer les cmd avec execve et renvoier le tableaux de str pour les tests.

int exec_and_return(char **all_path, char **argv, t_para *para)

split de fonction a cause de la norminette c'est l'executeur du process ft_execve.

void welcome(void)

print un ptit accueil sympa quand on lance le shell

void ft_termios(t_para *para)

Est utilisé pour inhiber le print du "^c" quand on faisait CTRL+C, la ligne importante c'est para->term.c_lflag &= ~ECHCTL qui met le bit de ECHOCTL (donc "echo" la touche CTRL) a 0

void ft_readline(t_para *para

il coupé du main pour des raisons de norminette, il va lancer le current parser sur la str lue par readline et lancer search_fct et do_fct.

int search_redirect(char *str)

cherche dans la str passee en parametre si il y a une redirection et renvoie 1 si elle trouve qqchose (et si elle n'est pas inhibée par du quotage). Renvoie 0 si rien n'a ete trouve

code des redirections :

0 = > 1 = >> 2 = < 3 = << 4 = |

char *cpy_bf_redi(char *str, int i)

va copier la la partie de l'arg qui se trouve avant une redirection dans current parser et le mettre dans split_redi.

char *int_to_str_redi(int code)

mets dans split_redi la string qui correspond au code de redirection de search_redirect

char *unquoter(char *str, t_para *para)

unquote chaque element de split_redi selon les regles mandatory.

char *grep_spec(char *str, t_para *para, int mod)

parser special pour le cas grep dont on a parlé. renvoie une str ou le premier argument de grep sera double quoté pour etre surs de lancer la bonne recherche

void launch_redi(t_para *para) (+1, 2)

une fois la redirection set par search_redirect, elle va lancer le dequotage special pour les redirections et les process de redirection en soit.

int choose_redi(t_para *para, int i)

c'est elle qui selon l'int i qui sert d'index pour la char **split_redi va determiner quelle type de redirection on va lancer. retourne 0 si succes et l'int qui correspond a la cmd de split_redi qui fait a fail en cas d'echec

void ft_freeee_split_redi(t_para *para)

il vide le split_redi en settant tous ses args a NULL pour eviter des baits

void rm_sp_grep

vire les espace devant les arg de grep en redirection car c'est chiant si c'est la 1ere fct d'un pipe

int ft_exec_red(t_para *para, char *str)

il execute les commande que lui envoie les differents redirecteurs selon la char *str. Si la commande s'est lancée sans probleme, retourne 0 sinon retourne 1.

int redi1(t_para para) (+1_2)

la redirection qui correspond au pipe "|". elle renvoie 0 si ok, et l'index de split_redi qui foire en cas d'echec.

int redi2(t_para *para) (+2_1)

la redirection de sortie en mode append ">>". Renvoie 0 si ok et lindex qui foire si echec.

int redi3(t_para *para) (+3_1)

la redi de sortie en mode once ">". Renvoie 0 si ok et l'index qui foire en cas d'echec.

int pipe_af_red(t_para *para)

(coupure due a la norminette) fait les pipes necessaires apres avoir redirigé la sortie. renvoie 0 si ok et l'index qui foie si echec

void file_eraser(t_para *para)

quand on fait des redi de sortie en mode once ">" on doit supprimer le contenu du fichier en question si il existait deja.

About


Languages

Language:C 97.5%Language:Makefile 2.5%Language:Shell 0.0%