Compare commits

...

39 Commits

Author SHA1 Message Date
daaa9dea51 add: read input 2023-02-17 16:33:52 +01:00
fa37938073 fix: heredoc will not have history 2023-02-17 14:40:57 +01:00
7bec120312 fix: env filler variable do not exist cause invalid read 2023-02-17 13:42:53 +01:00
6090784c02 add: env_to_strs support for execve 2023-02-17 13:27:40 +01:00
d4cead2b0f clean: .env_fill.c.swp remove 2023-02-17 13:25:37 +01:00
61cd1209ff Merge branch 'master' into camille 2023-02-17 13:24:52 +01:00
6ecb66a60e clean 2023-02-17 13:24:43 +01:00
642af26133 fix: leak with > but no file 2023-02-17 13:21:50 +01:00
38e1b9834f Merge branch 'camille' 2023-02-17 13:08:06 +01:00
e31fff5137 bozo 2023-02-17 13:07:10 +01:00
8b771d6615 Ajout d'une fonction t_list -> char** nommé 'env_to_strs' 2023-02-17 13:06:16 +01:00
96da8e54c3 add: env variable support, but invalid read for a non existant variable 2023-02-16 18:28:10 +01:00
e48ee8b693 fix: empty line, leaks, pipe 2023-02-16 16:29:46 +01:00
f20038e37b merge wallah ct chaud 2023-02-16 15:19:28 +01:00
edbd267c0d merge 2023-02-16 15:17:32 +01:00
de8dfc41d4 merge 2023-02-16 15:13:55 +01:00
82a0af80ad merge: remove env to pre 2023-02-16 15:10:40 +01:00
c44530728c fix: pipe alone fix 2023-02-16 14:54:19 +01:00
1fb6e0a2c1 Bon j'ai un peu ranger mais bon voila 2023-02-16 14:30:49 +01:00
02f5815485 Bon il faut ranger la chambre sinon impec 2023-02-16 14:30:28 +01:00
22b7a4feea fix: quote infinit loop 2023-02-16 13:53:49 +01:00
8366b63821 clean: remove useless file 2023-02-15 21:34:23 +01:00
0ba212410f fix: remove useless print 2023-02-15 21:33:19 +01:00
56eead9241 fix: empty input segfault 2023-02-15 21:31:49 +01:00
99fdd578e9 fix quote je pense ca marche 2023-02-15 20:52:27 +01:00
c5467769d9 work 2023-02-14 17:11:39 +01:00
b20d4e0ddc bozo 2023-02-14 13:55:02 +01:00
afaf34f869 bozo 2023-02-14 13:54:41 +01:00
8283472d2e Merge branch 'camille' of git.chauvet.pro:starnakin/minishell into camille 2023-02-14 13:39:22 +01:00
402b6e875e start execution implementation 2023-02-14 13:38:40 +01:00
1423d42583 rename function 2023-02-14 07:33:02 +01:00
78b66b539d Merge branch 'master' into camille 2023-02-14 07:27:41 +01:00
67fb6d0533 -m 2023-02-14 07:26:18 +01:00
4533b7a75d remove testfile 2023-02-14 07:22:29 +01:00
cf4bacd42e merge master and camille 2023-02-14 07:21:24 +01:00
7b3389c75d Tient Camille 0 bug whula 2023-02-10 13:19:28 +01:00
4f77dde859 ca compile mtn 2023-02-02 18:26:09 +01:00
13d412ea71 Push sur ta branche 2023-02-02 17:40:09 +01:00
1533fb8c65 0.1 2023-02-01 17:08:02 +01:00
134 changed files with 1431 additions and 495 deletions

Binary file not shown.

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_split_quoted.c utils/ft_strshift.c utils/ft_quote_remover.c utils/ft_str_is_empty.c
SRCS = ${UTILS_SRC} main.c file.c infile.c outfile.c heredoc.c syntatics.c ft_split_quoted.c SRCS = ${UTILS_SRC} main.c file.c infile.c outfile.c heredoc.c syntatics.c cmd.c cmds.c env.c execution.c spacer.c env_fill.c
OBJS = ${SRCS:.c=.o} OBJS = ${SRCS:.c=.o}
@ -7,7 +7,7 @@ NAME = minishell
CC = gcc CC = gcc
CFLAGS = -Wall -Werror -Wextra -g CFLAGS = -Werror -Wextra -g
LIBS = libftx/libftx.a LIBS = libftx/libftx.a
@ -28,7 +28,8 @@ fclean: clean
make -C libftx fclean make -C libftx fclean
rm -f ${NAME} rm -f ${NAME}
re: fclean all re: fclean
make all
.PHONY: all clean fclean re .PHONY: all clean fclean re

BIN
a.out

Binary file not shown.

Binary file not shown.

26
builtin/env.c Normal file
View File

@ -0,0 +1,26 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* env.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/14 14:56:02 by cchauvet #+# #+# */
/* Updated: 2023/02/14 14:58:40 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "../minishell.h"
int main(char **env)
{
t_list **head;
t_list *current;
while (current != NULL)
{
ft_putendl_fd(1, current->content);
current = current->next;
}
return (0);
}

40
builtin/export.c Normal file
View File

@ -0,0 +1,40 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* export.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/14 14:27:08 by cchauvet #+# #+# */
/* Updated: 2023/02/14 14:52:50 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "../minishell.h"
int main(char **env)
{
t_list **env_lst;
t_list *current;
char *key;
char *value;
env_lst = init_env(env);
current = *env_lst;
while (current != NULL)
{
value = ft_strchr(current->content, '=') + 1;
key = ft_strndup(current->content,
ft_strlen(current->content) - ft_strlen(value));
if (key == NULL)
{
ft_lstclear(env_lst, env_del);
return (1);
}
ft_printf("declare -x %s=\"%s\"\n", key, value);
free(key);
current = current->next;
}
ft_lstclear(env_lst, env_del);
return (0);
}

54
cmd.c Normal file
View File

@ -0,0 +1,54 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* cmd.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/15 14:18:21 by cchauvet #+# #+# */
/* Updated: 2023/02/16 18:25:14 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "libftx/libftx.h"
#include "minishell.h"
void ft_cmddel(void *ptr)
{
t_cmd *content;
content = (t_cmd *) ptr;
if (content->args != NULL)
ft_freer_tab_ultimate(1, content->args);
if (content->executable != NULL)
free(content->executable);
free(content);
}
int ft_cmd_filler(t_list *element, char **args, t_list **env)
{
t_cmd *content;
char *temp;
size_t i;
if (args == NULL)
return (1);
content = (t_cmd *)element->content;
i = 0;
while (args[i] != NULL)
{
temp = ft_env_filler(env, args[i]);
if (temp == NULL)
{
ft_eprintf("minishell: malloc failed\n");
return (1);
}
free(args[i]);
args[i] = temp;
ft_quote_remover(temp);
i++;
}
content->args = args;
content->executable = args[0];
return (0);
}

114
cmds.c Normal file
View File

@ -0,0 +1,114 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* cmds.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/15 14:17:26 by cchauvet #+# #+# */
/* Updated: 2023/02/17 15:20:29 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "libftx/libftx.h"
#include "minishell.h"
static int ft_cmds_init(t_list **cmds, size_t len)
{
t_cmd *content;
t_list *current;
size_t i;
*cmds = malloc(sizeof(t_list));
current = *cmds;
i = 0;
while (i < len)
{
content = malloc(sizeof(t_cmd));
if (content == NULL)
{
ft_lstclear(cmds, ft_cmddel);
return (1);
}
content->args = NULL;
content->executable = NULL;
content->fd_in = -1;
content->fd_out = -1;
current->content = content;
if (!((i + 1) < len))
{
current->next = NULL;
return (0);
}
current->next = malloc(sizeof(t_list));
if (current->next == NULL)
ft_lstclear(cmds, ft_cmddel);
current = current->next;
i++;
}
return (0);
}
static int ft_cmds_prep(t_list **cmds, const char *line, int infile, int outfile)
{
size_t len;
t_cmd *cmd;
t_list *current;
len = ft_seglen_quoted(line, '|');
if (len == 0)
return (0);
if (ft_cmds_init(cmds, ft_seglen_quoted(line, '|')))
{
free(cmds);
return (1);
}
cmd = (t_cmd *)(*cmds)->content;
cmd->fd_in = infile;
current = *cmds;
while (current->next != NULL)
current = current->next;
cmd = (t_cmd *) current->content;
cmd->fd_out = outfile;
return (0);
}
static int ft_cmds_fill(t_list **cmds, t_list **env, const char *line)
{
char **tab;
char **args;
t_list *current;
size_t i;
tab = ft_split_quoted(line, '|');
if (tab == NULL)
return (1);
i = 0;
current = *cmds;
while (tab[i] != NULL)
{
args = ft_split_quoted(tab[i], ' ');
if (ft_cmd_filler(current, args, env) == 1)
{
ft_lstclear(cmds, ft_cmddel);
ft_freer_tab_ultimate(2, args, tab);
return (1);
}
current = current->next;
i++;
}
ft_freer_tab_ultimate(1, tab);
return (0);
}
t_list **ft_parse_cmds(char *line, t_list **env, int infile, int outfile)
{
t_list **cmds;
cmds = malloc(sizeof(t_list *));
if (ft_cmds_prep(cmds, line, infile, outfile) == 1)
return (NULL);
if (ft_cmds_fill(cmds, env, line) == 1)
return (NULL);
return (cmds);
}

24
d
View File

@ -1,24 +0,0 @@
a.out
argprinter
d
execution.c
file.c
file.o
ft_split_quoted.c
ft_split_quoted.o
heredoc.c
heredoc.o
infile.c
infile.o
libftx
main.c
main.o
Makefile
minishell
minishell.h
outfile.c
outfile.o
syntatics.c
syntatics.o
t
utils

272
env.c Normal file
View File

@ -0,0 +1,272 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* env.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/02 14:39:56 by erey-bet #+# #+# */
/* Updated: 2023/02/17 13:05:29 by erey-bet ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
int get_index(char *s, char c)
{
int i;
i = -1;
while (s[++i])
if (s[i] == c)
return (i);
return (-1);
}
void print_export(t_list **head, int fd)
{
t_list *current;
current = *head;
while (current->next != NULL)
{
write(fd, "declare -x ", 11);
ft_putstr_fd(((t_env*)(current->content))->key, fd);
ft_putstr_fd("=", fd);
write(fd, "\"", 1);
ft_putstr_fd(((t_env*)(current->content))->value, fd);
write(fd, "\"\n", 2);
current = current->next;
}
}
void print_env(t_list **head, int fd)
{
t_list *current;
current = *head;
while (current->next != NULL)
{
ft_putstr_fd(((t_env*)(current->content))->key, fd);
ft_putstr_fd("=", fd);
ft_putstr_fd(((t_env*)(current->content))->value, fd);
write(fd, "\n", 1);
current = current->next;
}
}
int strcmp_alphabet(char *s1, char *s2)
{
int i;
if (!s1 || !s2)
return (-2);
i = 0;
while (s1[i] && s2[i])
{
if (s1[i] < s2[i])
return (0);
else if (s1[i] > s2[i])
return (1);
i++;
}
return (-1);
}
void ft_double_swap(void *a, void *b)
{
void *c;
c = a;
a = b;
b = c;
}
void exchange(void *a, void *b, void *c)
{
void *d;
d = a;
a = b;
b = c;
c = d;
}
char *get_value(char *str)
{
char *s;
int i;
int start;
s = ft_calloc(ft_strlen(str), sizeof(char));
start = get_index(str, '=');
i = start;
while (str[++i])
s[i - start - 1] = str[i];
return (s);
}
void env_del(void *ptr)
{
t_env *content;
content = ptr;
free(content->key);
free(content->value);
free(content);
}
char *get_key(char *str)
{
char *s;
int i;
s = ft_calloc(ft_strlen(str), sizeof(char));
i = -1;
while (str[++i] != '=')
s[i] = str[i];
return (s);
}
void swap_env_3(void **a, void **b, void **c)
{
void *d;
d = *a;
*a = *b;
*b = *c;
*c = d;
}
void swap_env(void **a, void **b)
{
void *c;
c = *a;
*a = *b;
*b = c;
}
void add_sort(t_list **head, t_env *var)
{
t_list *current;
t_env *last;
current = *head;
while (current->next != NULL && strcmp_alphabet(var->key, ((t_env*)(current->content))->key) != 0)
current = current->next;
if (current->content == NULL)
current->content = var;
else
{
last = NULL;
swap_env_3((void **)&last, &current->content, (void **)&var);
while (current->next != NULL)
{
current = current->next;
swap_env(&current->content, (void **)&last);
}
}
if (current->next == NULL)
current->next = ft_calloc(1, sizeof(t_list));
}
char *get_value_by_key(char *key, t_list **head)
{
t_list *current;
current = *head;
while (current->next != NULL)
{
if (ft_strcmp(((t_env *)current->content)->key, key) == 0)
return (((t_env *)current->content)->value);
current = current->next;
}
return (NULL);
}
int set_value_by_key(char *key, char *value, t_list **head)
{
t_list *current;
current = *head;
while (current->next != NULL)
{
if (ft_strcmp(((t_env *)current->content)->key, key) == 0)
{
free(((t_env *)current->content)->value);
((t_env *)current->content)->value = value;
return (0);
}
current = current->next;
}
return (1);
}
int create_value_by_key(char *key, char *value, t_list **head)
{
t_env *content;
if (set_value_by_key(key, value, head) == 0)
return (0);
content = ft_calloc(1, sizeof(t_env));
if (content == NULL)
return (1);
content->key = key;
content->value = value;
add_sort(head, content);
return (0);
}
char **env_to_strs(t_list **head)
{
t_list *current;
t_env *content;
char **env;
int i;
current = *head;
env = ft_calloc(ft_lstsize(*head), sizeof(char *));
i = 0;
while (current->content)
{
content = current->content;
env[i++] = ft_strmerger(3, content->key, "=", content->value);
current = current->next;
}
return (env);
}
t_list **init_env(char **env)
{
t_list **head;
int i;
t_env *var;
head = ft_calloc(1, sizeof(t_list *));
if (head == NULL)
return (NULL);
*head = ft_calloc(1, sizeof(t_list));
if (*head == NULL)
return (NULL);
i = -1;
while (env[++i])
{
var = ft_calloc(1, sizeof(t_env));
if (var == NULL)
return (NULL);
var->key = get_key(env[i]);
var->value = get_value(env[i]);
add_sort(head, var);
}
return (head);
}
/*int main(int argc, char *argv[], char **env)
{
t_list **new;
new = init_env(env);
ft_printf("%S", env_to_strs(new));
return (0);
}*/

