mirror of
https://codeberg.org/la-chouette/minishell.git
synced 2025-12-06 07:28:09 +01:00
fix(exec): prevent leak when calling exit() in a subprocess
This was because at the point at which exit is called, we can only free a t_simple_cmd, but not the whole t_cmd tree. This commit introduces a convention of returning a t_subprocess enum from each function in exec. If the current thread is a subprocess, SUBPROCESS is returned, else PARENTPROCESS. We also no longer call exit in subproceses. This way, all processes bubble up to main, where if SUBPROCESS is returned, all memory is freed and the program exits. This also removes the previous should_exit convention. Still TODO: handling of the exit builtin, which should also bubble up in the same way.
This commit is contained in:
parent
3c350af411
commit
93f3ea7c66
16 changed files with 111 additions and 89 deletions
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/04 19:26:37 by khais #+# #+# */
|
/* Created: 2025/04/04 19:26:37 by khais #+# #+# */
|
||||||
/* Updated: 2025/04/16 16:44:24 by khais ### ########.fr */
|
/* Updated: 2025/04/29 15:10:47 by khais ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -15,14 +15,15 @@
|
||||||
#include "../connec_cmd/connec_cmd_execute.h"
|
#include "../connec_cmd/connec_cmd_execute.h"
|
||||||
#include "../group_cmd/group_cmd_execute.h"
|
#include "../group_cmd/group_cmd_execute.h"
|
||||||
|
|
||||||
void cmd_execute(t_cmd *cmd, t_minishell *app, bool should_exit)
|
t_subprocess cmd_execute(t_cmd *cmd, t_minishell *app)
|
||||||
{
|
{
|
||||||
if (cmd == NULL)
|
if (cmd == NULL)
|
||||||
return ;
|
return (PARENTPROCESS);
|
||||||
if (cmd->type == FT_SIMPLE)
|
if (cmd->type == FT_SIMPLE)
|
||||||
simple_cmd_execute(cmd->value.simple, app, should_exit);
|
return (simple_cmd_execute(cmd->value.simple, app));
|
||||||
if (cmd->type == FT_GROUP)
|
if (cmd->type == FT_GROUP)
|
||||||
group_cmd_execute(cmd->value.group, app, should_exit);
|
return (group_cmd_execute(cmd->value.group, app));
|
||||||
if (cmd->type == FT_CONNECTION)
|
if (cmd->type == FT_CONNECTION)
|
||||||
connec_cmd_execute(cmd->value.connection, app, should_exit);
|
return (connec_cmd_execute(cmd->value.connection, app));
|
||||||
|
return (PARENTPROCESS);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/04 19:25:39 by khais #+# #+# */
|
/* Created: 2025/04/04 19:25:39 by khais #+# #+# */
|
||||||
/* Updated: 2025/04/16 16:44:37 by khais ### ########.fr */
|
/* Updated: 2025/04/29 15:10:53 by khais ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -15,6 +15,6 @@
|
||||||
|
|
||||||
# include "../../minishell.h"
|
# include "../../minishell.h"
|
||||||
|
|
||||||
void cmd_execute(t_cmd *cmd, t_minishell *app, bool should_exit);
|
t_subprocess cmd_execute(t_cmd *cmd, t_minishell *app);
|
||||||
|
|
||||||
#endif // CMD_EXECUTE_H
|
#endif // CMD_EXECUTE_H
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/07 10:38:55 by khais #+# #+# */
|
/* Created: 2025/04/07 10:38:55 by khais #+# #+# */
|
||||||
/* Updated: 2025/04/28 15:04:45 by khais ### ########.fr */
|
/* Updated: 2025/04/29 15:11:32 by khais ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -16,31 +16,47 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
static void connec_and_cmd_execute(t_connec_cmd *cmd, t_minishell *app)
|
static t_subprocess connec_and_cmd_execute(t_connec_cmd *cmd, t_minishell *app)
|
||||||
{
|
{
|
||||||
cmd_execute(cmd->first, app, false);
|
int retvalue;
|
||||||
|
|
||||||
|
retvalue = cmd_execute(cmd->first, app);
|
||||||
|
if (retvalue == SUBPROCESS)
|
||||||
|
return (SUBPROCESS);
|
||||||
if (app->last_return_value == 0)
|
if (app->last_return_value == 0)
|
||||||
cmd_execute(cmd->second, app, false);
|
{
|
||||||
|
retvalue = cmd_execute(cmd->second, app);
|
||||||
|
if (retvalue == SUBPROCESS)
|
||||||
|
return (retvalue);
|
||||||
|
}
|
||||||
|
return (PARENTPROCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void connec_or_cmd_execute(t_connec_cmd *cmd, t_minishell *app)
|
static t_subprocess connec_or_cmd_execute(t_connec_cmd *cmd, t_minishell *app)
|
||||||
{
|
{
|
||||||
cmd_execute(cmd->first, app, false);
|
int retvalue;
|
||||||
|
|
||||||
|
retvalue = cmd_execute(cmd->first, app);
|
||||||
|
if (retvalue == SUBPROCESS)
|
||||||
|
return (SUBPROCESS);
|
||||||
if (app->last_return_value != 0)
|
if (app->last_return_value != 0)
|
||||||
cmd_execute(cmd->second, app, false);
|
{
|
||||||
|
retvalue = cmd_execute(cmd->second, app);
|
||||||
|
if (retvalue == SUBPROCESS)
|
||||||
|
return (SUBPROCESS);
|
||||||
|
}
|
||||||
|
return (PARENTPROCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void connec_cmd_execute(t_connec_cmd *cmd, t_minishell *app,
|
t_subprocess connec_cmd_execute(t_connec_cmd *cmd, t_minishell *app)
|
||||||
bool should_exit)
|
|
||||||
{
|
{
|
||||||
if (cmd == NULL)
|
if (cmd == NULL)
|
||||||
return ;
|
return (PARENTPROCESS);
|
||||||
if (cmd->connector == FT_AND)
|
if (cmd->connector == FT_AND)
|
||||||
connec_and_cmd_execute(cmd, app);
|
return (connec_and_cmd_execute(cmd, app));
|
||||||
if (cmd->connector == FT_OR)
|
if (cmd->connector == FT_OR)
|
||||||
connec_or_cmd_execute(cmd, app);
|
return (connec_or_cmd_execute(cmd, app));
|
||||||
if (cmd->connector == FT_PIPE)
|
if (cmd->connector == FT_PIPE)
|
||||||
connec_pipe_cmd_execute(cmd, app);
|
return (connec_pipe_cmd_execute(cmd, app));
|
||||||
if (should_exit)
|
return (PARENTPROCESS);
|
||||||
exit(app->last_return_value);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/07 10:38:19 by khais #+# #+# */
|
/* Created: 2025/04/07 10:38:19 by khais #+# #+# */
|
||||||
/* Updated: 2025/04/16 16:56:32 by khais ### ########.fr */
|
/* Updated: 2025/04/29 15:10:00 by khais ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -15,7 +15,6 @@
|
||||||
|
|
||||||
# include "../../minishell.h"
|
# include "../../minishell.h"
|
||||||
|
|
||||||
void connec_cmd_execute(t_connec_cmd *cmd, t_minishell *app,
|
t_subprocess connec_cmd_execute(t_connec_cmd *cmd, t_minishell *app);
|
||||||
bool should_exit);
|
|
||||||
|
|
||||||
#endif // CONNEC_CMD_EXECUTE_H
|
#endif // CONNEC_CMD_EXECUTE_H
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/11 12:01:29 by khais #+# #+# */
|
/* Created: 2025/04/11 12:01:29 by khais #+# #+# */
|
||||||
/* Updated: 2025/04/28 15:04:17 by khais ### ########.fr */
|
/* Updated: 2025/04/29 15:11:23 by khais ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -46,27 +46,28 @@ static void close_and_wait(t_minishell *app, int pid1, int pid2, int pipefd[2])
|
||||||
do_waitpid(app, pid2);
|
do_waitpid(app, pid2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void connec_pipe_cmd_execute(t_connec_cmd *cmd, t_minishell *app)
|
t_subprocess connec_pipe_cmd_execute(t_connec_cmd *cmd, t_minishell *app)
|
||||||
{
|
{
|
||||||
int pid1;
|
int pid1;
|
||||||
int pid2;
|
int pid2;
|
||||||
int pipefd[2];
|
int pipefd[2];
|
||||||
|
|
||||||
if (do_pipe(pipefd, app) < 0)
|
if (do_pipe(pipefd, app) < 0)
|
||||||
return ;
|
return (PARENTPROCESS);
|
||||||
pid1 = fork();
|
pid1 = fork();
|
||||||
if (pid1 == 0)
|
if (pid1 == 0)
|
||||||
{
|
{
|
||||||
dup_and_close(pipefd[1], STDOUT_FILENO, pipefd);
|
dup_and_close(pipefd[1], STDOUT_FILENO, pipefd);
|
||||||
cmd_execute(cmd->first, app, true);
|
cmd_execute(cmd->first, app);
|
||||||
return ;
|
return (SUBPROCESS);
|
||||||
}
|
}
|
||||||
pid2 = fork();
|
pid2 = fork();
|
||||||
if (pid2 == 0)
|
if (pid2 == 0)
|
||||||
{
|
{
|
||||||
dup_and_close(pipefd[0], STDIN_FILENO, pipefd);
|
dup_and_close(pipefd[0], STDIN_FILENO, pipefd);
|
||||||
cmd_execute(cmd->second, app, true);
|
cmd_execute(cmd->second, app);
|
||||||
|
return (SUBPROCESS);
|
||||||
}
|
}
|
||||||
else
|
close_and_wait(app, pid1, pid2, pipefd);
|
||||||
close_and_wait(app, pid1, pid2, pipefd);
|
return (PARENTPROCESS);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/11 11:56:45 by khais #+# #+# */
|
/* Created: 2025/04/11 11:56:45 by khais #+# #+# */
|
||||||
/* Updated: 2025/04/28 15:04:23 by khais ### ########.fr */
|
/* Updated: 2025/04/29 15:09:42 by khais ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -15,6 +15,6 @@
|
||||||
|
|
||||||
# include "../../minishell.h"
|
# include "../../minishell.h"
|
||||||
|
|
||||||
void connec_pipe_cmd_execute(t_connec_cmd *cmd, t_minishell *app);
|
t_subprocess connec_pipe_cmd_execute(t_connec_cmd *cmd, t_minishell *app);
|
||||||
|
|
||||||
#endif // CONNEC_PIPE_CMD_EXECUTE_H
|
#endif // CONNEC_PIPE_CMD_EXECUTE_H
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/04 19:50:42 by khais #+# #+# */
|
/* Created: 2025/04/04 19:50:42 by khais #+# #+# */
|
||||||
/* Updated: 2025/04/28 12:56:52 by khais ### ########.fr */
|
/* Updated: 2025/04/29 15:11:00 by khais ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -17,22 +17,19 @@
|
||||||
#include "../simple_cmd/std_fds.h"
|
#include "../simple_cmd/std_fds.h"
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
void group_cmd_execute(t_group_cmd *cmd, t_minishell *app, bool should_exit)
|
t_subprocess group_cmd_execute(t_group_cmd *cmd, t_minishell *app)
|
||||||
{
|
{
|
||||||
int pid;
|
int pid;
|
||||||
t_std_fds fds;
|
t_std_fds fds;
|
||||||
|
|
||||||
pid = fork();
|
pid = fork();
|
||||||
if (pid == 0)
|
if (pid == 0)
|
||||||
{
|
{
|
||||||
handle_redirections(cmd->redirects, app, &fds);
|
handle_redirections(cmd->redirects, app, &fds);
|
||||||
cmd_execute(cmd->cmd, app, true);
|
cmd_execute(cmd->cmd, app);
|
||||||
restore_std_fds(&fds);
|
restore_std_fds(&fds);
|
||||||
|
return (SUBPROCESS);
|
||||||
}
|
}
|
||||||
else
|
do_waitpid(app, pid);
|
||||||
{
|
return (PARENTPROCESS);
|
||||||
do_waitpid(app, pid);
|
|
||||||
}
|
|
||||||
if (should_exit)
|
|
||||||
exit(app->last_return_value);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/04 19:42:36 by khais #+# #+# */
|
/* Created: 2025/04/04 19:42:36 by khais #+# #+# */
|
||||||
/* Updated: 2025/04/16 16:45:40 by khais ### ########.fr */
|
/* Updated: 2025/04/29 14:40:03 by khais ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -15,6 +15,6 @@
|
||||||
|
|
||||||
# include "../../minishell.h"
|
# include "../../minishell.h"
|
||||||
|
|
||||||
void group_cmd_execute(t_group_cmd *cmd, t_minishell *app, bool should_exit);
|
t_subprocess group_cmd_execute(t_group_cmd *cmd, t_minishell *app);
|
||||||
|
|
||||||
#endif // GROUP_CMD_EXECUTE_H
|
#endif // GROUP_CMD_EXECUTE_H
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/03/27 16:21:56 by khais #+# #+# */
|
/* Created: 2025/03/27 16:21:56 by khais #+# #+# */
|
||||||
/* Updated: 2025/04/28 15:57:23 by khais ### ########.fr */
|
/* Updated: 2025/04/29 15:10:35 by khais ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -72,47 +72,46 @@ static t_simple_cmd *post_process_command(t_simple_cmd *cmd, t_minishell *app)
|
||||||
return (cmd);
|
return (cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void exec_external_cmd(t_simple_cmd *cmd, t_minishell *app,
|
static t_subprocess exec_external_cmd(t_simple_cmd *cmd, t_minishell *app,
|
||||||
t_std_fds *fds)
|
t_std_fds *fds)
|
||||||
{
|
{
|
||||||
char *exe;
|
char *exe;
|
||||||
int pid;
|
int pid;
|
||||||
|
|
||||||
if (cmd->words == NULL)
|
if (cmd->words == NULL)
|
||||||
return (restore_std_fds(fds));
|
return (restore_std_fds(fds), PARENTPROCESS);
|
||||||
exe = get_cmdpath(cmd->words->word->word, app);
|
exe = get_cmdpath(cmd->words->word->word, app);
|
||||||
if (exe != NULL)
|
if (exe != NULL)
|
||||||
{
|
{
|
||||||
pid = fork();
|
pid = fork();
|
||||||
if (pid == 0)
|
if (pid == 0)
|
||||||
execute_subprocess(exe, cmd, app, fds);
|
return (execute_subprocess(exe, cmd, app, fds));
|
||||||
free(exe);
|
free(exe);
|
||||||
do_waitpid(app, pid);
|
do_waitpid(app, pid);
|
||||||
}
|
}
|
||||||
restore_std_fds(fds);
|
restore_std_fds(fds);
|
||||||
if (exe == NULL)
|
if (exe == NULL)
|
||||||
command_not_found(cmd, app);
|
command_not_found(cmd, app);
|
||||||
|
return (PARENTPROCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void simple_cmd_execute(t_simple_cmd *cmd, t_minishell *app,
|
t_subprocess simple_cmd_execute(t_simple_cmd *cmd, t_minishell *app)
|
||||||
bool should_exit)
|
|
||||||
{
|
{
|
||||||
t_std_fds fds;
|
t_std_fds fds;
|
||||||
|
|
||||||
if (cmd == NULL)
|
if (cmd == NULL)
|
||||||
return ;
|
return (PARENTPROCESS);
|
||||||
ft_errno(FT_ESUCCESS);
|
ft_errno(FT_ESUCCESS);
|
||||||
if (post_process_command(cmd, app) == NULL)
|
if (post_process_command(cmd, app) == NULL)
|
||||||
{
|
{
|
||||||
if (ft_errno_get() != FT_ESUCCESS)
|
if (ft_errno_get() != FT_ESUCCESS)
|
||||||
ft_dprintf(STDERR_FILENO, "minishell: post-processing error\n");
|
ft_dprintf(STDERR_FILENO, "minishell: post-processing error\n");
|
||||||
return ;
|
return (PARENTPROCESS);
|
||||||
}
|
}
|
||||||
simple_cmd_execute_debug(cmd, app);
|
simple_cmd_execute_debug(cmd, app);
|
||||||
if (handle_redirections(cmd->redirections, app, &fds) == NULL)
|
if (handle_redirections(cmd->redirections, app, &fds) == NULL)
|
||||||
return ;
|
return (PARENTPROCESS);
|
||||||
if (execute_builtin(cmd, app, &fds) == BUILTIN_INVALID)
|
if (execute_builtin(cmd, app, &fds) == BUILTIN_INVALID)
|
||||||
exec_external_cmd(cmd, app, &fds);
|
return (exec_external_cmd(cmd, app, &fds));
|
||||||
if (should_exit)
|
return (PARENTPROCESS);
|
||||||
exit(app->last_return_value);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/03 14:35:14 by khais #+# #+# */
|
/* Created: 2025/04/03 14:35:14 by khais #+# #+# */
|
||||||
/* Updated: 2025/04/16 16:43:41 by khais ### ########.fr */
|
/* Updated: 2025/04/29 15:10:37 by khais ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -15,8 +15,7 @@
|
||||||
|
|
||||||
# include "../../minishell.h"
|
# include "../../minishell.h"
|
||||||
|
|
||||||
void simple_cmd_execute(t_simple_cmd *cmd, t_minishell *app,
|
t_subprocess simple_cmd_execute(t_simple_cmd *cmd, t_minishell *app);
|
||||||
bool should_exit);
|
|
||||||
|
|
||||||
typedef enum e_builtin_type
|
typedef enum e_builtin_type
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/02 18:19:23 by khais #+# #+# */
|
/* Created: 2025/04/02 18:19:23 by khais #+# #+# */
|
||||||
/* Updated: 2025/04/28 12:48:18 by khais ### ########.fr */
|
/* Updated: 2025/04/29 15:14:32 by khais ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -71,15 +71,11 @@ static int ft_execve(char *exe, char **argv, char **envp)
|
||||||
return (retvalue);
|
return (retvalue);
|
||||||
}
|
}
|
||||||
|
|
||||||
void execute_subprocess(char *exe, t_simple_cmd *cmd, t_minishell *app,
|
t_subprocess execute_subprocess(char *exe, t_simple_cmd *cmd,
|
||||||
t_std_fds *fds)
|
t_minishell *app, t_std_fds *fds)
|
||||||
{
|
{
|
||||||
int retvalue;
|
|
||||||
|
|
||||||
std_fds_close(fds);
|
std_fds_close(fds);
|
||||||
retvalue = ft_execve(exe, argv_from_wordlist(cmd->words),
|
app->last_return_value = ft_execve(exe, argv_from_wordlist(cmd->words),
|
||||||
envp_from_env(app->env));
|
envp_from_env(app->env));
|
||||||
simple_cmd_destroy(cmd);
|
return (SUBPROCESS);
|
||||||
env_destroy(app->env);
|
|
||||||
exit(retvalue);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/02 18:17:48 by khais #+# #+# */
|
/* Created: 2025/04/02 18:17:48 by khais #+# #+# */
|
||||||
/* Updated: 2025/04/28 12:42:06 by khais ### ########.fr */
|
/* Updated: 2025/04/29 15:14:09 by khais ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
# include "../../minishell.h"
|
# include "../../minishell.h"
|
||||||
|
|
||||||
void execute_subprocess(char *exe, t_simple_cmd *cmd, t_minishell *app,
|
t_subprocess execute_subprocess(char *exe, t_simple_cmd *cmd,
|
||||||
t_std_fds *fds);
|
t_minishell *app, t_std_fds *fds);
|
||||||
|
|
||||||
#endif // SUBPROCESS_H
|
#endif // SUBPROCESS_H
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/02/19 18:03:11 by khais #+# #+# */
|
/* Created: 2025/02/19 18:03:11 by khais #+# #+# */
|
||||||
/* Updated: 2025/04/09 14:03:39 by khais ### ########.fr */
|
/* Updated: 2025/04/29 15:04:59 by khais ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -67,7 +67,11 @@ char *get_command(t_minishell *app)
|
||||||
char *line;
|
char *line;
|
||||||
|
|
||||||
if (isatty(STDIN_FILENO))
|
if (isatty(STDIN_FILENO))
|
||||||
|
{
|
||||||
|
if (app->debug)
|
||||||
|
ft_printf("pid: %d\n", getpid());
|
||||||
line = readline("$ ");
|
line = readline("$ ");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
line = strip_newline(get_next_line(STDIN_FILENO));
|
line = strip_newline(get_next_line(STDIN_FILENO));
|
||||||
if (line != NULL && line[0] != '\0')
|
if (line != NULL && line[0] != '\0')
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,10 @@
|
||||||
/* ::: :::::::: */
|
/* ::: :::::::: */
|
||||||
/* minishell.c :+: :+: :+: */
|
/* minishell.c :+: :+: :+: */
|
||||||
/* +:+ +:+ +:+ */
|
/* +:+ +:+ +:+ */
|
||||||
/* By: jguelen <jguelen@student.42.fr> +#+ +:+ +#+ */
|
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/02/06 13:44:06 by kcolin #+# #+# */
|
/* Created: 2025/04/29 15:13/45 by khais #+# #+# */
|
||||||
/* Updated: 2025/04/24 14:26:57 by jguelen ### ########.fr */
|
/* Updated: 2025/04/29 15:13:45 by khais ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -29,13 +29,16 @@
|
||||||
/*
|
/*
|
||||||
** execute command
|
** execute command
|
||||||
*/
|
*/
|
||||||
static void execute_command(t_cmd *cmd, t_minishell *app)
|
static t_subprocess execute_command(t_cmd *cmd, t_minishell *app)
|
||||||
{
|
{
|
||||||
|
int retvalue;
|
||||||
|
|
||||||
if (app->exec == false)
|
if (app->exec == false)
|
||||||
return ;
|
return (PARENTPROCESS);
|
||||||
set_exec_mode_sig_handling();
|
set_exec_mode_sig_handling();
|
||||||
cmd_execute(cmd, app, false);
|
retvalue = cmd_execute(cmd, app);
|
||||||
set_interactive_mode_sig_handling();
|
set_interactive_mode_sig_handling();
|
||||||
|
return (retvalue);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void debug_command(t_cmd *cmd, t_minishell *app)
|
static void debug_command(t_cmd *cmd, t_minishell *app)
|
||||||
|
|
@ -77,6 +80,7 @@ int main(int argc, char *argv[], char **envp)
|
||||||
char *line;
|
char *line;
|
||||||
t_cmd *cmd;
|
t_cmd *cmd;
|
||||||
t_minishell app;
|
t_minishell app;
|
||||||
|
int retvalue;
|
||||||
|
|
||||||
(void)argc;
|
(void)argc;
|
||||||
(void)argv;
|
(void)argv;
|
||||||
|
|
@ -87,13 +91,12 @@ int main(int argc, char *argv[], char **envp)
|
||||||
cmd = minishell_parse(&app, line);
|
cmd = minishell_parse(&app, line);
|
||||||
free(line);
|
free(line);
|
||||||
debug_command(cmd, &app);
|
debug_command(cmd, &app);
|
||||||
execute_command(cmd, &app);
|
retvalue = execute_command(cmd, &app);
|
||||||
cmd_destroy(cmd);
|
cmd_destroy(cmd);
|
||||||
|
if (retvalue == SUBPROCESS)
|
||||||
|
break ;
|
||||||
if (g_signum != 0)
|
if (g_signum != 0)
|
||||||
{
|
|
||||||
readline_reset();
|
readline_reset();
|
||||||
g_signum = 0;
|
|
||||||
}
|
|
||||||
line = get_command(&app);
|
line = get_command(&app);
|
||||||
}
|
}
|
||||||
env_destroy(app.env);
|
env_destroy(app.env);
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/09 14:02:47 by khais #+# #+# */
|
/* Created: 2025/04/09 14:02:47 by khais #+# #+# */
|
||||||
/* Updated: 2025/04/28 12:11:44 by khais ### ########.fr */
|
/* Updated: 2025/04/29 14:30:32 by khais ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -20,6 +20,12 @@
|
||||||
# include <sys/stat.h>
|
# include <sys/stat.h>
|
||||||
# include <fcntl.h>
|
# include <fcntl.h>
|
||||||
|
|
||||||
|
typedef enum e_subprocess
|
||||||
|
{
|
||||||
|
SUBPROCESS,
|
||||||
|
PARENTPROCESS,
|
||||||
|
} t_subprocess;
|
||||||
|
|
||||||
typedef struct s_std_fds
|
typedef struct s_std_fds
|
||||||
{
|
{
|
||||||
int stdin;
|
int stdin;
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/17 12:01:39 by khais #+# #+# */
|
/* Created: 2025/04/17 12:01:39 by khais #+# #+# */
|
||||||
/* Updated: 2025/04/17 12:03:04 by khais ### ########.fr */
|
/* Updated: 2025/04/29 15:13:42 by khais ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -36,6 +36,7 @@ void readline_reset(void)
|
||||||
rl_replace_line("", 0);
|
rl_replace_line("", 0);
|
||||||
ft_printf("\n");
|
ft_printf("\n");
|
||||||
rl_redisplay();
|
rl_redisplay();
|
||||||
|
g_signum = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue