From 92dc04d96e1359ba7fddf100e8e62d17b078933b Mon Sep 17 00:00:00 2001 From: guamss Date: Thu, 29 Jun 2023 14:25:17 +0200 Subject: [PATCH] =?UTF-8?q?(feat/fix)=20:=20ajout=20de=20|=20et=20changeme?= =?UTF-8?q?nt=20des=20variable=20env=20OLDPWD=20et=20PWD=20quand=20un=20cd?= =?UTF-8?q?=20est=20effectu=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/exec/exec.c | 100 +++++++++++++++++++++++++++++------------------- src/exec/exec.h | 5 ++- 2 files changed, 63 insertions(+), 42 deletions(-) diff --git a/src/exec/exec.c b/src/exec/exec.c index 5d922e8..dadd00a 100644 --- a/src/exec/exec.c +++ b/src/exec/exec.c @@ -5,69 +5,89 @@ #include #include "../cmd/cmd.h" #include +#include "../env/env.h" - -int execute(cmd** input, char** env) +int execute(cmd* input, char** env) { int exitcode; - for(int i=0; input[i]!=NULL; i++) + const int pid = fork(); + if (pid == 0) { - // création d'un processus enfant du programme - const int pid = fork(); - // pid de l'enfant est 0 - if (pid == 0) - { - // redirige la sortie standard vers un file descriptor - dup2(1, input[i]->fd_out); - // on tue l'enfant (l'enfant devient la commande entrée par l'utilisateur) - exitcode = execve(input[i]->executable, input[i]->args, env); - } - else - { - waitpid(pid, &exitcode, 0); - } + dup2(input->fd_out, 1); + dup2(input->fd_in, 0); + exitcode = execve(input->executable, input->args, env); + } + else + { + waitpid(pid, &exitcode, 0); } return exitcode; } -int len(char** list) +int len(void** list) { int index; for (index = 0; list[index]!=NULL; index++); return index; } -int change_directory(char** args) +int piper(cmd** cmds, char** env) { - if(len(args)!=2) + int fds[2]; + for (int i=0; cmds[i] != NULL; i++) { - dprintf(2, "Mauvais arguments\n"); - return 1; - } - if(chdir(args[1])!=0) - { - dprintf(2, "Mauvais chemin : %s\n", args[1]); - return 1; - } - char cwd[PATH_MAX]; - if (getcwd(cwd, sizeof(cwd)) != NULL) - { - printf("cd %s \nCurrent working dir: %s\n", args[1], cwd); + if (pipe(fds) < 0) + return 1; + if (i < len((void**)cmds)-1) + { + cmds[i]->fd_out = fds[1]; + cmds[i+1]->fd_in = fds[0]; + } + execute(cmds[i], env); + } return 0; } -int builtin_execute(cmd** input, char** env) +int change_directory(char** args, lst** env) +{ + char cwd[PATH_MAX]; + char* oldpwd = get_env_variable(env, "PWD"); + if(len((void**)args)==1) + { + char* path = get_env_variable(env, "HOME"); + chdir(path); + edit_env_variable(env, "OLDPWD", oldpwd); + if (getcwd(cwd, sizeof(cwd)) != NULL) + { + edit_env_variable(env, "PWD", cwd); + } + return 0; + } + if (chdir(args[1]) == 0) + { + edit_env_variable(env, "OLDPWD", oldpwd); + if (getcwd(cwd, sizeof(cwd)) != NULL) + { + edit_env_variable(env, "PWD", cwd); + } + return 0; + } + else + { + dprintf(2, "Mauvais chemin : %s\n", args[1]); + return 1; + } + + return 0; +} + +int builtin_execute(cmd* input, lst** env) { int exitcode; - (void) env; - for(int i=0; input[i]!=NULL; i++) + if (strcmp(input->executable, "cd") == 0) { - if (strcmp(input[i]->executable, "cd") == 0) - { - exitcode = change_directory(input[i]->args); - - } + exitcode = change_directory(input->args, env); } return exitcode; } diff --git a/src/exec/exec.h b/src/exec/exec.h index 7996261..03d2228 100644 --- a/src/exec/exec.h +++ b/src/exec/exec.h @@ -1,4 +1,5 @@ #pragma once -int execute(cmd** input, char** env); -int builtin_execute(cmd** input, char** env); +int execute(cmd* input, char** env); +int builtin_execute(cmd* input, lst** env); +int piper(cmd** cmds, char** env);