76
env_fill.c Normal file
View File

@ -0,0 +1,76 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* env_fill.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/16 16:29:08 by cchauvet #+# #+# */
/* Updated: 2023/02/17 13:41:51 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "libftx/libftx.h"
#include "minishell.h"
#include "utils/utils.h"
static char *ft_get_value(t_list **env, const char *str, size_t start,
size_t stop)
{
char *key;
char *value;
key = ft_strndup(str + start, stop);
if (key == NULL)
{
ft_eprintf("minishell: malloc failed\n");
return (NULL);
}
value = get_value_by_key(key, env);
if (value == NULL)
value = "";
free(key);
return (value);
}
char *ft_env_filler(t_list **env, const char *str)
{
size_t i;
size_t y;
char *out;
char *temp;
char *value;
out = ft_strdup(str);
if (out == NULL)
{
ft_eprintf("minishell: malloc failed\n");
return (NULL);
}
i = 0;
while (out[i] != '\0')
{
while (ft_is_in_quote(out, i) == 1)
i++;
while (out[i] == '$')
{
y = i + 1;
while (out[y] != '\0' && out[y] != '$' && out[y] != ' ')
y++;
value = ft_get_value(env, out, i + 1, y - i - 1);
if (value == NULL)
return (NULL);
temp = ft_strreplace(out, value, i, y);
free(out);
if (temp == NULL)
{
ft_eprintf("minishell: malloc failed\n");
return (NULL);
}
out = temp;
}
if (out[i] != '\0')
i++;
}
return (out);
}

View File

@ -1,39 +1,116 @@
#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_executable_path(char *executable_name, t_list **env)
{ {
char *path;
char *temp;
char **tab;
size_t i;
path = NULL;
if (executable_name[0] == '.' || executable_name[0] == '/')
{
path = ft_strdup(executable_name);
if (path == NULL)
{
ft_eprintf("minishell: malloc failed\n");
return (NULL);
}
if (access(path, X_OK) == 0)
{
ft_eprintf("minishell: %s: permission denied\n", path);
return (NULL);
}
}
else
{
tab = ft_split(get_value_by_key("PATH", env), ':');
if (tab == NULL)
return (NULL);
i = 0;
while (tab[i] != NULL)
{
temp = ft_strmerger(3, tab[i], "/", executable_name);
if (temp == NULL)
{
ft_freer_tab_ultimate(1, tab);
free(executable_name);
ft_eprintf("minishell: malloc failed\n");
}
if (access(temp, X_OK) == 0)
{
path = temp;
break ;
}
free(temp);
i++;
}
if (path == NULL)
{
ft_eprintf("%s: command not found\n", executable_name);
}
ft_freer_tab_ultimate(1, tab);
}
return (path);
} }
char *ft_get_executable_path(t_data *data, char *executable) static int ft_excutor(t_cmd *cmd, t_list **env)
{ {
if (ft_strcmp(executable, "env"))
return (ft_strjoin("/usr/bin/bo", const char *s2))
}
int ft_excutor(t_cmd *cmd, )
{
char cmd[13] = "/usr/bin/ls";
char *args[3] = {NULL, "cat", NULL};
int pid; int pid;
int fd_in; int return_value;
int fd_out; char **tab;
if (ac != 3) if (cmd->fd_in == -1 || cmd->fd_out == -1)
return (1); return (1);
fd_out = open(av[2], O_WRONLY | O_CREAT | O_TRUNC);
fd_in = open(av[1], O_RDONLY);
pid = fork(); pid = fork();
if (pid == -1) if (pid == -1)
return (1); return (1);
if (pid == 0) if (pid == 0)
{ {
dup2(fd_out, 1); tab = env_to_strs(env);
dup2(fd_in, 0); if (tab == NULL)
execve(cmd, args, env); return (1);
tab = NULL;
dup2(cmd->fd_out, 1);
dup2(cmd->fd_in, 0);
execve(cmd->executable, cmd->args, tab);
} }
else else
waitpid(pid); waitpid(pid, &return_value, 0);
return (return_value);
}
int ft_cmds_executor(t_list **cmds, t_list **env)
{
t_cmd *content;
t_list *current;
int fds[2];
current = *cmds;
while (current != NULL)
{
content = current->content;
if (current->next != NULL)
{
if (pipe(fds) == -1)
{
ft_eprintf("minishell: pipe failed\n");
return (1);
}
content->fd_out = fds[1];
((t_cmd *) current->next->content)->fd_in = fds[0];
}
content->executable = ft_get_executable_path(content->executable, env);
if (content->executable != NULL)
ft_excutor(content, env);
if (content->fd_in != 0)
close(content->fd_in);
if (content->fd_out != 1 && content->fd_out != 2)
close(content->fd_out);
current = current->next;
}
return (0);
} }

67
file.c
View File

@ -1,4 +1,17 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* file.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/15 17:36:11 by cchauvet #+# #+# */
/* Updated: 2023/02/15 17:41:13 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h" #include "minishell.h"
#include <unistd.h>
int ft_file_is_readable(const char *path) int ft_file_is_readable(const char *path)
{ {
@ -9,58 +22,58 @@ int ft_file_is_readable(const char *path)
if (fd == -1) if (fd == -1)
{ {
ft_eprintf("minishell: %s: No such file or directory\n", path); ft_eprintf("minishell: %s: No such file or directory\n", path);
return (0); return (-1);
} }
readable = read(fd, "", 0); readable = read(fd, "", 0);
if (readable == -1) if (readable == -1)
{ {
ft_eprintf("minishell: %s: Permission denied\n", path); ft_eprintf("minishell: %s: Permission denied\n", path);
return (0); return (-1);
} }
close(fd); return (fd);
return (1);
} }
int ft_file_is_writeable(const char *path) int ft_file_is_writable(const char *path)
{ {
int writeable; int writeable;
int fd; int fd;
fd = open(path, O_WRONLY | O_CREAT, 0644); fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd == -1) if (fd == -1)
{ {
ft_eprintf("minishell: %s: Permission denied\n", path); ft_eprintf("minishell: %s: Permission denied\n", path);
return (0); return (-1);
} }
writeable = write(fd, "", 0); writeable = write(fd, "", 0);
if (writeable == -1) if (writeable == -1)
{ {
ft_eprintf("minishell: %s: Permission denied\n", path); ft_eprintf("minishell: %s: Permission denied\n", path);
return (0); return (-1);
} }
close(fd); return (fd);
return (1);
} }
char *ft_get_file_path(const char *infile) int ft_file_is_appendable(const char *path)
{ {
size_t i; int writeable;
size_t n; int fd;
n = 1; fd = open(path, O_WRONLY | O_CREAT | O_APPEND, 0644);
while (infile[-n] == infile[-1]) if (fd == -1)
n++;
i = 0;
while (infile[i] == ' ')
i++;
if (infile[i] == '\0' || infile[i] == '>' || infile[i] == '<')
{ {
ft_eprintf("minishell: syntax error near "); ft_eprintf("minishell: %s: Permission denied\n", path);
if ((infile[0] == '<' && n > 3) || (infile[0] == '>' && n > 2)) return (-1);
ft_eprintf("unexpected token `%c`\n", infile[i - 1]);
else
ft_eprintf("unexpected token `newline`\n");
return (NULL);
} }
return (ft_getstr(infile, i + 1)); writeable = write(fd, "", 0);
if (writeable == -1)
{
ft_eprintf("minishell: %s: Permission denied\n", path);
return (-1);
}
return (fd);
}
int ft_file_is_executable(const char *path)
{
return (access(path, X_OK) == 0);
} }

BIN
file.o

Binary file not shown.

Binary file not shown.

View File

@ -1,5 +1,17 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* heredoc.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/17 15:36:26 by cchauvet #+# #+# */
/* Updated: 2023/02/17 16:21:02 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "libftx/libftx.h"
#include "minishell.h" #include "minishell.h"
#include <readline/history.h>
int ft_heredoc(char *stop) int ft_heredoc(char *stop)
{ {
@ -15,8 +27,7 @@ int ft_heredoc(char *stop)
free(line); free(line);
break ; break ;
} }
ft_putstr_fd(line, fds[1]); ft_putendl_fd(line, fds[1]);
add_history(line);
free(line); free(line);
line = readline("> "); line = readline("> ");
} }

BIN
heredoc.o

Binary file not shown.

134
infile.c
View File

@ -1,76 +1,101 @@
#include "minishell.h" /* ************************************************************************** */
/* */
/* ::: :::::::: */
/* infile.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/15 17:52:10 by cchauvet #+# #+# */
/* Updated: 2023/02/17 13:19:09 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
static int ft_get_infile(char *line) #include "libftx/libftx.h"
#include "minishell.h"
#include "utils/utils.h"
static int ft_infile_is_valid(const char *line)
{
char **tab;
size_t i;
tab = ft_split_quoted(line, ' ');
if (tab == NULL)
{
ft_eprintf("minishell: malloc failed\n");
return (0);
}
if (tab[0] == NULL)
return (1);
i = 0;
while (tab[i + 1] != NULL)
i++;
if (tab[i][0] == '<')
{
ft_eprintf("minishell: %s: must be followed by an infile\n", tab[i]);
ft_freer_tab_ultimate(1, tab);
return (0);
}
ft_freer_tab_ultimate(1, tab);
return (1);
}
static int ft_get_infile(const char *line)
{ {
size_t i; size_t i;
int fd; int fd;
char *path; char **tab;
tab = ft_split_quoted(line, ' ');
if (tab == NULL)
{
ft_eprintf("minishell: malloc failed\n");
return (-2);
}
fd = 0; fd = 0;
i = 0; i = 0;
while (line[i] != '\0') while (tab[i + 1] != NULL)
{ {
if (line[i] == '<' && ft_is_in_quote(line, i) == 0) if (tab[i][0] == '<')
{
i++;
if (fd != 0) if (fd != 0)
close(fd); close(fd);
if (line[i] == '<') if (ft_strcmp("<", tab[i]) == 0)
{ fd = ft_file_is_readable(ft_quote_remover(tab[i + 1]));
i++; else if (ft_strcmp("<<", tab[i]) == 0)
path = ft_get_file_path(line + i); fd = ft_heredoc(tab[i + 1]);
if (path == NULL)
return (-1);
fd = ft_heredoc(path);
}
else
{
path = ft_get_file_path(line + i);
if (path == NULL)
return (-1);
if (ft_file_is_readable(path) == 0)
{
free(path);
return (-1);
}
fd = open(path, O_RDONLY);
}
free(path);
}
i++; i++;
} }
ft_freer_tab_ultimate(1, tab);
return (fd); return (fd);
} }
static int ft_remove_infile(char *line) static int ft_remove_infile(char *line)
{ {
size_t i; size_t i;
int separator; size_t y;
char **tab;
i = 0; tab = ft_split_quoted(line, ' ');
while (line[i] != '\0') if (tab == NULL)
{ {
if (line[i] == '<' && ft_is_in_quote(line, i) == 0) ft_eprintf("minishell: malloc failed\n");
return (1);
}
i = 0;
y = 0;
while (tab[i] != NULL)
{
if (tab[i][0] == '<')
{ {
while (line[i] == '<') ft_strshift(line + y, -1 * (ft_strlen(tab[i]) + 1));
line[i++] = ' '; i++;
while (line[i] == ' ') ft_strshift(line + y, -1 * (ft_strlen(tab[i]) + 1));
i++;
separator = ft_is_in_quote(line, i);
if (separator == 0)
separator = ' ';
else if (separator == 1)
separator = '\'';
else
separator = '\"';
while (line[i] != separator && line[i] != '\0')
line[i++] = ' ';
if (line[i] != '\0'
&& (separator == '\'' || separator == '\"'))
line[i++] = ' ';
} }
else
y = y + ft_strlen(tab[i]);
i++; i++;
} }
ft_freer_tab_ultimate(1, tab);
return (0); return (0);
} }
@ -78,12 +103,11 @@ int ft_infile(char *line)
{ {
int fd; int fd;
if (ft_infile_is_valid(line) == 0)
return (-2);
fd = ft_get_infile(line); fd = ft_get_infile(line);
if (ft_remove_infile(line)) if (fd == -2)
{ return (-2);
if (fd > 0) ft_remove_infile(line);
close(fd);
return (-1);
}
return (fd); return (fd);
} }

BIN
infile.o

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -6,13 +6,13 @@
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */ /* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/09/29 22:23:35 by cchauvet #+# #+# */ /* Created: 2022/09/29 22:23:35 by cchauvet #+# #+# */
/* Updated: 2023/01/05 18:54:54 by cchauvet ### ########.fr */ /* Updated: 2023/02/17 16:23:01 by cchauvet ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "libft.h" #include "libft.h"
void ft_putchar_fd(int fd, char c) void ft_putchar_fd(char c, int fd)
{ {
write(fd, &c, 1); write(fd, &c, 1);
} }

Binary file not shown.

View File

@ -6,7 +6,7 @@
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */ /* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/09/29 22:26:36 by cchauvet #+# #+# */ /* Created: 2022/09/29 22:26:36 by cchauvet #+# #+# */
/* Updated: 2022/09/29 22:43:19 by cchauvet ### ########.fr */ /* Updated: 2023/02/17 16:15:07 by cchauvet ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -6,7 +6,7 @@
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */ /* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/09/26 14:47:54 by cchauvet #+# #+# */ /* Created: 2022/09/26 14:47:54 by cchauvet #+# #+# */
/* Updated: 2023/01/06 19:34:13 by cchauvet ### ########.fr */ /* Updated: 2023/02/17 16:22:44 by cchauvet ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -47,7 +47,7 @@ char **ft_split(char const *s, char c);
char *ft_itoa(int n); char *ft_itoa(int n);
char *ft_strmapi(char const *s, char (*f)(unsigned int, char)); char *ft_strmapi(char const *s, char (*f)(unsigned int, char));
void ft_striteri(char *s, void (*f)(unsigned int, char*)); void ft_striteri(char *s, void (*f)(unsigned int, char*));
void ft_putchar_fd(int fd, char c); void ft_putchar_fd(char c, int fd);
void ft_putstr_fd(char *s, int fd); void ft_putstr_fd(char *s, int fd);
void ft_putendl_fd(char *s, int fd); void ft_putendl_fd(char *s, int fd);
void ft_putnbr_fd(int n, int fd); void ft_putnbr_fd(int n, int fd);

Binary file not shown.

View File

@ -6,7 +6,7 @@
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */ /* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/09/26 14:47:54 by cchauvet #+# #+# */ /* Created: 2022/09/26 14:47:54 by cchauvet #+# #+# */
/* Updated: 2023/02/03 12:42:13 by cchauvet ### ########.fr */ /* Updated: 2023/02/17 16:24:42 by cchauvet ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -69,10 +69,10 @@ char **ft_split(char const *s, char c);
char *ft_itoa(int n); char *ft_itoa(int n);
char *ft_strmapi(char const *s, char (*f)(unsigned int, char)); char *ft_strmapi(char const *s, char (*f)(unsigned int, char));
void ft_striteri(char *s, void (*f)(unsigned int, char*)); void ft_striteri(char *s, void (*f)(unsigned int, char*));
void ft_putchar_fd(int fd, char c); void ft_putchar_fd(char c, int fd);
void ft_putstr_fd(char *s, int fd); void ft_putstr_fd(char *s, int fd);
void ft_putendl_fd(int fd, char *s); void ft_putendl_fd(char *s, int fd);
void ft_putnbr_fd(int fd, int n); void ft_putnbr_fd(int n, int fd);
typedef struct s_list typedef struct s_list
{ {

Binary file not shown.

View File

@ -6,7 +6,7 @@
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */ /* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/10/23 18:08:31 by cchauvet #+# #+# */ /* Created: 2022/10/23 18:08:31 by cchauvet #+# #+# */
/* Updated: 2023/02/03 12:52:38 by cchauvet ### ########.fr */ /* Updated: 2023/02/17 16:29:56 by cchauvet ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -23,13 +23,13 @@ int ft_dprintarg(int fd, int arg, va_list args)
if (arg == 'u') if (arg == 'u')
return (ft_dprintul(fd, va_arg(args, unsigned int))); return (ft_dprintul(fd, va_arg(args, unsigned int)));
if (arg == 'c') if (arg == 'c')
return (ft_putchar_fd(fd, va_arg(args, int))); return (ft_putchar_fd_p(fd, va_arg(args, int)));
if (arg == 'S') if (arg == 'S')
return (ft_dprintstrtab(fd, va_arg(args, char **))); return (ft_dprintstrtab(fd, va_arg(args, char **)));
if (arg == 's') if (arg == 's')
return (ft_putstr_fd_p(fd, va_arg(args, char *))); return (ft_putstr_fd_p(fd, va_arg(args, char *)));
if (arg == '%') if (arg == '%')
return (ft_putchar_fd(fd, '%')); return (ft_putchar_fd_p(fd, '%'));
if (arg == 'p') if (arg == 'p')
return (ft_dprintptr(fd, va_arg(args, void *))); return (ft_dprintptr(fd, va_arg(args, void *)));
return (0); return (0);

Binary file not shown.

Binary file not shown.

View File

@ -6,7 +6,7 @@
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */ /* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/10/10 03:26:21 by cchauvet #+# #+# */ /* Created: 2022/10/10 03:26:21 by cchauvet #+# #+# */
/* Updated: 2022/10/21 15:54:31 by cchauvet ### ########.fr */ /* Updated: 2023/02/17 16:30:25 by cchauvet ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -23,7 +23,7 @@ int ft_dprintl_base(int fd, long long int n, char *base)
if (n < 0) if (n < 0)
{ {
nb = -n; nb = -n;
i += ft_putchar_fd(fd, '-'); i += ft_putchar_fd_p(fd, '-');
} }
else else
nb = n; nb = n;

Binary file not shown.

Binary file not shown.

View File

@ -6,7 +6,7 @@
/* By: cchauvet <cchauvet@student.42angouleme.fr +#+ +:+ +#+ */ /* By: cchauvet <cchauvet@student.42angouleme.fr +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/01/05 17:26:55 by cchauvet #+# #+# */ /* Created: 2023/01/05 17:26:55 by cchauvet #+# #+# */
/* Updated: 2023/02/03 12:54:44 by cchauvet ### ########.fr */ /* Updated: 2023/02/17 16:30:44 by cchauvet ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -22,7 +22,7 @@ int ft_dprintstrtab(int fd, char **tab)
while (tab[index] != NULL) while (tab[index] != NULL)
{ {
i += ft_putstr_fd_p(fd, tab[index]) + 1; i += ft_putstr_fd_p(fd, tab[index]) + 1;
ft_putchar_fd(fd, '\n'); ft_putchar_fd_p(fd, '\n');
index++; index++;
} }
return (i); return (i);

Binary file not shown.

Binary file not shown.

View File

@ -6,7 +6,7 @@
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */ /* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/09/29 13:49:45 by cchauvet #+# #+# */ /* Created: 2022/09/29 13:49:45 by cchauvet #+# #+# */
/* Updated: 2022/10/23 14:23:44 by cchauvet ### ########.fr */ /* Updated: 2023/02/17 16:31:15 by cchauvet ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -73,9 +73,9 @@ int ft_dprintul_base(int fd, unsigned long long n, char *base)
if (n > base_size - 1) if (n > base_size - 1)
{ {
ft_dprintul_base(fd, n / base_size, base); ft_dprintul_base(fd, n / base_size, base);
ft_putchar_fd(fd, base[n % base_size]); ft_putchar_fd_p(fd, base[n % base_size]);
} }
else else
ft_putchar_fd(fd, base[n]); ft_putchar_fd_p(fd, base[n]);
return (str_size - 1); return (str_size - 1);
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More