]> git.dkaiser.de - 42/minishell.git/commitdiff
Create files
authorDominik Kaiser <dkaiser@3-C-10.42heilbronn.de>
Thu, 16 Jan 2025 18:16:44 +0000 (19:16 +0100)
committerDominik Kaiser <dkaiser@3-C-10.42heilbronn.de>
Thu, 16 Jan 2025 18:16:44 +0000 (19:16 +0100)
Makefile
include/ast.h
include/minishell.h
src/collect_redirs.c
src/create_files.c [new file with mode: 0644]
src/execute_cmd.c
src/interpreter.c
src/new_node.c
src/parse_cmd.c
src/tokenizer.c

index 650f5e4e7b676ffb319272cb5022a0158e239ae4..243e9fc494ca243ed77fa30357ce6e77222f074a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -20,7 +20,7 @@ SRC     := main.c debug_tools.c init.c signal_handling.c repl.c new_token.c \
            parse_cmd.c collect_redirs.c print_ast.c interpreter.c env.c \
            get_cmd_path.c env_to_strlst.c execute_cmd.c format_string.c \
                   builtins_part_one.c builtins_part_two.c env_tools.c error.c \
-                  read_heredoc.c
+                  read_heredoc.c create_files.c
 
 OBJ_DIR := _obj
 OBJ     := $(addprefix $(OBJ_DIR)/, $(SRC:%.c=%.o))
index cd2f9c9eff893a1c1506a503043e20d0071af83c..033547304d31c80194db6269ad43dbbb38014415 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/06/27 11:48:27 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/08/11 12:20:56 by dkaiser          ###   ########.fr       */
+/*   Updated: 2025/01/16 18:26:30 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -44,6 +44,7 @@ typedef struct s_cmd
 {
        char                                    **args;
        struct s_redirection    redirs[2];
+       t_list                                  *create_files;
 }                                                      t_cmd;
 
 union                                          u_node_content
@@ -61,7 +62,8 @@ typedef struct s_node
 
 t_node                                         *new_node(int type);
 t_node                                         *new_pipe_node(t_node *left, t_node *right);
-t_node                                         *new_cmd_node(char **args, t_redirection redirs[2]);
+t_node                                         *new_cmd_node(char **args, t_redirection redirs[2],
+                                                               t_list *create_files);
 t_node                                         *new_string_node(char *string);
 
 void                                           free_node(t_node *node);
index 3b97f6a9c2fcef42f99853ba06066bc7acdb4d39..ee42c79a9be1adf85b76f3a6371b9ee80ecc465e 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: chuhlig <chuhlig@student.42.fr>            +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/06/22 17:14:49 by dkaiser           #+#    #+#             */
-/*   Updated: 2025/01/15 18:24:09 by dkaiser          ###   ########.fr       */
+/*   Updated: 2025/01/16 18:38:44 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -35,7 +35,7 @@ void                  repl(const char *prompt, t_env **env, int *promptflag);
 
 t_list                 *parse(t_token *tokens, t_env **env);
 t_node                 *parse_cmd(t_token *tokens, t_env **env);
-t_redirection  *collect_redirs(t_token **tokens, t_env *env);
+t_redirection  *collect_redirs(t_token **tokens, t_env *env, t_list **cf);
 
 void                   print_ast(t_node *ast);
 int                            eval(t_node *node, t_env **env);
@@ -47,4 +47,5 @@ int                           handle_redirections(t_redirection *redirs);
 void                   *error(int err_code, char *err_text, int exit_code,
                                        int *ret_code);
 char                   *read_heredoc(char *delimiter);
+void create_files(t_list *files);
 #endif
index 4decda73c75727113081c7e4200cc41c30c564e5..171dc067b053e2cbda5bfc4f062985738b730b4b 100644 (file)
@@ -6,20 +6,21 @@
 /*   By: chuhlig <chuhlig@student.42.fr>            +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/08/02 13:49:31 by dkaiser           #+#    #+#             */
