From 4d3c25547e7b219edf8ed7a928ec1f3a79240ab4 Mon Sep 17 00:00:00 2001 From: Camille Chauvet Date: Mon, 13 Mar 2023 14:23:27 +0100 Subject: [PATCH] fix --- .nfs00000000098c816000000394 | Bin 123976 -> 0 bytes Makefile | 3 +- execution/execution.c | 4 +- main.c | 6 +- parse/parse.c | 48 +++++------ redirection/file.c | 31 +++++-- redirection/infile.c | 138 ------------------------------ redirection/outfile.c | 135 ----------------------------- redirection/redirection.c | 114 ++++++++++++++++++++++++ redirection/redirection.h | 5 +- redirection/redirection_private.h | 6 +- t | 1 + 12 files changed, 174 insertions(+), 317 deletions(-) delete mode 100755 .nfs00000000098c816000000394 delete mode 100644 redirection/infile.c delete mode 100644 redirection/outfile.c create mode 100644 redirection/redirection.c create mode 100755 t diff --git a/.nfs00000000098c816000000394 b/.nfs00000000098c816000000394 deleted file mode 100755 index 4655b918edae4a3fb89897a7be38ab7a03bbbc4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123976 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%0DkSnN*0A#|Mrm|VjGXNdZ9f)oQ86c7 zKq4PrIM*R9P(e>xJm~m}2VGe4pgUmM1GR>GsX3Kuz54TdD815ARHN02)H#jDy+U8k z?X$v5w2l`jT8z5I0ou;KjBXK01nX3VRyrk7;o0*Uexo{S*Vxcg$5@yeSDH(hr5wO1BIPRK7Any+~Q&WT(53;k2mGRrVtjy&M0 z%`ZDu!Lu(6Uw7@*mtRp>*SQV{qexFY=!B$6x8{VGJve+)5AiUa+_K9Y4mYu*2GJ=a zEs;kI@K)Q4kd;R=Uyg`Cs=$jHZpxJ2?p#8-fVh_;2FZE-Iew9&6vLRX$2q+!5A%tn z?%Cm#oYj%cHij6d__Oj&6vBq8tW6O!=S*+k}56LYo{@TOLlWd^KOT z=+KID0%oLRUcQ^_a{n-X%&e-(sK(qPkuot@9wgqnWO{e%0|!8m+Rm8aEqPuE`I6a? z!bCK)#bkftSQC+_XFu#z2+}I!k}mpp3?vJszpwKTHotB;$CFIO#+kQe@+2J(RV0(L zz$C=@LAa_wJt7&6vK{4$vm-lavkzZ^SrKb;v}AilW#zo|MO1~0`W{XNA)g#4gXetT zXtKic5gp_PO3Wp?P#D@a4##z76HzfRHC`C*!_AR6KZj0L9Q2XnH-)QjK!yQaZv}$v2wgox>0vR4`fTq zQzU#fYjn#i;HJz;+~U#C4g(pbk^aKOh&Z3>DACEa+$2;)$K*-o85jW__6es`0cIkZ zw#xmtLmDzU$`L7K1IBS>CIqH>sDn+N=Y09(4II3uaF9`k)14Y~B7wx_&YHw0P}W(V z+8BsbU51Ds^?NQ$LV~5as-82b{WS++=NZ1EZ={5SWmQ82LQ>c7#38KliDCt{_x1O~ zJvf=&$pcnO_KgHx?3`Z38BQd1NQfV<(Kegca=8!Uzl%=G@eDxm%Fc?WEclSK7!;6^ zFfy-w8Cr}h4mP<#iiu_v#Pv&c!wHEr+cMEfWz19dI;So}D9{`~=aV>#7O8pB>AXVW zrt7Y-X&u>PC@UWpvh#@Os2-R^vZy3=AqR~(*J>ahG{!R%*LK#m=Fz=}sPW7+8%{UkbYH z@~c<#1cby5v+11!yT(wSK2ev%*kSBMpny1Vc^@;_+XRl0c8U<{Bqe*DTp=TFT&C5| z;;^lWhX;_?g*1mQjx~pSN5OsDM*30fILg9Tr&OSYfuX%ltkLE0Rp&r)>+}$*WgHEc z_r9%LCyU!%Na)UDh`|%_S%N}nl1N)&pGb%D_6Y+lHMo12`N9R|M@z7^TF(DeI+VDl zEdMDIioVR;Sq7Ysw|M^VrbCJQuI2BLQ1n%q|22sE@y~uX?%MDC;B&T*=<0WN_gqwz zyj_oPSc}T-cmDEgEq|{S470!B$>m=txjnB3PbPKsJHPsStim5yI`^o=-_3~lS*-oe z|9&Sc#K+lPUHe@(^Z5z<$Md^$4#OYORCC?HX;8-6UghyPzT^4bd5GOC7@w==>eGF@ z@pIurc!9}MctBuZ3FYB^P9K%&UD!RpjAX6&cinX7D{?c;|8?Xg?YR8z97dbvKg!PG z&Efhh+`6$-<{WZ(Ka?*I+nqY%kQ4w0W6;1I}$RP=N*!7_s{^oT|W1ue2C|F z`^<+9X_gA~m-B0^=e>j%mgU;-?C@Vbq$%pPUt>M*U+}{E*E)bbU4FOk;G&t9ANTa} z;@&kzzhCtQecrb|4y{hxS||ULwsG~%Q;(hhq&oTEf1$SOX9LI1e}?6+?Em|ISM%p8 z5U9|o9}JgyH&)dr9?_InEmPofJU)znH|}o!XavlSou<_97tNvjD48qvarHY8#Z;~Q PN4}vc&#lN%5%m5KuE;Ih diff --git a/Makefile b/Makefile index 5c15c8d..b42dc7f 100644 --- a/Makefile +++ b/Makefile @@ -21,9 +21,8 @@ SRCS = ${BUILTINS_SRC} \ ./syntax/syntax.c \ ./format/format.c \ ./redirection/heredoc.c \ - ./redirection/infile.c \ - ./redirection/outfile.c \ ./redirection/file.c \ + ./redirection/redirection.c \ ./parse/parse.c OBJS = ${SRCS:.c=.o} diff --git a/execution/execution.c b/execution/execution.c index bc64e6c..b32171f 100644 --- a/execution/execution.c +++ b/execution/execution.c @@ -51,12 +51,12 @@ static bool ft_executor(t_cmd *cmd, char **env) return (1); if (cmd->pid == 0) { - dup2(cmd->fd_in[0], 0); - dup2(cmd->fd_out[0], 1); if (cmd->fd_in[1] != -1) dup2(cmd->fd_in[1], 0); if (cmd->fd_out[1] != -1) dup2(cmd->fd_out[1], 1); + dup2(cmd->fd_in[0], 0); + dup2(cmd->fd_out[0], 1); ft_closer(cmd->fd_in); ft_closer(cmd->fd_out); execve(cmd->executable, cmd->args, env); diff --git a/main.c b/main.c index c6ae897..977ce93 100644 --- a/main.c +++ b/main.c @@ -10,8 +10,6 @@ /* */ /* ************************************************************************** */ -#include "cmd/cmd.h" -#include "libftx/libft/list.h" #include "minishell.h" static char *ft_get_user_input() @@ -89,7 +87,8 @@ void ft_ctrlc(int num) void ft_quit(int num) { (void) num; - + rl_replace_line("", 0); + rl_redisplay(); ft_printf("%c%c %c%c", 0, 0, 0, 0); } @@ -122,7 +121,6 @@ int main(int ac, char **av, char **env) if (line == NULL) break ; } - free(data.exit_code_str); ft_lstclear(data.cmds, ft_cmddel); free(data.cmds); diff --git a/parse/parse.c b/parse/parse.c index c4442c1..cb324e6 100644 --- a/parse/parse.c +++ b/parse/parse.c @@ -1,26 +1,5 @@ #include "./parse_private.h" -static int ft_redirection_parse(t_data *data, char *cmd_str, t_cmd *cmd) -{ - int fd_in; - int fd_out; - - fd_in = ft_infile(data, cmd_str); - if (fd_in == -2) - return (1); - fd_out = ft_outfile(data, cmd_str); - if (fd_out == -2) - { - close(fd_in); - return (1); - } - cmd->fd_in[0] = fd_in; - cmd->fd_in[1] = -1; - cmd->fd_out[0] = fd_out; - cmd->fd_out[1] = -1; - return (0); -} - int ft_args_parse(t_data *data, char *cmd_str, t_cmd *cmd) { char **tab; @@ -39,6 +18,7 @@ int ft_args_parse(t_data *data, char *cmd_str, t_cmd *cmd) ft_freer_tab_ultimate(1, tab); return (1); } + ft_quote_remover(str); free(tab[i]); tab[i] = str; i++; @@ -54,7 +34,12 @@ int ft_executable_parse(t_data *data, t_cmd *cmd) path = cmd->args[0]; own = 0; - if (ft_strcmp(cmd->args[0], "env") == 0) + if (cmd->args[0] == NULL) + { + ft_closer(cmd->fd_in); + ft_closer(cmd->fd_out); + } + else if (ft_strcmp(cmd->args[0], "env") == 0) own = 1; else if (ft_strcmp(cmd->args[0], "export") == 0) own = 1; @@ -68,7 +53,7 @@ int ft_executable_parse(t_data *data, t_cmd *cmd) own = 1; else if (ft_strcmp(cmd->args[0], "cd") == 0) own = 1; - if (own == 0) + else path = ft_get_executable(data->env, cmd->args[0]); cmd->own_cmd = own; cmd->executable = path; @@ -86,8 +71,11 @@ int ft_cmd_parser(t_data *data, char *cmd_str) ft_eprintf("minishell: malloc failed\n"); return (1); } - if (ft_redirection_parse(data, cmd_str, cmd)) + if (ft_redirection(data, cmd, cmd_str)) + { + ft_cmddel(cmd); return (1); + } if (ft_args_parse(data, cmd_str, cmd)) { ft_cmddel(cmd); @@ -118,11 +106,17 @@ int ft_cmds_parser(t_data *data, const char *line) i = 0; while (tab[i] != NULL) { - ft_cmd_parser(data, tab[i]); + if (ft_cmd_parser(data, tab[i])) + { + ft_freer_tab_ultimate(1, tab); + return (1); + } i++; } - ft_add_fd(((t_cmd *) (*data->cmds)->content)->fd_in, 0); - ft_add_fd(((t_cmd *) ((ft_lstlast(*data->cmds))->content))->fd_out, 1); + if (((t_cmd *) (*data->cmds)->content)->fd_in[0] == -1) + ((t_cmd *) (*data->cmds)->content)->fd_in[0] = 0; + if (((t_cmd *) (ft_lstlast(*data->cmds))->content)->fd_out[0] == -1) + (((t_cmd *) (ft_lstlast(*data->cmds))->content)->fd_out[0] = 1); ft_freer_tab_ultimate(1, tab); return (0); } diff --git a/redirection/file.c b/redirection/file.c index 7789403..052216c 100644 --- a/redirection/file.c +++ b/redirection/file.c @@ -12,7 +12,7 @@ #include "./redirection_private.h" -int ft_file_is_readable(const char *path) +int ft_file_is_readable(t_data *data, const char *path) { int readable; int fd; @@ -20,12 +20,14 @@ int ft_file_is_readable(const char *path) fd = open(path, O_RDONLY); if (fd == -1) { + data->exit_code = 1; ft_eprintf("minishell: %s: No such file or directory\n", path); return (0); } readable = read(fd, "", 0); if (readable == -1) { + data->exit_code = 1; ft_eprintf("minishell: %s: Permission denied\n", path); return (0); } @@ -33,27 +35,46 @@ int ft_file_is_readable(const char *path) return (1); } -int ft_file_is_writable(const char *path) +int ft_file_is_writable(t_data *data, const char *path) { int writeable; int fd; - fd = open(path, O_WRONLY | O_CREAT, 0644); + fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0644); if (fd == -1) { + data->exit_code = 1; ft_eprintf("minishell: %s: Permission denied\n", path); return (0); } writeable = write(fd, "", 0); if (writeable == -1) { + data->exit_code = 1; ft_eprintf("minishell: %s: Permission denied\n", path); return (0); } return (fd); } -int ft_file_is_executable(const char *path) +int ft_file_is_appendable(t_data *data, const char *path) { - return (access(path, X_OK) == 0); + int writeable; + int fd; + + fd = open(path, O_WRONLY | O_APPEND | O_CREAT, 0644); + if (fd == -1) + { + data->exit_code = 1; + ft_eprintf("minishell: %s: Permission denied\n", path); + return (0); + } + writeable = write(fd, "", 0); + if (writeable == -1) + { + data->exit_code = 1; + ft_eprintf("minishell: %s: Permission denied\n", path); + return (0); + } + return (fd); } diff --git a/redirection/infile.c b/redirection/infile.c deleted file mode 100644 index 773bd45..0000000 --- a/redirection/infile.c +++ /dev/null @@ -1,138 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* infile.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cchauvet exit_code = 1; - return_code = -1; - } - } - if (ft_contain_only_str(tab[i + 1], "| <>")) - return_code = 0; - } - } - if (return_code == 0) - ft_eprintf("minishell: %s: must be followed by an infile\n", tab[i]); - ft_freer_tab_ultimate(1, tab); - return (return_code); -} - -static int ft_get_infile(t_data *data, const char *line) -{ - size_t i; - int fd; - char **tab; - char *path; - - tab = ft_split_quoted(line, ' '); - if (tab == NULL) - { - ft_eprintf("minishell: malloc failed\n"); - return (-2); - } - fd = -1; - i = 0; - while (tab[i + 1] != NULL) - { - if (tab[i][0] == '<') - if (fd != 0) - close(fd); - if (ft_strcmp("<", tab[i]) == 0) - { - path = ft_env_filler(data, tab[i + 1]); - if (path == NULL) - return (-2); - ft_quote_remover(path); - fd = open(path, O_RDONLY); - free(path); - } - else if (ft_strcmp("<<", tab[i]) == 0) - fd = ft_heredoc(data, ft_quote_remover(tab[i + 1])); - i++; - } - ft_freer_tab_ultimate(1, tab); - return (fd); -} - -static int ft_remove_infile(char *line) -{ - size_t i; - size_t y; - char **tab; - - tab = ft_split_quoted(line, ' '); - if (tab == NULL) - { - ft_eprintf("minishell: malloc failed\n"); - return (1); - } - i = 0; - y = 0; - while (tab[i] != NULL) - { - if (tab[i][0] == '<') - { - ft_strshift(line + y, - (-1) * (ft_strlen(tab[i]) + ft_strlen(tab[i + 1]) + 1 + (line[ft_strlen(tab[i]) + ft_strlen(tab[i + 1]) + 1] != '\0'))); - i++; - } - else - y = y + ft_strlen(tab[i]) + (y != 0); - i++; - } - ft_freer_tab_ultimate(1, tab); - return (0); -} - -int ft_infile(t_data *data, char *line) -{ - int fd; - - if (ft_infile_is_valid(data, line) == 0) - return (-2); - fd = ft_get_infile(data, line); - if (fd == -2) - return (-2); - ft_remove_infile(line); - return (fd); -} diff --git a/redirection/outfile.c b/redirection/outfile.c deleted file mode 100644 index adaf83f..0000000 --- a/redirection/outfile.c +++ /dev/null @@ -1,135 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* infile.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cchauvet ') - { - path = ft_env_filler(data, tab[i + 1]); - if (path == NULL) - return (0); - ft_quote_remover(path); - if (ft_file_is_writable(path) == 0) - { - data->exit_code = 1; - free(path); - ft_freer_tab_ultimate(1, tab); - return (0); - } - if (ft_contain_only_str(path, "| >>")) - { - free(path); - ft_eprintf("minishell: %s: must be followed by an outfile\n", path); - ft_freer_tab_ultimate(1, tab); - return (0); - } - free(path); - } - } - ft_freer_tab_ultimate(1, tab); - return (1); -} - -static int ft_get_outfile(t_data *data, const char *line) -{ - size_t i; - int fd; - char **tab; - char *path; - - tab = ft_split_quoted(line, ' '); - if (tab == NULL) - { - ft_eprintf("minishell: malloc failed\n"); - return (-2); - } - fd = -1; - i = 0; - while (tab[i + 1] != NULL) - { - if (tab[i][0] == '>') - if (fd != 0) - close(fd); - path = ft_env_filler(data, tab[i + 1]); - if (path == NULL) - return (-2); - ft_quote_remover(path); - if (ft_strcmp(">", tab[i]) == 0) - fd = open(path, O_TRUNC | O_CREAT | O_WRONLY, 0644); - else if (ft_strcmp(">>", tab[i]) == 0) - fd = open(path, O_CREAT | O_APPEND, 0644); - free(path); - i++; - } - ft_freer_tab_ultimate(1, tab); - return (fd); -} - -static int ft_remove_outfile(char *line) -{ - size_t i; - size_t y; - char **tab; - - tab = ft_split_quoted(line, ' '); - if (tab == NULL) - { - ft_eprintf("minishell: malloc failed\n"); - return (1); - } - i = 0; - y = 0; - while (tab[i] != NULL) - { - if (tab[i][0] == '>') - { - ft_strshift(line + y, - (-1) * (ft_strlen(tab[i]) + ft_strlen(tab[i + 1]) + 1 + (line[ft_strlen(tab[i]) + ft_strlen(tab[i + 1]) + 1] != '\0'))); - i++; - } - else - y = y + ft_strlen(tab[i]) + (y != 0); - i++; - } - ft_freer_tab_ultimate(1, tab); - return (0); -} - -int ft_outfile(t_data *data, char *line) -{ - int fd; - - if (ft_outfile_is_valid(data, line) == 0) - return (-2); - fd = ft_get_outfile(data, line); - if (fd == -2) - return (-2); - ft_remove_outfile(line); - return (fd); -} diff --git a/redirection/redirection.c b/redirection/redirection.c new file mode 100644 index 0000000..c9fa7d1 --- /dev/null +++ b/redirection/redirection.c @@ -0,0 +1,114 @@ +#include "redirection_private.h" + +int ft_replace_file(t_data *data, char **tab) +{ + size_t i; + char *redirection; + + i = 0; + while (tab[i] != NULL) + { + if (ft_is_in("<>", tab[i][0])) + { + i++; + redirection = ft_env_filler(data, tab[i]); + if (redirection == NULL) + return (1); + free(tab[i]); + tab[i] = redirection; + ft_quote_remover(tab[i]); + } + i++; + } + return (0); +} + +void ft_remove_redirection(char *cmd_str) +{ + size_t i; + ssize_t start; + ssize_t stop; + + i = 0; + while (cmd_str[i] != '\0') + { + start = -1; + while ((ft_is_in_quote(cmd_str, i) || !ft_is_in("<>", cmd_str[i])) + && cmd_str[i] != '\0') + i++; + if (ft_is_in("<>", cmd_str[i])) + start = i; + while (cmd_str[i] == cmd_str[start]) + i++; + i++; + while (cmd_str[i] != '\0' && (cmd_str[i] != ' ' || ft_is_in_quote(cmd_str, i))) + i++; + stop = i - start; + if (start != -1) + ft_strshift(cmd_str + start, -1 * stop); + } +} + +int ft_set_redirection(t_data *data, t_cmd *cmd, char **tab) +{ + size_t i; + + i = 0; + while (tab[i + 1] != NULL) + { + ft_quote_remover(tab[i + 1]); + if (ft_strcmp(tab[i], "<<") == 0) + { + cmd->fd_in[0] = ft_heredoc(data, tab[i + 1]); + if (cmd->fd_in[0] == -2) + return (1); + } + else if (ft_strcmp(tab[i], "<") == 0) + { + if (ft_file_is_readable(data, tab[i + 1])) + cmd->fd_in[0] = open(tab[i + 1], O_RDONLY); + else + return (1); + } + else if(ft_strcmp(tab[i], ">") == 0) + { + if (ft_file_is_writable(data, tab[i + 1])) + cmd->fd_out[0] = open(tab[i + 1], O_WRONLY | O_TRUNC | O_CREAT, 0644); + else + return (1); + } + else if(ft_strcmp(tab[i], ">>") == 0) + { + if (ft_file_is_appendable(data, tab[i + 1])) + cmd->fd_out[0] = open(tab[i + 1], O_WRONLY | O_APPEND | O_CREAT, 0644); + else + return (1); + } + i++; + } + return (0); +} + +int ft_redirection(t_data *data, t_cmd *cmd, char *cmd_str) +{ + char **tab; + + cmd->fd_in[0] = -1; + cmd->fd_in[1] = -1; + cmd->fd_out[0] = -1; + cmd->fd_out[1] = -1; + tab = ft_split_quoted(cmd_str, ' '); + if (tab == NULL) + { + ft_eprintf("minishell: malloc failed\n"); + return (1); + } + ft_remove_redirection(cmd_str); + if (ft_set_redirection(data, cmd, tab)) + { + ft_freer_tab_ultimate(1, tab); + return (1); + } + ft_freer_tab_ultimate(1, tab); + return (0); +} diff --git a/redirection/redirection.h b/redirection/redirection.h index baf4b34..cb5bb30 100644 --- a/redirection/redirection.h +++ b/redirection/redirection.h @@ -1,8 +1,9 @@ #ifndef REDIRECTION_H # define REDIRECTION_H # include "../data/data.h" +# include "../cmd/cmd.h" -int ft_infile(t_data *data, char *line); -int ft_outfile(t_data *data, char *line); +int ft_redirection(t_data *data, t_cmd *cmd, char *cmd_str); int *ft_get_heredoc(); + #endif diff --git a/redirection/redirection_private.h b/redirection/redirection_private.h index e22e87f..e816796 100644 --- a/redirection/redirection_private.h +++ b/redirection/redirection_private.h @@ -8,9 +8,11 @@ # include "../data/data.h" # include "../env/env.h" # include "../utils/utils.h" +# include "../cmd/cmd.h" -int ft_file_is_readable(const char *path); -int ft_file_is_writable(const char *path); +int ft_file_is_readable(t_data *data, const char *path); +int ft_file_is_writable(t_data *data, const char *path); +int ft_file_is_appendable(t_data *data, const char *path); int ft_heredoc(t_data *data, char *stop); #endif diff --git a/t b/t new file mode 100755 index 0000000..9b47f86 --- /dev/null +++ b/t @@ -0,0 +1 @@ +bozo