--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* execution.h :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: ljiriste <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2024/08/02 17:40:19 by ljiriste #+# #+# */
+/* Updated: 2024/08/02 17:42:18 by ljiriste ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#ifndef EXECUTION_H
+# define EXECUTION_H
+
+const char *get_env_var_value(const t_execution_env *env,
+ const char *var_name);
+int set_env_var_value(t_execution_env *env, const char *var_name,
+ const char *new_value);
+int cd(int argc, char **argv, t_execution_env *env);
+
+#endif // EXECUTION_H
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* cd.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: ljiriste <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2024/08/02 16:37:48 by ljiriste #+# #+# */
+/* Updated: 2024/08/02 18:37:45 by ljiriste ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "minishell.h"
+#include "execution.h"
+#include <unistd.h>
+#include <stdlib.h>
+
+int chdir_wrapper(const char *path, t_execution_env *env)
+{
+ char *cwd;
+
+ if (!ft_strcmp(path, "~"))
+ path = get_env_var_value(env, "HOME");
+ if (!path || path[0] == '\0')
+ return (0);
+ if (chdir(path))
+ return (3);
+ cwd = getcwd(NULL, 0);
+ if (!cwd)
+ return (1);
+ if (set_env_var_value(env, "PWD", cwd))
+ {
+ chdir(get_env_var_value(env, "PWD"));
+ free(cwd);
+ return (2);
+ }
+ free(cwd);
+ return (0);
+}
+
+int cd(int argc, char **argv, t_execution_env *env)
+{
+ if (argc == 1)
+ return (chdir_wrapper("~", env));
+ if (argc == 2)
+ return (chdir_wrapper(argv[1], env));
+ return (1);
+}
/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/07/21 08:57:54 by ljiriste #+# #+# */
-/* Updated: 2024/08/01 16:07:38 by ljiriste ### ########.fr */
+/* Updated: 2024/08/02 18:35:53 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
+#include "execution.h"
#include "libft.h"
#include <stdlib.h>
#include <unistd.h>
return (ft_strndup(line, i));
}
-const char *get_var_value(const t_vec *vars, const char *var_name)
+ssize_t get_var_index(const t_vec *vars, const char *var_name)
{
size_t len;
- size_t i;
+ ssize_t i;
const char *const *line;
len = ft_strlen(var_name);
i = 0;
- while (i < vars->size)
+ while ((size_t)i < vars->size)
{
line = ft_vec_caccess(vars, i);
if (!*line)
break ;
if (!ft_strncmp(*line, var_name, len) && (*line)[len] == '=')
- return (*line + len + 1);
+ return (i);
++i;
}
+ return (-1);
+}
+
+const char *get_var_value(const t_vec *vars, const char *var_name)
+{
+ size_t len;
+ ssize_t i;
+ const char *const *line;
+
+ len = ft_strlen(var_name);
+ i = get_var_index(vars, var_name);
+ if (i >= 0)
+ {
+ line = ft_vec_caccess(vars, i);
+ return (*line + len + 1);
+ }
return (NULL);
}
return (fields);
}
+int set_var_value(t_vec *vars, const char *name, const char *value)
+{
+ ssize_t i;
+ char *new_entry;
+
+ i = get_var_index(vars, name);
+ new_entry = malloc(ft_strlen(name) + 1 + ft_strlen(value) + 1);
+ if (!new_entry)
+ return (1);
+ ft_memcpy(new_entry, name, ft_strlen(name));
+ new_entry[ft_strlen(name)] = '=';
+ ft_memcpy(new_entry + ft_strlen(name) + 1, value, ft_strlen(value) + 1);
+ if (add_var_line(vars, new_entry))
+ {
+ free(new_entry);
+ return (1);
+ }
+ if (i >= 0)
+ ft_vec_erase(vars, i, free_str);
+ free(new_entry);
+ return (0);
+}
+
+int set_env_var_value(t_execution_env *env, const char *name, const char *value)
+{
+ if (get_var_value(&env->vars->other, name))
+ return (set_var_value(&env->vars->other, name, value));
+ else if (get_var_value(&env->vars->exported, name))
+ return (set_var_value(&env->vars->exported, name, value));
+ else
+ return (set_var_value(&env->vars->other, name, value));
+}
+
int assignments_to_env(const t_vec *assignments, t_execution_env *env)
{
return (ft_vec_insert_range(&env->vars->other, assignments->vec, assignments->size, 0) == success);
return (0);
}
+int is_builtin(const char *str)
+{
+ if (!ft_strcmp(str, "cd"))
+ return (1);
+ return (0);
+}
+
+size_t count_fields(char **fields)
+{
+ size_t i;
+
+ i = 0;
+ while (fields[i])
+ ++i;
+ return (i);
+}
+
+int ex_builtin(char **fields, __attribute__((unused)) t_vec *assignments, __attribute__((unused)) const t_vec *redirections, t_execution_env *env)
+{
+ if (!ft_strcmp(fields[0], "cd"))
+ env->ret_val = cd(count_fields(fields), fields, env);
+ else
+ return (-1);
+ return (0);
+}
+
int ex_fields(char **fields, t_vec *assignments, const t_vec *redirections, t_execution_env *env)
{
pid_t pid;
int status;
char *path;
+ if (is_builtin(fields[0]))
+ return (ex_builtin(fields, assignments, redirections, env));
path = NULL;
if (contains_path(fields[0]) && file_exists(fields[0]))
path = ft_strdup(fields[0]);