-/*   Updated: 2025/01/15 18:54:42 by dkaiser          ###   ########.fr       */
+/*   Updated: 2025/01/16 18:19:36 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
 #include "minishell.h"
+#include <stdlib.h>
 
-static void            collect_and_check_redir(t_redirection *result, t_token **cur,
-                                       t_env *env);
-static void            set_redir(t_redirection *redir, int type, char *spec,
-                                       t_env *env);
-static int             set_heredoc_data(t_token *cur, t_redirection *result,
-                                       t_env *env);
+static void                            collect_and_check_redir(t_redirection *result,
+                                                       t_token **cur, t_env *env, t_list **create_files);
+static t_redirection   *set_redir(t_redirection *redir, int type, char *spec,
+                                                       t_env *env);
+static int                             set_heredoc_data(t_token *cur, t_redirection *result,
+                                                       t_env *env);
 
-t_redirection  *collect_redirs(t_token **tokens, t_env *env)
+t_redirection  *collect_redirs(t_token **tokens, t_env *env, t_list **create_files)
 {
        t_redirection   *result;
        t_token                 *cur;
@@ -33,7 +34,7 @@ t_redirection *collect_redirs(t_token **tokens, t_env *env)
        while (cur != NULL && cur->next != NULL)
        {
                if (cur->type == REDIR_TOKEN && cur->next->type == STRING_TOKEN)
-                       collect_and_check_redir(result, &cur, env);
+                       collect_and_check_redir(result, &cur, env, create_files);
                else if (cur->type == REDIR_TOKEN)
                        return (free(result), NULL);
                else
@@ -44,17 +45,30 @@ t_redirection       *collect_redirs(t_token **tokens, t_env *env)
        return (result);
 }
 
-static void    set_redir(t_redirection *redir, int type, char *spec, t_env *env)
+static t_redirection   *set_redir(t_redirection *redir, int type, char *spec,
+               t_env *env)
 {
+       t_redirection   *result;
+
        redir->type = type;
        if (spec != NULL)
                redir->specifier = format_string(spec, env);
        else
                redir->specifier = spec;
+       if (redir->type == OUTPUT_APPEND || redir->type == OUTPUT_OVERRIDE)
+       {
+               result = malloc(sizeof(t_redirection));
+               if (!result)
+                       return (NULL);
+               result->type = type;
+               result->specifier = spec;
+               return (result);
+       }
+       return (NULL);
 }
 
 static void    collect_and_check_redir(t_redirection *result, t_token **cur,
-               t_env *env)
+               t_env *env, t_list **create_files)
 {
        t_token *next_token;
        char    *str;
@@ -69,9 +83,11 @@ static void  collect_and_check_redir(t_redirection *result, t_token **cur,
        else if ((*cur)->content.redir_type == INPUT_FILE)
                set_redir(&result[0], INPUT_FILE, str, env);
        else if ((*cur)->content.redir_type == OUTPUT_OVERRIDE)
-               set_redir(&result[1], OUTPUT_OVERRIDE, str, env);
+               ft_lstadd_back(create_files, ft_lstnew(set_redir(&result[1],
+                                       OUTPUT_OVERRIDE, str, env)));
        else if ((*cur)->content.redir_type == OUTPUT_APPEND)
-               set_redir(&result[1], OUTPUT_APPEND, str, env);
+               ft_lstadd_back(create_files, ft_lstnew(set_redir(&result[1],
+                                       OUTPUT_APPEND, str, env)));
        next_token = (*cur)->next;
        free_token_and_connect(*cur);
        if (next_token)
diff --git a/src/create_files.c b/src/create_files.c
new file mode 100644 (file)
index 0000000..faee27f
--- /dev/null
@@ -0,0 +1,45 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   create_files.c                                     :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   Created: 2025/01/16 16:23:51 by dkaiser           #+#    #+#             */
+/*   Updated: 2025/01/16 19:16:33 by dkaiser          ###   ########.fr       */
+/*                                                                            */
+/* ************************************************************************** */
+
+#include "minishell.h"
+#include <unistd.h>
+
+void   create_files(t_list *files)
+{
+       t_redirection   *file;
+       int                             fd;
+
+       while (files)
+       {
+        dbg("Test");
+        if (files->content == NULL)
+            continue;
+               file = (t_redirection *)files->content;
+        if (access(file->specifier, F_OK) != -1 && access(file->specifier, W_OK) == -1)
+            break;
+               if (file->type == OUTPUT_OVERRIDE)
+               {
+                       fd = open(file->specifier, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+                       close(fd);
+               }
+               else if (file->type == OUTPUT_APPEND)
+               {
+                       fd = open(file->specifier, O_WRONLY | O_CREAT | O_APPEND, 0644);
+                       close(fd);
+               }
+        /* if (files->next == NULL) */
+        /*     break; */
+        /* if (((t_redirection *) files->next->content)->type == 0) */
+        /*     break; */
+               files = files->next;
+       }
+}
index 83addd2bbfbeffbb860452200ed8b3fe26297dbb..8f5b541c30ba82e2f3bc0f556f51825b709c8fa7 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: chuhlig <chuhlig@student.42.fr>            +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/12/17 19:21:35 by chuhlig           #+#    #+#             */
-/*   Updated: 2025/01/15 15:52:08 by dkaiser          ###   ########.fr       */
+/*   Updated: 2025/01/16 18:38:00 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -51,6 +51,7 @@ int   execute_cmd(t_cmd *cmd, t_env **env)
 
        original_std[1] = dup(STDOUT_FILENO);
        original_std[0] = dup(STDIN_FILENO);
+       create_files(cmd->create_files);
        if (handle_redirections(cmd->redirs) == -1)
        {
                establish_pipeline(original_std[0], original_std[1]);
index 0a6d7815d9e7a7ac5cd62b66b0de9da1aacbed3a..c7fe67c9e21afcb37bf212687e393b9d1151288a 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: chuhlig <chuhlig@student.42.fr>            +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/12/17 19:15:49 by chuhlig           #+#    #+#             */
-/*   Updated: 2025/01/15 18:10:25 by dkaiser          ###   ########.fr       */
+/*   Updated: 2025/01/16 18:44:39 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -30,7 +30,7 @@ int   handle_redirections(t_redirection *redirs)
        }
        else if (redirs[0].type == INPUT_LIMITER)
        {
-               fd = open("/tmp/heredoc_tmp", O_WRONLY | O_CREAT | O_TRUNC, 0644);
+               fd = open("/tmp/heredoc_tmp", O_WRONLY  | O_TRUNC, 0644);
                if (fd < 0)
                {
                        perror("open");
@@ -49,7 +49,7 @@ int   handle_redirections(t_redirection *redirs)
        }
        if (redirs[1].type == OUTPUT_OVERRIDE)
        {
-               fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+               fd = open(redirs[1].specifier, O_WRONLY | O_TRUNC, 0644);
                if (fd < 0)
                {
                        perror("open");
@@ -60,7 +60,7 @@ int   handle_redirections(t_redirection *redirs)
        }
        else if (redirs[1].type == OUTPUT_APPEND)
        {
-               fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_APPEND, 0644);
+               fd = open(redirs[1].specifier, O_WRONLY | O_APPEND, 0644);
                if (fd < 0)
                {
                        perror("open");
index c58d2915546f3e60e4275e368848b4d9c44829d8..83d9159174e99171a2caee982d2df5e5aa6e1181 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/06/27 11:21:03 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/09/17 18:46:35 by dkaiser          ###   ########.fr       */
+/*   Updated: 2025/01/16 18:25:54 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -37,7 +37,7 @@ t_node        *new_pipe_node(t_node *left, t_node *right)
        return (node);
 }
 
-t_node *new_cmd_node(char **args, t_redirection redirs[2])
+t_node *new_cmd_node(char **args, t_redirection redirs[2], t_list *create_files)
 {
        t_node  *node;
 
@@ -49,6 +49,7 @@ t_node        *new_cmd_node(char **args, t_redirection redirs[2])
        {
                node->content.cmd.redirs[0] = redirs[0];
                node->content.cmd.redirs[1] = redirs[1];
+               node->content.cmd.create_files = create_files;
                free(redirs);
                return (node);
        }
index 9ca741bd384d3edeef614228876cd70d69b0ff3d..92dfd1241e6760c020ca434dba5f104c8165a864 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: chuhlig <chuhlig@student.42.fr>            +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/07/08 15:06:25 by dkaiser           #+#    #+#             */
-/*   Updated: 2025/01/15 17:22:58 by dkaiser          ###   ########.fr       */
+/*   Updated: 2025/01/16 19:06:03 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -18,8 +18,10 @@ t_node       *parse_cmd(t_token *tokens, t_env **env)
 {
        char                    **args;
        t_redirection   *redirs;
+       t_list *create_files;
 
-       redirs = collect_redirs(&tokens, *env);
+       create_files = NULL;
+       redirs = collect_redirs(&tokens, *env, &create_files);
        if (redirs == NULL)
                return (NULL);
        args = collect_args(&tokens, env);
@@ -28,7 +30,7 @@ t_node        *parse_cmd(t_token *tokens, t_env **env)
                free(redirs);
                return (NULL);
        }
-       return (new_cmd_node(args, redirs));
+       return (new_cmd_node(args, redirs, create_files));
 }
 
 static char    **collect_args(t_token **tokens, t_env **env)
index 6d16f1db1c8bdc83f23a8df8cac8a9addc1cd999..eb5d8fe320c4e295bccbc48238c42eb7a2694b2c 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: chuhlig <chuhlig@student.42.fr>            +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/06/28 20:55:50 by chuhlig           #+#    #+#             */
-/*   Updated: 2025/01/14 15:58:41 by chuhlig          ###   ########.fr       */
+/*   Updated: 2025/01/16 18:57:38 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -101,6 +101,7 @@ void        handle_special_chars(char *s, int *i, int *start, t_token **token_list)
                (*i)++;
        if (s[*i] == '>' && s[*i + 1] == '>')
                (*i)++;
+       print_token(*token_list);
        *start = *i + 1;
 }