78 lines
1.4 KiB
C
78 lines
1.4 KiB
C
#include "./utils.h"
|
|
#include <unistd.h>
|
|
|
|
char *ft_get_executable_with_path(const char *name)
|
|
{
|
|
char *path;
|
|
|
|
if (access(name, F_OK) != 0)
|
|
{
|
|
ft_eprintf("minishell: %s bash: No such file or directery\n");
|
|
return (NULL);
|
|
}
|
|
if (access(name, X_OK) != 0)
|
|
{
|
|
ft_eprintf("minishell: %s: permission denied\n", name);
|
|
return (NULL);
|
|
}
|
|
path = ft_strdup(name);
|
|
if (path == NULL)
|
|
{
|
|
ft_eprintf("minishell: malloc failed\n");
|
|
return (NULL);
|
|
}
|
|
return (path);
|
|
}
|
|
|
|
char *ft_get_executable_without_path(t_list **env, const char *name)
|
|
{
|
|
char **tab;
|
|
char *paths;
|
|
char *path;
|
|
size_t i;
|
|
|
|
path = NULL;
|
|
paths = get_value_by_key("PATH", env);
|
|
if (paths == NULL)
|
|
{
|
|
ft_eprintf("minishell: %s: command not found\n", name);
|
|
return (NULL);
|
|
}
|
|
tab = ft_split(paths, ':');
|
|
if (tab == NULL)
|
|
{
|
|
ft_eprintf("minishell: malloc failed\n");
|
|
return (NULL);
|
|
}
|
|
i = 0;
|
|
while (tab[i] != NULL)
|
|
{
|
|
path = ft_strmerger(3, tab[i], "/", name);
|
|
if (path == NULL)
|
|
{
|
|
ft_eprintf("minishell: malloc failed\n");
|
|
break;
|
|
}
|
|
if (access(path, X_OK) == 0)
|
|
break;
|
|
free(path);
|
|
path = NULL;
|
|
i++;
|
|
}
|
|
ft_freer_tab_ultimate(1, tab);
|
|
if (path == NULL)
|
|
ft_eprintf("minishell: %s: command not found\n", name);
|
|
return (path);
|
|
}
|
|
|
|
char *ft_get_executable(t_list **env, const char *name)
|
|
{
|
|
char *path;
|
|
|
|
if (name[0] == '.' || name[0] == '/')
|
|
path = ft_get_executable_with_path(name);
|
|
else
|
|
path = ft_get_executable_without_path(env, name);
|
|
return (path);
|
|
}
|