/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* free.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/10 23:53:17 by lperrey #+# #+# */ /* Updated: 2021/11/29 12:43:29 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" // WIP : un peu zob. Previent les invalid free de readline, mais peut leak si "LINES" ou "COLUMNS" sont redefini avec export void ft_free_2d_arr_ENVIRON(void *ptr) { unsigned int i; char **arr; if (!ptr) return ; arr = (char **)ptr; i = 0; while (arr[i]) { if (ft_strncmp(arr[i], "LINES=", 5 + 1) != 0 && ft_strncmp(arr[i], "COLUMNS=", 7 + 1) != 0) free(arr[i]); i++; } free(arr); } int exit_free(t_all *c, int exit_status) { free(c->prompt_base); free(c->prompt); ft_lstclear((t_list **)&c->token_list, free); //ft_free_2d_arr(environ); ft_free_2d_arr_ENVIRON(environ); free(g_ori_environ); //environ = g_ori_environ; // WIP free test environ = NULL; // WIP free test ft_free_2d_arr(c->path); free_pipeline(&c->pipeline); //if (c->termios_changed) // tcsetattr(STDIN_FILENO, TCSANOW, &c->ori_termios); rl_clear_history(); exit(exit_status); } void free_pipeline(t_cmd **pipeline_ptr[]) { int i; t_cmd **pipeline; pipeline = *pipeline_ptr; if (!pipeline) return ; close_pipeline_fd(pipeline); i = 0; while (pipeline[i]) { ft_free_2d_arr(pipeline[i]->argv); free(pipeline[i]->path); i++; } ft_free_2d_arr(pipeline); *pipeline_ptr = NULL; } void close_pipeline_fd(t_cmd *pipeline[]) { int i; if (!pipeline) return ; i = 0; while (pipeline[i]) { if (pipeline[i]->fd_in != STDIN_FILENO && pipeline[i]->fd_in > 0) { if (close(pipeline[i]->fd_in) == -1) perror("close()"); pipeline[i]->fd_in = 0; } if (pipeline[i]->fd_out != STDOUT_FILENO && pipeline[i]->fd_out > 0) { if (close(pipeline[i]->fd_out) == -1) perror("close()"); pipeline[i]->fd_out = 0; } i++; } }