/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* export.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/12/03 13:36:54 by lperrey #+# #+# */ /* Updated: 2021/12/04 16:07:21 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" char *ft_getenv(char *env_var); size_t ft_getenv_position(char *env_var); static int change_env_value(char *arg); // in complete shell, must mark all arguments for export // (Not implemented in minishell) int builtin_export(int argc, char *argv[], t_all *c) { int i; (void)argc; i = 1; while (argv[i]) { if (ft_strchr(argv[i], '=')) { if (!change_env_value(argv[i])) return (EXIT_FAILURE); if (ft_strncmp(argv[i], "PATH=", 5) == 0) c->path = retrieve_path(); } i++; } return (EXIT_SUCCESS); } static int change_env_value(char *arg) { char **var_split; int env_position; var_split = ft_split(arg, '='); if (!var_split) return (ft_reti_perror(-1, "builtin_export, ft_split()")); env_position = ft_getenv_position(var_split[0]); ft_free_2d_arr(var_split); if (environ[env_position] == NULL) { environ = ft_resize_2d_arr(environ, 1); if (!environ) return (ft_reti_perror(-1, "builtin_export, ft_resize_2d_arr()")); } environ[env_position] = ft_strdup(arg); if (!environ[env_position]) return (ft_reti_perror(-1, "builtin_export, ft_strdup()")); return (0); } /* ** Search for an environement variable, ** and return a pointer to the first character after "env_var=" . ** Return NULL if env_var not found. */ char *ft_getenv(char *env_var) { int i; char *tmp; size_t env_var_len; env_var_len = ft_strlen(env_var); i = 0; tmp = NULL; while (!tmp && environ[i]) { if (environ[i][env_var_len] == '=') { if (ft_strncmp(environ[i], env_var, env_var_len) == 0) tmp = &environ[i][env_var_len + 1]; else i++; } else i++; } return (tmp); } /* ** Like ft_getenv(), but return position of env_var instead of value. ** If env_var not found, return last position of **environ (== NULL) */ size_t ft_getenv_position(char *env_var) { int i; int found; size_t env_var_len; env_var_len = ft_strlen(env_var); i = 0; found = 0; while (!found && environ[i]) { if (environ[i][env_var_len] == '=') { if (ft_strncmp(environ[i], env_var, env_var_len) == 0) found = 1; else i++; } else i++; } return (i); }