int ft_env_manage(t_env *env, char **var) { char **arg; if (var[1] == NULL) { ft_display_lst(env, 0); return (0); } else { if (var[1][0] == '-' && var[1][1] == 'i') { arg = ft_strsplit(var[2], '='); ft_setenv_ignore(env, arg); } else { arg = ft_strsplit(var[1], '='); ft_setenv_local(env, arg); } ft_free_arg(arg); } return (0); }
static char *ft_access(char *str, char *path) { char **arg; int i; char *exec; if (ft_goodpath(str)) return ((access(str, F_OK | X_OK) == -1) ? NULL : str); arg = ft_str_to_wordtab(path, ':', ':'); i = -1; while (arg[++i] != NULL) { exec = ft_pathfile(arg[i], str); if (access(exec, F_OK | X_OK) != -1) { ft_free_arg(arg); return (exec); } free(exec); } return (NULL); }
int ft_exec(t_env *env, char **exec_opt, char *path) { pid_t pid; int statut; char **env_local; char *exec; env_local = ft_conv_lst(env); pid = fork(); if (pid == -1) return (ft_error("Impossible de chercher le fils dans fork\n", "fork")); else if (pid == 0) { if ((exec = ft_access(exec_opt[0], path)) == NULL || execve(exec, exec_opt, env_local) == -1) ft_notfound(exec); } else wait(&statut); ft_free_arg(env_local); return (0); }
static void lauch_execute_backquote(t_cmd *cmd, t_env *env, char *newcmd) { t_list *arg; t_env c_env; t_cmd c_cmd; t_dir c_dir; arg = NULL; init_copy_env(&c_env, &c_cmd, &c_dir); c_cmd.raw = ft_strdup(newcmd); c_cmd.split = NULL; c_env.var = env_lst_copy(env); c_env.nb = env->nb; c_cmd.paths = ft_tab_dup(cmd->paths); c_cmd.env = env_list_to_array(c_env.var, c_env.nb); arg = ft_parser(c_cmd.raw); ft_open_close(); ft_launcher(&arg, &c_cmd, &c_env, &c_dir); if (arg) ft_free_arg(&arg); ft_free_c_env(&c_env, &c_cmd, &c_dir); ft_open_close(); }