/* 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[])
if (!cmd_path)
return (NULL);
if (access(cmd_path, X_OK) != -1)
- return (cur_path);
+ return (cmd_path);
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 (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
{
/* 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 */
/* */
/* ************************************************************************** */
// 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++]);
/* 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);
}