]> git.dkaiser.de - 42/pipex.git/commitdiff
Add freeing and make norminette happy
authorDominik Kaiser <dkaiser@1-C-7.42heilbronn.de>
Wed, 8 May 2024 10:03:16 +0000 (12:03 +0200)
committerDominik Kaiser <dkaiser@1-C-7.42heilbronn.de>
Wed, 8 May 2024 10:03:16 +0000 (12:03 +0200)
Makefile
src/env_utils.c
src/get_cmd_path.c [new file with mode: 0644]
src/input_handling.c
src/main.c

index 69c304efbe4e079446069031d364688129e58d04..8277ef4daa5bdba216f87e0b45ac49c33e3723b3 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,7 @@ HEADERS =       -Iinclude -Ilibft
 LIBS   =       -Llibft -lft
 
 VPATH  :=      src
-SRC            =       main.c env_utils.c input_handling.c
+SRC            =       main.c env_utils.c get_cmd_path.c input_handling.c
 
 OBJ_DIR        :=      obj
 OBJ            :=      $(addprefix $(OBJ_DIR)/, $(SRC:%.c=%.o))
index 065ffb37a1f81c64702c5aa9c51ae20a6b3ad447..4b507a29774b785fb4d05640661b7cf48ade306e 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/05/02 16:19:31 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/05/07 16:36:32 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/05/08 11:40:01 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -57,37 +57,3 @@ char *find_in_path(char *cmd, char **path)
        }
        return (NULL);
 }
-
-char   *get_cmd_path(char *cmd, char **path, char *pwd)
-{
-       char    *cur_dir;
-       char    *lone_cmd;
-       int             len;
-       char    *res;
-
-       if (cmd[0] == '/')
-               return (cmd);
-                               // TODO: Maybe use duplicate instead,   so there will be no problem on free()
-       else if (ft_strchr(cmd, '/'))
-       {
-               cur_dir = ft_strjoin(pwd, "/");
-               // TODO: Free on fail
-               // TODO: Maybe check if executable, else there might be a problem...
-               return (ft_strjoin(cur_dir, cmd));
-       }
-       else if (ft_strchr(cmd, ' '))
-       {
-               len = ft_strchr(cmd, ' ') - cmd + 1;
-               lone_cmd = malloc(len * sizeof(char));
-               // TODO: Free on fail
-               ft_strlcpy(lone_cmd, cmd, len);
-               res = find_in_path(lone_cmd, path);
-               if (!res)
-                       return (NULL);
-               return (ft_strjoin(res, ft_strchr(cmd, ' ')));
-       }
-       else
-       {
-               return (find_in_path(cmd, path));
-       }
-}
diff --git a/src/get_cmd_path.c b/src/get_cmd_path.c
new file mode 100644 (file)
index 0000000..749be18
--- /dev/null
@@ -0,0 +1,72 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   get_cmd_path.c                                     :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   Created: 2024/05/08 11:35:47 by dkaiser           #+#    #+#             */
+/*   Updated: 2024/05/08 11:39:44 by dkaiser          ###   ########.fr       */
+/*                                                                            */
+/* ************************************************************************** */
+
+#include "pipex.h"
+
+static char    *get_absolute_cmd_path(char *cmd, char *pwd)
+{
+       char    *cur_dir;
+       char    *result;
+
+       cur_dir = ft_strjoin(pwd, "/");
+       if (!cur_dir)
+               return (NULL);
+       result = ft_strjoin(cur_dir, cmd);
+       free(cur_dir);
+       if (!result)
+               return (NULL);
+       if (access(result, X_OK) == -1)
+       {
+               free(result);
+               return (NULL);
+       }
+       return (result);
+}
+
+static char    *get_cmd_path_with_args(char *cmd, char **path)
+{
+       int             len;
+       char    *lone_cmd;
+       char    *cmd_path;
+       char    *result;
+
+       len = ft_strchr(cmd, ' ') - cmd + 1;
+       lone_cmd = malloc(len * sizeof(char));
+       if (!lone_cmd)
+               return (NULL);
+       ft_strlcpy(lone_cmd, cmd, len);
+       cmd_path = find_in_path(lone_cmd, path);
+       free(lone_cmd);
+       if (!cmd_path)
+               return (NULL);
+       result = ft_strjoin(cmd_path, ft_strchr(cmd, ' '));
+       free(cmd_path);
+       return (result);
+}
+
+char   *get_cmd_path(char *cmd, char **path, char *pwd)
+{
+       if (cmd[0] == '/')
+               return (ft_strdup(cmd));
+       else if (ft_strchr(cmd, '/'))
+       {
+               return (get_absolute_cmd_path(cmd, pwd));
+       }
+       else if (ft_strchr(cmd, ' '))
+       {
+               return (get_cmd_path_with_args(cmd, path));
+       }
+       else
+       {
+               return (find_in_path(cmd, path));
+       }
+}
index aef1ec9cee521cf9b180dab1834bfe97b5f56ae5..62095b991e907ebfc782d1fdd9b7dc767b09c6c3 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/05/02 12:13:23 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/05/07 16:36:36 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/05/08 11:54:37 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -28,7 +28,8 @@ static char   **get_cmds(int argc, char *argv[], char *envp[])
        if (!cmds)
                return (NULL);
        path = get_split_path(envp);
