executor_absolute_path

This commit is contained in:
whaffman 2025-02-08 19:42:34 +01:00
parent 869eb0d857
commit 3aa6459969
2 changed files with 73 additions and 0 deletions

20
inc/executor.h Normal file
View File

@ -0,0 +1,20 @@
/* ************************************************************************** */
/* */
/* :::::::: */
/* executor.h :+: :+: */
/* +:+ */
/* By: willem <willem@student.codam.nl> +#+ */
/* +#+ */
/* Created: 2025/02/08 17:06:07 by willem #+# #+# */
/* Updated: 2025/02/08 17:15:24 by willem ######## odam.nl */
/* */
/* ************************************************************************** */
#ifndef EXECUTER_H
# define EXECUTER_H
# include "minishell.h"
char *executor_absolute_path(t_list *env, char *cmd);
#endif // EXECUTER_H

View File

@ -0,0 +1,53 @@
/* ************************************************************************** */
/* */
/* :::::::: */
/* executor_absolute_path.c :+: :+: */
/* +:+ */
/* By: willem <willem@student.codam.nl> +#+ */
/* +#+ */
/* Created: 2025/02/08 17:00:24 by willem #+# #+# */
/* Updated: 2025/02/08 19:27:05 by willem ######## odam.nl */
/* */
/* ************************************************************************** */
#include "minishell.h"
char *executor_absolute_path(t_list *env, char *cmd)
{
char **path;
char *executable;
int i;
if (cmd[0] == '/' || cmd[0] == '.')
{
if (access(cmd, F_OK) == 0)
{
executable = ft_strdup(cmd);
if (!executable)
return (NULL);
return (executable);
}
return (NULL);
}
path = ft_split(environment_get(env, "PATH")->value, ':');
if (!path)
return (NULL);
i = 0;
while (path[i] != NULL)
{
executable = malloc(ft_strlen(path[i]) + ft_strlen(cmd) + 2);
if (!executable)
return (ft_free_arr(path), NULL);
ft_strlcpy(executable, path[i], ft_strlen(path[i]) + 1);
ft_strlcat(executable, "/", ft_strlen(path[i]) + 2);
ft_strlcat(executable, cmd, ft_strlen(path[i]) + ft_strlen(cmd) + 2);
if (access(executable, F_OK) == 0)
{
ft_free_arr(path);
return (executable);
}
free(executable);
i++;
}
return (ft_free_arr(path), NULL);
}