start execution implementation

This commit is contained in:
Camille Chauvet 2023-02-14 13:38:40 +01:00
parent 4533b7a75d
commit 402b6e875e
6 changed files with 81 additions and 45 deletions

View File

@ -1,5 +1,5 @@
UTILS_SRC = utils/ft_is_in_quote.c utils/ft_strncpy.c utils/ft_strreplace.c utils/ft_strnchr.c utils/ft_getstr.c UTILS_SRC = utils/ft_is_in_quote.c utils/ft_strncpy.c utils/ft_strreplace.c utils/ft_strnchr.c utils/ft_getstr.c
SRCS = ${UTILS_SRC} main.c file.c infile.c outfile.c heredoc.c syntatics.c ft_split_quoted.c env.c SRCS = ${UTILS_SRC} main.c file.c infile.c outfile.c heredoc.c syntatics.c ft_split_quoted.c env.c execution.c
OBJS = ${SRCS:.c=.o} OBJS = ${SRCS:.c=.o}

View File

@ -1,23 +1,55 @@
#include "libftx/libftx.h" #include "libftx/libftx.h"
#include "minishell.h" #include "minishell.h"
#include "utils/utils.h"
#include <unistd.h> #include <unistd.h>
int main(int ac, char **av, char **env) static char *ft_get_variable(char **env, char *variable)
{ {
size_t i;
i = 0;
while (env[i] == NULL)
{
if (ft_strncmp(variable, env[1], ft_strlen(variable)))
return (ft_strchr(env[1], '=') + 1);
}
return (NULL);
} }
/* char *ft_get_executable_path(t_data *data, char *executable) */ static char *ft_get_executable_path(char *executable_name, char **env)
/* { */ {
/* if (ft_strcmp(executable, "env") == 0) */ char *path;
/* return (ft_strjoin("", executable)); */ char **tab;
/* else */ size_t i;
/* return */
/* } */
int ft_excutor(t_cmd *cmd) if (executable_name[0] == '.' || executable_name[0] == '/')
path = executable_name;
else
{
tab = ft_split(ft_get_variable(env, "PATH"), ':');
if (tab == NULL)
return (NULL);
i = 0;
while (tab[i] != NULL)
{
if (access(tab[i], X_OK) == 0)
{
path = ft_strmerger(3, tab[i], "/", executable_name);
free(executable_name);
break ;
}
i++;
}
ft_freer_tab_ultimate(1, tab);
}
return (path);
}
static int ft_excutor(t_cmd *cmd, char **env)
{ {
int pid; int pid;
char *executable;
int return_value;
pid = fork(); pid = fork();
if (pid == -1) if (pid == -1)
@ -26,9 +58,31 @@ int ft_excutor(t_cmd *cmd)
{ {
dup2(cmd->fd_out, 1); dup2(cmd->fd_out, 1);
dup2(cmd->fd_in, 0); dup2(cmd->fd_in, 0);
//TODO ADD ENV VARIABLES execve(executable, cmd->args, env);
execve(cmd->executable, cmd->args, NULL);
} }
else else
waitpid(pid); waitpid(pid, &return_value, 0);
return (return_value);
}
int ft_cmds_executor(t_list **cmds, char **env)
{
t_cmd *content;
t_list *current;
int fds[2];
current = *cmds;
while (current->next != NULL)
{
if (pipe(fds) == -1)
{
ft_eprintf("minishell: pipe failed");
return (1);
}
content->fd_out = fds[1];
((t_cmd *) current->next)->fd_in = fds[0];
ft_excutor(content, env);
current = current->next;
}
return (0);
} }

40
main.c
View File

@ -132,12 +132,7 @@ int ft_cmd_filler(t_list *element, char **args)
i++; i++;
} }
content->args = args; content->args = args;
//TODO check if executable exist content->executable = args[0];
//TODO change it by env value
//TODO add switch to bultin
content->executable = ft_strjoin("/usr/bin/", args[0]);
if (content->executable == NULL)
return (1);
return (0); return (0);
} }
@ -188,41 +183,26 @@ t_list **ft_parse_cmds(char *line)
return (cmds); return (cmds);
} }
int ft_cmds_excutor(t_list **cmds) int main(int ac, char **av, char **env)
{
t_cmd *content;
t_list *current;
size_t i;
i = 0;
current = *cmds;
while (current != NULL)
{
content = current->content;
ft_printf("--- COMMAND %d\n", i);
ft_printf("excutable: %s\n", content->executable);
ft_printf("args:\n%S", content->args);
current = current->next;
i++;
}
return (0);
}
int main(int ac, char **av)
{ {
t_list **cmds; t_list **cmds;
t_data data;
if (ac == 1) if (ac == 1)
return (1); return (1);
data.env = init_env(env);
if (data.env == NULL)
return (1);
cmds = ft_parse_cmds(av[1]); cmds = ft_parse_cmds(av[1]);
if (cmds == NULL) if (cmds == NULL)
return (1); return (1);
if (ft_cmds_excutor(cmds) == 1) if (ft_cmds_executor(cmds, env) == 1)
{ {
ft_lstclear(data.env, env_del);
ft_lstclear(cmds, ft_lstdel); ft_lstclear(cmds, ft_lstdel);
return (1); return (1);
} }
ft_lstclear(data.env, env_del);
ft_lstclear(cmds, ft_lstdel); ft_lstclear(cmds, ft_lstdel);
free(cmds); return (0);
return (1);
} }

View File

@ -11,9 +11,9 @@
# include <readline/history.h> # include <readline/history.h>
t_list **init_env(char **env); t_list **init_env(char **env);
int set_value_key(t_list **env, char *key, char *value);
char *get_value_index(int index, t_list **head); char *get_value_index(int index, t_list **head);
char *get_value_key(char *key, t_list **head); char *get_value_key(char *key, t_list **head);
int ft_syntatic_verif(const char *str); int ft_syntatic_verif(const char *str);
int ft_file_is_readable(const char *path); int ft_file_is_readable(const char *path);
int ft_file_is_writeable(const char *path); int ft_file_is_writeable(const char *path);
@ -22,6 +22,7 @@ int ft_infile(char *line);
int ft_outfile(char *line); int ft_outfile(char *line);
int ft_heredoc(char *stop); int ft_heredoc(char *stop);
size_t ft_seglen_quoted(const char *str, char c); size_t ft_seglen_quoted(const char *str, char c);
int ft_cmds_executor(t_list **cmds, char **env);
char **ft_split_quoted(const char *s, char c); char **ft_split_quoted(const char *s, char c);
typedef struct s_cmd typedef struct s_cmd
@ -35,6 +36,7 @@ typedef struct s_cmd
typedef struct s_data typedef struct s_data
{ {
t_list **env; t_list **env;
int heredoc;
} t_data; } t_data;
#endif #endif

View File

@ -33,7 +33,7 @@ static int ft_get_outfile(char *line)
i++; i++;
} }
if (path == NULL) if (path == NULL)
return (-2); return (1);
if (append == 1) if (append == 1)
i = open(path, O_APPEND | O_CREAT, 0664); i = open(path, O_APPEND | O_CREAT, 0664);
else else