-       // TODO: Free on fail
+       if (!path)
+               return (NULL);
        pwd = get_pwd(envp);
        i = 2;
        while (i < argc)
@@ -37,10 +38,7 @@ static char  **get_cmds(int argc, char *argv[], char *envp[])
                i++;
        }
        cmds[i - 2] = 0;
-       i = 0;
-       while (path[i])
-               free(path[i++]);
-       free(path);
+       ft_free_split(path);
        return (cmds);
 }
 
@@ -50,7 +48,7 @@ t_pxdata      *get_pxdata(int argc, char *argv[], char *envp[])
 
        result = malloc(sizeof(t_pxdata));
        if (!result)
-               return (NULL); // TODO: Check if an error message needs to be sent
+               return (NULL);
        result->in_fd = open(argv[1], O_RDONLY);
        result->out_fd = open(argv[--argc], O_WRONLY | O_CREAT | O_TRUNC,
                        S_IREAD | S_IWUSR);
index 0a0dd6148ea7f1ceec9d8bac62dc65b4b64a4450..68dbac59712df0403c45dddde7c698518efae2bf 100644 (file)
@@ -6,54 +6,76 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/04/29 13:35:21 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/05/07 16:36:39 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/05/08 11:53:26 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
+#include "libft.h"
 #include "pipex.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/_types/_pid_t.h>
 #include <unistd.h>
 
-int    pipex(t_pxdata *data, char *envp[])
+static void    pipex_child(t_pxdata *data, char *envp[], int p[2])
 {
-       int             p[2];
-       pid_t   pid;
        char    **cmd;
        int             status;
 
-       pipe(p);
-       pid = fork();
-       if (pid < 0)
-               return (EXIT_FAILURE);
-       if (pid == 0)
+       close(p[0]);
+       dup2(data->in_fd, 0);
+       dup2(p[1], 1);
+       if (!data->cmds[0])
+               exit(127);
+       cmd = ft_split(data->cmds[0], ' ');
+       if (cmd)
        {
-               close(p[0]);
-               dup2(data->in_fd, 0);
-               dup2(p[1], 1);
-               if (!data->cmds[0])
-                       exit(127);
-               cmd = ft_split(data->cmds[0], ' '); // TODO: Free on fail
                status = execve(cmd[0], cmd, envp);
-               free(cmd);
+               ft_free_split(cmd);
                exit(status);
        }
-       else
+}
+
+static int     pipex_parent(t_pxdata *data, char *envp[], int p[2])
+{
+       char    **cmd;
+
+       close(p[1]);
+       dup2(p[0], 0);
+       dup2(data->out_fd, 1);
+       if (!data->cmds[1])
+               return (EXIT_FAILURE);
+       cmd = ft_split(data->cmds[1], ' ');
+       if (cmd)
        {
-               close(p[1]);
-               dup2(p[0], 0);
-               dup2(data->out_fd, 1);
-               if (!data->cmds[1])
-                       return (EXIT_FAILURE);
-               cmd = ft_split(data->cmds[1], ' '); // TODO: Free on fail
                if (execve(cmd[0], cmd, envp))
                        return (EXIT_FAILURE);
-               free(cmd);
+               ft_free_split(cmd);
+               return (EXIT_SUCCESS);
        }
+       return (EXIT_FAILURE);
+}
+
+static int     pipex(t_pxdata *data, char *envp[])
+{
+       int             result;
+       int             p[2];
+       pid_t   pid;
+
+       pipe(p);
+       result = EXIT_SUCCESS;
+       pid = fork();
+       if (pid < 0)
+               return (EXIT_FAILURE);
+       if (pid == 0)
+               pipex_child(data, envp, p);
+       else
+               result = pipex_parent(data, envp, p);
        close(data->in_fd);
        close(data->out_fd);
-       return (EXIT_SUCCESS);
+       ft_free_split(data->cmds);
+       free(data);
+       return (result);
 }
 
 int    main(int argc, char *argv[], char *envp[])
@@ -63,14 +85,5 @@ int  main(int argc, char *argv[], char *envp[])
        if (argc != 5)
                return (1);
        data = get_pxdata(argc, argv, envp);
-       /* if (data->in_fd < 0 || data->out_fd < 0) */
-       /*      return (1); */
-       /* ft_printf("IN: %d\nOUT: %d\n", data->in_fd, data->out_fd); */
-       /* int i = 0; */
-       /* while (data->cmds[i]) */
-       /* { */
-       /*      ft_printf("CMD [%d]: %s\n", i, data->cmds[i]); */
-       /*      i++; */
-       /* } */
        return (pipex(data, envp));
 }