diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-02-27 18:08:49 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-02-27 18:08:49 +0100 |
| commit | 83e7d63bc9c2d4a246df3cc8555127f3b956f960 (patch) | |
| tree | 025f4f5eb940754e04c0b8e8f4d44f36831d8a2e /src | |
| parent | 5e90ab4b33570dd14c96c8ed32e2477b788aa75c (diff) | |
| download | minishell-83e7d63bc9c2d4a246df3cc8555127f3b956f960.tar.gz minishell-83e7d63bc9c2d4a246df3cc8555127f3b956f960.tar.bz2 minishell-83e7d63bc9c2d4a246df3cc8555127f3b956f960.zip | |
WIP: path update from PATH formated string
Diffstat (limited to 'src')
| -rw-r--r-- | src/builtin/cd.c | 0 | ||||
| -rw-r--r-- | src/builtin/echo.c | 0 | ||||
| -rw-r--r-- | src/builtin/env.c | 0 | ||||
| -rw-r--r-- | src/builtin/exit.c | 0 | ||||
| -rw-r--r-- | src/builtin/export.c | 0 | ||||
| -rw-r--r-- | src/builtin/pwd.c | 0 | ||||
| -rw-r--r-- | src/builtin/unset.c | 0 | ||||
| -rw-r--r-- | src/environment.c | 0 | ||||
| -rw-r--r-- | src/main.c | 3 | ||||
| -rw-r--r-- | src/parse.c | 6 | ||||
| -rw-r--r-- | src/path.c | 104 |
11 files changed, 113 insertions, 0 deletions
diff --git a/src/builtin/cd.c b/src/builtin/cd.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/builtin/cd.c diff --git a/src/builtin/echo.c b/src/builtin/echo.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/builtin/echo.c diff --git a/src/builtin/env.c b/src/builtin/env.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/builtin/env.c diff --git a/src/builtin/exit.c b/src/builtin/exit.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/builtin/exit.c diff --git a/src/builtin/export.c b/src/builtin/export.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/builtin/export.c diff --git a/src/builtin/pwd.c b/src/builtin/pwd.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/builtin/pwd.c diff --git a/src/builtin/unset.c b/src/builtin/unset.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/builtin/unset.c diff --git a/src/environment.c b/src/environment.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/environment.c @@ -3,6 +3,9 @@ int main(int argc, char **argv, char **envp) { + (void)argc; + (void)argv; + (void)envp; // init // find executable in PATH diff --git a/src/parse.c b/src/parse.c new file mode 100644 index 0000000..b4bb994 --- /dev/null +++ b/src/parse.c @@ -0,0 +1,6 @@ +#include "minishell.h" + +t_parsing *ms_parse(char *input) +{ + return NULL; +} diff --git a/src/path.c b/src/path.c new file mode 100644 index 0000000..0a9dbd1 --- /dev/null +++ b/src/path.c @@ -0,0 +1,104 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* path.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/27 15:51:01 by cacharle #+# #+# */ +/* Updated: 2020/02/27 18:07:16 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static void st_path_command_entry_del(t_ftht_content *content) +{ + if (content == NULL) + return ; + free(content->key); + free(content->value); +} + +static int st_in_dirs(char **dirs, char *dir) +{ + while (*dirs != NULL) + if (ft_strcmp(*dirs++, dir) == 0) + return (TRUE); // maybe change ft_lstremove_if func to cmp instead of bool + return (FALSE); +} + +static t_path *st_path_commands_update(t_path *path, char *dirname) +{ + DIR *dir; + struct dirent *entry; + char *tmp; + + if ((dir = opendir(dirname)) == NULL) + return (NULL); + while ((entry = readdir(dir)) != NULL) + { + if ((tmp = ft_strjoin(dirname, entry->d_name)) == NULL) + return (NULL); + if (ft_htset(path->commands, entry->d_name, st_path_command_entry_del) == NULL) + return (NULL); + } + if (closedir(dir) == -1) + return (NULL); + return (path); +} + +/* +** Update path list with `dirname` +*/ + +static t_path *st_path_dir_update(t_path *path, char *dirname) +{ + t_ftlst *front; + + if (ft_lstlfind(path->dirs, (int (*)(void*, void*))ft_strcmp, dirname) == NULL) + { + if ((dirname = ft_strdup(dirname)) == NULL) + return (NULL); + if ((front = ft_lstnew(dirname)) == NULL) + { + free(dirname); + return (NULL); + } + ft_lstadd_front(&path->dirs, front); + } + return (st_path_commands_update(path, dirname)); +} + +/* +** Update (or create if `path` is NULL) `path` according to `path_str` +** (each directory is separated by a ':'). +*/ + +t_path *ms_path_update(t_path *path, const char *path_str) +{ + int i; + char **dirs; + + if (path == NULL) + if ((path = malloc(sizeof(t_path))) == NULL) + return (NULL); + if ((dirs = ft_split(path_str, ':')) == NULL) + return (NULL); + ft_lstremove_if(&path->dirs, (t_ftbool (*)(void*, void*))st_in_dirs, free, (void*)dirs); // change t_ftbool to std bool + i = -1; + while (dirs[i] != NULL) + if (st_path_dir_update(path, dirs[i]) == NULL) + return (ft_split_destroy(dirs)); + ft_split_destroy(dirs); + return (path); +} + +void ms_path_destroy(t_path *path) +{ + if (path == NULL) + return ; + ft_lstclear(&path->dirs, free); + ft_htdestroy(path->commands, st_path_command_entry_del); + free(path); +} |
