ajout d'env avec opt -i -u / export / unset
This commit is contained in:
parent
73f12e7e96
commit
b67c7fd7d3
10 changed files with 190 additions and 92 deletions
|
|
@ -36,9 +36,11 @@ builtin/builtin_cd.c\
|
|||
builtin/builtin_echo.c\
|
||||
builtin/builtin_env.c\
|
||||
builtin/builtin_exit.c\
|
||||
builtin/builtin_export.c\
|
||||
builtin/builtin_history.c\
|
||||
builtin/builtin_read.c\
|
||||
builtin/builtin_setenv.c\
|
||||
builtin/builtin_unset.c\
|
||||
builtin/builtin_unsetenv.c\
|
||||
builtin/is_builtin.c\
|
||||
completion/c_binary.c\
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2016/12/13 17:21:56 by jhalford #+# #+# */
|
||||
/* Updated: 2017/02/02 19:07:01 by gwojda ### ########.fr */
|
||||
/* Updated: 2017/02/15 11:45:15 by gwojda ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -18,6 +18,8 @@
|
|||
# include "builtin_read.h"
|
||||
|
||||
t_execf *is_builtin(t_process *p);
|
||||
int builtin_export(const char *path, char *const av[], char *const envp[]);
|
||||
int builtin_unset(const char *path, char *const av[], char *const envp[]);
|
||||
int builtin_env(const char *path, char *const argv[], char *const envp[]);
|
||||
int builtin_echo(const char *path, char *const argv[], char *const envp[]);
|
||||
int builtin_cd(const char *path, char *const argv[], char *const envp[]);
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2016/11/10 13:07:44 by jhalford #+# #+# */
|
||||
/* Updated: 2017/02/10 00:26:10 by jhalford ### ########.fr */
|
||||
/* Updated: 2017/02/15 14:20:59 by gwojda ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
|
|||
|
|
@ -3,43 +3,131 @@
|
|||
/* ::: :::::::: */
|
||||
/* builtin_env.c :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2016/11/28 14:14:20 by jhalford #+# #+# */
|
||||
/* Updated: 2017/01/10 13:08:15 by jhalford ### ########.fr */
|
||||
/* Updated: 2017/02/15 15:45:54 by gwojda ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "minishell.h"
|
||||
|
||||
int builtin_env(const char *path, char *const argv[], char *const envp[])
|
||||
/*
|
||||
** a ajouter dans la lib ?
|
||||
*/
|
||||
|
||||
int ft_sstr_found(char **sstr, char *name)
|
||||
{
|
||||
(void)argv;
|
||||
(void)envp;
|
||||
(void)path;
|
||||
int size;
|
||||
|
||||
size = 0;
|
||||
if (sstr)
|
||||
while (sstr[size] && ft_strncmp(name, sstr[size], ft_strlen(name)))
|
||||
++size;
|
||||
return (size);
|
||||
}
|
||||
|
||||
void ft_sstr_freeone(char **sstr, int index)
|
||||
{
|
||||
char *tmp;
|
||||
|
||||
tmp = sstr[index];
|
||||
while (sstr[index])
|
||||
{
|
||||
sstr[index] = sstr[index + 1];
|
||||
index++;
|
||||
}
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
/*
|
||||
**
|
||||
*/
|
||||
|
||||
static void ft_env_execute(char *const argv[], char **env)
|
||||
{
|
||||
pid_t soon;
|
||||
char *path;
|
||||
char *path_exe;
|
||||
|
||||
path = ft_getenv(env, "PATH");
|
||||
path_exe = ft_findexec(path, *argv);
|
||||
if (!path || !path_exe)
|
||||
{
|
||||
ft_dprintf(2, "{red}%s: no such file or directory: %s{eoc}\n",
|
||||
SHELL_NAME, *argv);
|
||||
return ;
|
||||
}
|
||||
if ((soon = fork()))
|
||||
wait(&soon);
|
||||
else
|
||||
set_exitstatus(execve(path_exe, argv, env), 1);
|
||||
free(path_exe);
|
||||
}
|
||||
|
||||
static void ft_illegal_opt_env(char c)
|
||||
{
|
||||
ft_dprintf(2, "{red}env: option requires an argument -- %c\n", c);
|
||||
ft_dprintf(2, "usage: env\t[-iv] [-P utilpath] [-S string]");
|
||||
ft_dprintf(2, " [-u name]\n\t\t[name=value ...] ");
|
||||
ft_dprintf(2, "[utility [argument ...]]{eoc}\n");
|
||||
}
|
||||
|
||||
static int ft_check_env_opt(char ***argv, char ***env)
|
||||
{
|
||||
if (!ft_strcmp(**argv, "-i"))
|
||||
{
|
||||
ft_sstrfree(*env);
|
||||
*env = NULL;
|
||||
++(*argv);
|
||||
}
|
||||
else if (!ft_strcmp(**argv, "-u"))
|
||||
{
|
||||
++(*argv);
|
||||
if (!**argv)
|
||||
{
|
||||
ft_illegal_opt_env('u');
|
||||
return (1);
|
||||
}
|
||||
ft_sstr_freeone(*env, ft_sstr_found(*env, **argv));
|
||||
++(*argv);
|
||||
}
|
||||
else if (***argv == '-')
|
||||
{
|
||||
ft_illegal_opt_env(*(**argv + 1));
|
||||
return (1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
/* int builtin_env(char **av, t_data *data) */
|
||||
/* { */
|
||||
/* int i; */
|
||||
/* char **env; */
|
||||
|
||||
/* i = 1; */
|
||||
/* env = NULL; */
|
||||
/* if (!av[1]) */
|
||||
/* { */
|
||||
/* ft_sstrprint(data->env, '\n'); */
|
||||
/* ft_putchar('\n'); */
|
||||
/* } */
|
||||
/* else */
|
||||
/* { */
|
||||
/* while (av[i] && ft_strchr(av[i], '=')) */
|
||||
/* { */
|
||||
/* env = ft_sstradd(env, av[i]); */
|
||||
/* i++; */
|
||||
/* } */
|
||||
/* if (av[i]) */
|
||||
/* ft_cmd_process(av + i); */
|
||||
/* } */
|
||||
/* return (0); */
|
||||
/* } */
|
||||
int builtin_env(const char *path, char *const argv[], char *const envp[])
|
||||
{
|
||||
char **env;
|
||||
|
||||
(void)path;
|
||||
env = ft_sstrdup((char **)envp);
|
||||
while (*argv)
|
||||
{
|
||||
if (ft_check_env_opt((char ***)&argv, (char ***)&env))
|
||||
break ;
|
||||
while (*argv && ft_strrchr(*argv, '='))
|
||||
{
|
||||
env = ft_sstradd(env, *argv);
|
||||
++argv;
|
||||
}
|
||||
if (env && (!*argv || (!ft_strcmp(*argv, "env") && !*(argv + 1))))
|
||||
{
|
||||
ft_sstrprint(env, '\n');
|
||||
ft_putchar('\n');
|
||||
return (0);
|
||||
}
|
||||
if (*argv && ft_strcmp(*argv, "env"))
|
||||
{
|
||||
ft_env_execute(argv, env);
|
||||
return (0);
|
||||
}
|
||||
if (*argv)
|
||||
++argv;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
|
|
|||
20
42sh/src/builtin/builtin_export.c
Normal file
20
42sh/src/builtin/builtin_export.c
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* builtin_export.c :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: gwojda <gwojda@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2017/02/15 11:39:37 by gwojda #+# #+# */
|
||||
/* Updated: 2017/02/15 11:46:20 by gwojda ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "minishell.h"
|
||||
|
||||
int builtin_export(const char *path, char *const av[], char *const envp[])
|
||||
{
|
||||
if (ft_strcmp(av[0], "export") == 0)
|
||||
av++;
|
||||
return (builtin_setenv(path, av, envp));
|
||||
}
|
||||
18
42sh/src/builtin/builtin_unset.c
Normal file
18
42sh/src/builtin/builtin_unset.c
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* builtin_unset.c :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: gwojda <gwojda@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2017/02/15 11:43:34 by gwojda #+# #+# */
|
||||
/* Updated: 2017/02/15 11:58:22 by gwojda ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "minishell.h"
|
||||
|
||||
int builtin_unset(const char *path, char *const av[], char *const envp[])
|
||||
{
|
||||
return (builtin_unsetenv(path, av, envp));
|
||||
}
|
||||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2016/12/13 13:09:57 by jhalford #+# #+# */
|
||||
/* Updated: 2017/01/26 14:58:02 by gwojda ### ########.fr */
|
||||
/* Updated: 2017/02/15 11:44:31 by gwojda ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -16,6 +16,8 @@ t_stof g_builtin[] =
|
|||
{
|
||||
{"echo", &builtin_echo},
|
||||
{"cd", &builtin_cd},
|
||||
{"export", &builtin_export},
|
||||
{"unset", &builtin_unset},
|
||||
{"setenv", &builtin_setenv},
|
||||
{"unsetenv", &builtin_unsetenv},
|
||||
{"env", &builtin_env},
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: gwojda <gwojda@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2016/12/13 13:51:33 by gwojda #+# #+# */
|
||||
/* Updated: 2017/02/14 14:13:05 by gwojda ### ########.fr */
|
||||
/* Updated: 2017/02/15 11:52:24 by gwojda ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -36,6 +36,12 @@ static int ft_git_status(void)
|
|||
ft_printf("\x1b[38;5;47mgit:(\x1b[38;5;203m%s\x1b[38;5;47m)", line);
|
||||
free(tmp);
|
||||
}
|
||||
else
|
||||
{
|
||||
line = ft_strdup(line + 3);
|
||||
ft_printf("\x1b[38;5;47mgit:(\x1b[38;5;203m%s\x1b[38;5;47m)", line);
|
||||
free(tmp);
|
||||
}
|
||||
if (!get_next_line(pip[0], &tmp))
|
||||
printf("\x1b[38;5;83m %C ", L'✓');
|
||||
else
|
||||
|
|
|
|||
75
42sh/test
75
42sh/test
|
|
@ -1,62 +1,19 @@
|
|||
[7m[33m shell_init.c [1m[34m28 [0minteractive shell settings[0m
|
||||
[7m[33m main.c [1m[34m90 [0m[7m[1m[32mstart of shell[0m pid=44206 pgrp=44206 job_control is ON[0m
|
||||
[7m[33m lexer_end.c [1m[34m7 [0mcheck[0m
|
||||
[7m[33m main.c [1m[34m65 [0m[[35mhistory[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[history][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[history][0m
|
||||
[7m[33m lexer_end.c [1m[34m7 [0mcheck[0m
|
||||
[7m[33m main.c [1m[34m65 [0m[[35mhistory[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[history][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[history][0m
|
||||
[7m[33m lexer_end.c [1m[34m7 [0mcheck[0m
|
||||
[7m[33m main.c [1m[34m65 [0m[[35maaaaaaa[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[aaaaaaa][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[aaaaaaa][0m
|
||||
[7m[33m lexer_end.c [1m[34m7 [0mcheck[0m
|
||||
[7m[33m main.c [1m[34m65 [0m[[35mssssss[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[ssssss][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[ssssss][0m
|
||||
[7m[33m lexer_end.c [1m[34m7 [0mcheck[0m
|
||||
[7m[33m main.c [1m[34m65 [0m[[35mddddddddd[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[ddddddddd][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[ddddddddd][0m
|
||||
[7m[33m lexer_end.c [1m[34m7 [0mcheck[0m
|
||||
[7m[33m main.c [1m[34m65 [0m[[35mffffffffffffff[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[ffffffffffffff][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[ffffffffffffff][0m
|
||||
[7m[33m lexer_end.c [1m[34m7 [0mcheck[0m
|
||||
[7m[33m main.c [1m[34m65 [0m[[35mffffffffffffff[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[ffffffffffffff][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[ffffffffffffff][0m
|
||||
[7m[33m lexer_end.c [1m[34m7 [0mcheck[0m
|
||||
[7m[33m main.c [1m[34m65 [0m[[35mhistory[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[history][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[history][0m
|
||||
[7m[33m lexer_end.c [1m[34m7 [0mcheck[0m
|
||||
[7m[33m main.c [1m[34m65 [0m[[35mhistory[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[history][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[history][0m
|
||||
[7m[33m lexer_end.c [1m[34m7 [0mcheck[0m
|
||||
[7m[33m main.c [1m[34m65 [0m[[35mls[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[ls][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[ls][0m
|
||||
[7m[33m job_wait.c [1m[34m20 [0mgonna wait [1][0m
|
||||
[7m[33m lexer_end.c [1m[34m7 [0mcheck[0m
|
||||
[7m[33m main.c [1m[34m65 [0m[[35mls -la[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[ls][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[-la][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[ls][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[-la][0m
|
||||
[7m[33m job_wait.c [1m[34m20 [0mgonna wait [1][0m
|
||||
[7m[33m lexer_end.c [1m[34m7 [0mcheck[0m
|
||||
[7m[33m main.c [1m[34m65 [0m[[35mls -la[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[ls][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[-la][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[ls][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[-la][0m
|
||||
[7m[33m job_wait.c [1m[34m20 [0mgonna wait [1][0m
|
||||
[7m[33m lexer_end.c [1m[34m7 [0mcheck[0m
|
||||
[7m[33m main.c [1m[34m65 [0m[[35mhistory[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[history][0m
|
||||
[7m[33m main.c [1m[34m88 [0m[7m[1m[32mstart of shell[0m JOBC is ON[0m
|
||||
[7m[33m main.c [1m[34m64 [0m[[35menv -o[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[env][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[-o][0m
|
||||
[7m[33m main.c [1m[34m64 [0m[[35menv -u[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[env][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[-u][0m
|
||||
[7m[33m main.c [1m[34m64 [0m[[35mhistor[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[histor][0m
|
||||
[7m[33m main.c [1m[34m64 [0m[[35mhistory[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[history][0m
|
||||
[7m[33m main.c [1m[34m64 [0m[[35menv -u LESS[0m] stack=[0] state=[4][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[env][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[-u][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[LESS][0m
|
||||
[7m[33m main.c [1m[34m64 [0m[[35menv [0m] stack=[0] state=[0][0m
|
||||
[7m[33m token_print.c [1m[34m29 [0m13:[env][0m
|
||||
[7m[33m shell_exit.c [1m[34m17 [0mshell_exit()[0m
|
||||
|
|
|
|||
3
42sh/testmake
Normal file
3
42sh/testmake
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[7m[33m shell_init.c [1m[34m28 [0minteractive shell settings[0m
|
||||
[7m[33m main.c [1m[34m88 [0m[7m[1m[32mstart of shell[0m JOBC is ON[0m
|
||||
[7m[33m shell_exit.c [1m[34m17 [0mshell_exit()[0m
|
||||
Loading…
Reference in a new issue