]> git.dkaiser.de - 42/pipex.git/commitdiff
Restore progress
authorDominik Kaiser <dkaiser@1-C-7.42heilbronn.de>
Tue, 7 May 2024 14:05:24 +0000 (16:05 +0200)
committerDominik Kaiser <dkaiser@1-C-7.42heilbronn.de>
Tue, 7 May 2024 14:05:24 +0000 (16:05 +0200)
I deleted almost my entire progress of today, but now everything should
be restored.

src/env_utils.c
src/input_handling.c
src/main.c

index 4e02032346756905974c966f5301d3445b9d9369..5195c2fae55c27d0615915cb7df0f688aede4067 100644 (file)
@@ -6,10 +6,11 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/05/02 16:19:31 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/05/07 15:16:32 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/05/07 16:02:38 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
+#include "libft.h"
 #include "pipex.h"
 
 char   **get_split_path(char *envp[])
@@ -51,7 +52,7 @@ char  *find_in_path(char *cmd, char **path)
                if (!cmd_path)
                        return (NULL);
                if (access(cmd_path, X_OK) != -1)
-                       return (cur_path);
+                       return (cmd_path);
                path++;
        }
        return (NULL);
@@ -60,20 +61,29 @@ char        *find_in_path(char *cmd, char **path)
 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 (strchr(cmd, '/'))
+       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 (strchr(cmd, ' '))
+       else if (ft_strchr(cmd, ' '))
        {
-               //AAAAAAAAAAA
-               return (NULL);
+               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
        {
index ef4cec80fe99e8e6e3a1a84f7365d7f9b6a9923d..2fbe564a682615715181169d8197411220920ec4 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 15:26:08 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/05/07 16:04:22 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -31,11 +31,12 @@ static char **get_cmds(int argc, char *argv[], char *envp[])
        // TODO: Free on fail
        pwd = get_pwd(envp);
        i = 2;
-       while (i < argc - 1)
+       while (i < argc)
        {
                cmds[i - 2] = get_cmd_path(argv[i], path, pwd);
                i++;
        }
+    cmds[i - 2] = 0;
        i = 0;
        while (path[i])
                free(path[i++]);
index 30c31393fa6b8e499012005868e3cfa960000d52..f33d97a656fdd00b9fb70fcb043bcdad66bcd1de 100644 (file)
@@ -6,19 +6,71 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/04/29 13:35:21 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/05/02 14:38:11 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/05/07 16:04:43 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
 #include "pipex.h"
+#include <stdlib.h>
+#include <sys/_types/_pid_t.h>
+#include <unistd.h>
+#include <stdio.h>
+
+int pipex(t_pxdata *data, char *envp[])
+{
+       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], ' '); // TODO: Free on fail
+               status = execve(cmd[0], cmd, envp);
+               free(cmd);
+               exit(status);
+       }
+       else
+       {
+               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);
+       }
+       close(data->in_fd);
+       close(data->out_fd);
+       return (EXIT_SUCCESS);
+}
 
 int main(int argc, char *argv[], char *envp[]) {
-       if (!argc || !argv || !envp)
+       t_pxdata *data;
+
+       if (argc != 5)
                return (1);
 
-       // Read content of file1 (argv[1])
-       // Execute cmd1 (argv[2]) with file1 on stdin
-       // pipe the output of cmd1 into cmd2
-       // Execute cmd2 (argv[3]) with the piped input on stdin
-       // Write output of cmd2 into file2 (argv[4])
+       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);
 }