int ft_cmd_handler(t_node *tree, t_mlist *mlist, int **tpfd) { pid_t pid; char **charenv; int builtin; charenv = ft_tochar(mlist->env); if ((builtin = ft_is_builtin(tree->data)) && !tpfd[0] && !tpfd[1]) { ft_clear_tab(charenv); return (ft_builtin(mlist, tree)); } if ((pid = fork()) < 0) return (0); if (pid == 0) { ft_pfd_manage(tpfd[0], tpfd[1]); ft_son(mlist, charenv, tree, builtin); } else { ft_red_handler(tree->left, mlist, 0); return (ft_father(pid, charenv, tpfd)); } return (0); }
static void ft_son(t_mlist *mlist, char **charenv, t_node *tree, int builtin) { int ret; char **cmd; cmd = NULL; signal(SIGINT, SIG_DFL); if (!builtin) cmd = ft_arg_handler(tree, ft_checkpath(tree->data, charenv)); if (!cmd && !builtin) exit(EXIT_SUCCESS); if (!builtin && ft_red_handler(tree->left, mlist, 1)) { execve(cmd[0], cmd, charenv); ft_notfnd(cmd[0]); } else if (builtin) { ft_clear_tab(charenv); ret = ft_builtin(mlist, tree); ft_list_clear(&(mlist->env)); ft_clear_tab(cmd); exit(ret); } exit(EXIT_FAILURE); }
static void ft_check_var2(char **av) { if (!ft_getenv(g_env.env, "OLDPWD")) { ft_strcpy(av[1], "OLDPWD"); ft_strcpy(av[2], ft_getenv(g_env.env, "HOME")); ft_builtin(av); } if (!ft_getenv(g_env.env, "PWD")) { ft_strcpy(av[1], "PWD"); ft_strcpy(av[2], ft_getenv(g_env.env, "HOME")); ft_builtin(av); ft_strcpy(av[0], "cd"); ft_strcpy(av[1], ft_getenv(g_env.env, "PWD")); free(av[2]); av[2] = '\0'; ft_builtin(av); } }
int ft_isbuiltin(t_env *env, char *line) { int i; i = 0; if (ft_findstr(">&", line) == 1 && (i = 1)) ft_links(line); i = ft_builtin(env, line); if (i == 1) return (0); return (1); }
static void ft_check_var1(char **av) { if (!ft_getenv(g_env.env, "PATH")) { ft_strcpy(av[1], "PATH"); ft_strcpy(av[2], "/usr/local/bin:/usr/bin:/bin:/usr/"\ "sbin:/sbin:/opt/X11/bin:/usr/texbin"); ft_builtin(av); } if (!ft_getenv(g_env.env, "USER")) { ft_strcpy(av[1], "USER"); ft_strcpy(av[2],"unknow_user"); ft_builtin(av); } if (!ft_getenv(g_env.env, "HOME")) { ft_strcpy(av[1], "HOME"); ft_strcpy(av[2],"/"); ft_builtin(av); } }
void ft_process(t_data *d, char *str) { int i; char **tab; char *tmp; i = 0; tmp = ft_tilde(str, d); tab = ft_strsplit_shell(tmp); ft_strdel(&tmp); if (tab && tab[0]) { ft_search_alias(d, &tab); ft_builtin(d, tab, &i); if (i == 0) { if (ft_exec(ft_convert_ltt(d->my_env), tab, d->fork) == 0) ft_printf("42sh: command not found: %s\n", tab[0]); } } ft_free_tab(&tab); }
void ft_execcmd(char *tcmd, char ***env) { pid_t father; char **cmd; int stat_loc; cmd = ft_strsplit(tcmd, ' '); if (!ft_builtin(env, cmd)) { father = fork(); if (!father) { ft_signal_off(); ft_execve(cmd, env); } else { waitpid(father, &stat_loc, WUNTRACED); ft_signal_on(); ft_single_ret(stat_loc, 1); } } ft_strdel2d(&cmd); }