示例#1
0
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);
}
示例#2
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);
}
示例#3
0
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);
	}
}
示例#4
0
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);
}
示例#5
0
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);
	}
}
示例#6
0
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);
}
示例#7
0
文件: ft_sh2.c 项目: Erwanito/42sh
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);
}