42_minishell/utils/ft_get_executable.c
2023-03-10 13:34:23 +01:00

75 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)
path = "";
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);
}