/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   free.c                                             :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: lperrey <lperrey@student.42.fr>            +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2021/10/10 23:53:17 by lperrey           #+#    #+#             */
/*   Updated: 2021/12/02 00:42:33 by lperrey          ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#include "minishell.h"

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(c->path);
	free_pipeline(&c->pipeline);
	//if (c->termios_changed)
	//	tcsetattr(STDIN_FILENO, TCSANOW, &c->ori_termios);
	rl_clear_history();
	close_stdio();
	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++;
	}
}

void	close_stdio(void)
{
	if (close(STDIN_FILENO) == -1)
		perror("close()");
	if (close(STDOUT_FILENO) == -1)
		perror("close()");
	if (close(STDERR_FILENO) == -1)
		perror("close()");
}
