diff --git a/42sh/.tags b/42sh/.tags index c7191ae8..84c0c4ac 100644 --- a/42sh/.tags +++ b/42sh/.tags @@ -1,13 +1,14 @@ Mmain src/main.c /^int main(void)$/ -builtin_cd src/builtin.c /^int builtin_cd(char **av, char **env)$/ -builtin_echo src/builtin.c /^int builtin_echo(char **av, char **env)$/ -builtin_env src/builtin_env.c /^int builtin_env(char **av, char **env)$/ -builtin_exit src/builtin.c /^int builtin_exit(char **av, char **env)$/ -builtin_setenv src/builtin_env.c /^int builtin_setenv(char **av, char **env)$/ -builtin_unsetenv src/builtin_env.c /^int builtin_unsetenv(char **av, char **env)$/ -ft_builtin_exec src/builtin.c /^int ft_builtin_exec(char **av, char **env)$/ -ft_cmd_exec src/ft_cmd.c /^int ft_cmd_exec(char *cmd)$/ +builtin_cd src/builtin_cd.c /^int builtin_cd(char **av, char ***env)$/ +builtin_echo src/builtin_echo.c /^int builtin_echo(char **av, char ***env_p)$/ +builtin_env src/builtin_env.c /^int builtin_env(char **av, char ***env_p)$/ +builtin_exit src/builtin_exit.c /^int builtin_exit(char **av, char ***env_p)$/ +builtin_setenv src/builtin_setenv.c /^int builtin_setenv(char **av, char ***env_p)$/ +builtin_unsetenv src/builtin_unsetenv.c /^int builtin_unsetenv(char **av, char ***env)$/ +ft_builtin src/builtin.c /^int ft_builtin(char **av, char ***env_p)$/ +ft_cmd_exec src/ft_cmd.c /^int ft_cmd_exec(char *execpath, char **argv, char/ ft_cmd_getav src/ft_cmd.c /^char **ft_cmd_getav(char *cmd)$/ +ft_cmd_process src/ft_cmd.c /^int ft_cmd_process(char *cmd)$/ ft_env_getval src/lib_env.c /^char *ft_env_getval(char **env, char *key)$/ ft_expand_vars src/lib_expansion.c /^void ft_expand_vars(char **av, char **env)$/ ft_path_access src/lib_path.c /^int ft_path_access(char *execpath, char *execname/ diff --git a/42sh/Session.vim b/42sh/Session.vim new file mode 100644 index 00000000..95be206d --- /dev/null +++ b/42sh/Session.vim @@ -0,0 +1,223 @@ +let SessionLoad = 1 +if &cp | set nocp | endif +let s:so_save = &so | let s:siso_save = &siso | set so=0 siso=0 +let v:this_session=expand(":p") +silent only +cd ~/42/minishell +if expand('%') == '' && !&modified && line('$') <= 1 && getline(1) == '' + let s:wipebuf = bufnr('%') +endif +set shortmess=aoO +badd +1 src/main.c +badd +22 src/builtin.c +badd +5 src/builtin_cd.c +badd +10 src/builtin_echo.c +badd +12 src/ft_cmd.c +badd +13 includes/minishell.h +badd +23 src/lib_path.c +badd +9 Makefile +badd +6 src/builtin_setenv.c +badd +4 src/builtin_unsetenv.c +badd +3 src/lib_env.c +badd +5 src/builtin_env.c +badd +4 src/builtin_exit.c +badd +0 src/lib_expansion.c +argglobal +silent! argdel * +argadd src/main.c +set stal=2 +edit includes/minishell.h +set splitbelow splitright +wincmd _ | wincmd | +vsplit +1wincmd h +wincmd w +set nosplitbelow +set nosplitright +wincmd t +set winheight=1 winwidth=1 +exe 'vert 1resize ' . ((&columns * 79 + 79) / 158) +exe 'vert 2resize ' . ((&columns * 78 + 79) / 158) +argglobal +setlocal fdm=manual +setlocal fde=0 +setlocal fmr={{{,}}} +setlocal fdi=# +setlocal fdl=0 +setlocal fml=1 +setlocal fdn=20 +setlocal fen +silent! normal! zE +let s:l = 27 - ((25 * winheight(0) + 19) / 38) +if s:l < 1 | let s:l = 1 | endif +exe s:l +normal! zt +27 +normal! 049| +lcd ~/42/minishell +wincmd w +argglobal +edit ~/42/minishell/src/main.c +setlocal fdm=manual +setlocal fde=0 +setlocal fmr={{{,}}} +setlocal fdi=# +setlocal fdl=0 +setlocal fml=1 +setlocal fdn=20 +setlocal fen +silent! normal! zE +let s:l = 12 - ((10 * winheight(0) + 19) / 38) +if s:l < 1 | let s:l = 1 | endif +exe s:l +normal! zt +12 +normal! 023| +lcd ~/42/minishell +wincmd w +exe 'vert 1resize ' . ((&columns * 79 + 79) / 158) +exe 'vert 2resize ' . ((&columns * 78 + 79) / 158) +tabedit ~/42/minishell/src/ft_cmd.c +set splitbelow splitright +wincmd _ | wincmd | +vsplit +1wincmd h +wincmd w +set nosplitbelow +set nosplitright +wincmd t +set winheight=1 winwidth=1 +exe 'vert 1resize ' . ((&columns * 78 + 79) / 158) +exe 'vert 2resize ' . ((&columns * 79 + 79) / 158) +argglobal +setlocal fdm=manual +setlocal fde=0 +setlocal fmr={{{,}}} +setlocal fdi=# +setlocal fdl=0 +setlocal fml=1 +setlocal fdn=20 +setlocal fen +silent! normal! zE +let s:l = 31 - ((12 * winheight(0) + 19) / 38) +if s:l < 1 | let s:l = 1 | endif +exe s:l +normal! zt +31 +normal! 0 +lcd ~/42/minishell +wincmd w +argglobal +edit ~/42/minishell/src/lib_expansion.c +setlocal fdm=manual +setlocal fde=0 +setlocal fmr={{{,}}} +setlocal fdi=# +setlocal fdl=0 +setlocal fml=1 +setlocal fdn=20 +setlocal fen +silent! normal! zE +let s:l = 6 - ((5 * winheight(0) + 19) / 38) +if s:l < 1 | let s:l = 1 | endif +exe s:l +normal! zt +6 +normal! 0 +lcd ~/42/minishell +wincmd w +exe 'vert 1resize ' . ((&columns * 78 + 79) / 158) +exe 'vert 2resize ' . ((&columns * 79 + 79) / 158) +tabedit ~/42/minishell/src/builtin.c +set splitbelow splitright +wincmd _ | wincmd | +vsplit +1wincmd h +wincmd w +set nosplitbelow +set nosplitright +wincmd t +set winheight=1 winwidth=1 +exe 'vert 1resize ' . ((&columns * 78 + 79) / 158) +exe 'vert 2resize ' . ((&columns * 79 + 79) / 158) +argglobal +setlocal fdm=manual +setlocal fde=0 +setlocal fmr={{{,}}} +setlocal fdi=# +setlocal fdl=0 +setlocal fml=1 +setlocal fdn=20 +setlocal fen +silent! normal! zE +let s:l = 20 - ((19 * winheight(0) + 19) / 38) +if s:l < 1 | let s:l = 1 | endif +exe s:l +normal! zt +20 +normal! 032| +lcd ~/42/minishell +wincmd w +argglobal +edit ~/42/minishell/src/builtin_exit.c +setlocal fdm=manual +setlocal fde=0 +setlocal fmr={{{,}}} +setlocal fdi=# +setlocal fdl=0 +setlocal fml=1 +setlocal fdn=20 +setlocal fen +silent! normal! zE +let s:l = 8 - ((7 * winheight(0) + 19) / 38) +if s:l < 1 | let s:l = 1 | endif +exe s:l +normal! zt +8 +normal! 014| +lcd ~/42/minishell +wincmd w +2wincmd w +exe 'vert 1resize ' . ((&columns * 78 + 79) / 158) +exe 'vert 2resize ' . ((&columns * 79 + 79) / 158) +tabedit ~/42/minishell/src/lib_env.c +set splitbelow splitright +set nosplitbelow +set nosplitright +wincmd t +set winheight=1 winwidth=1 +argglobal +setlocal fdm=manual +setlocal fde=0 +setlocal fmr={{{,}}} +setlocal fdi=# +setlocal fdl=0 +setlocal fml=1 +setlocal fdn=20 +setlocal fen +silent! normal! zE +let s:l = 4 - ((3 * winheight(0) + 19) / 38) +if s:l < 1 | let s:l = 1 | endif +exe s:l +normal! zt +4 +normal! 0 +lcd ~/42/minishell +tabnext 3 +set stal=1 +if exists('s:wipebuf') + silent exe 'bwipe ' . s:wipebuf +endif +unlet! s:wipebuf +set winheight=1 winwidth=20 shortmess=filnxtToOc +let s:sx = expand(":p:r")."x.vim" +if file_readable(s:sx) + exe "source " . fnameescape(s:sx) +endif +let &so = s:so_save | let &siso = s:siso_save +let g:this_session = v:this_session +let g:this_obsession = v:this_session +let g:this_obsession_status = 2 +doautoall SessionLoadPost +unlet SessionLoad +" vim: set ft=vim : diff --git a/42sh/includes/minishell.h b/42sh/includes/minishell.h index 2d65a309..95538e56 100644 --- a/42sh/includes/minishell.h +++ b/42sh/includes/minishell.h @@ -15,16 +15,17 @@ typedef struct s_builtin extern t_builtin g_builtin[]; -int ft_cmd_exec(char *cmd); +int ft_cmd_process(char *cmd); +int ft_cmd_exec(char *execpath, char **argv, char ***env_p); char **ft_cmd_getav(char *cmd); -int ft_builtin_exec(char **av, char **env); -int builtin_echo(char **av, char **env); -int builtin_cd(char **av, char **env); -int builtin_exit(char **av, char **env); -int builtin_setenv(char **av, char **env); -int builtin_unsetenv(char **av, char **env); -int builtin_env(char **av, char **env); +int ft_builtin(char **av, char ***env); +int builtin_echo(char **av, char ***env); +int builtin_cd(char **av, char ***env); +int builtin_exit(char **av, char ***env); +int builtin_setenv(char **av, char ***env); +int builtin_unsetenv(char **av, char ***env); +int builtin_env(char **av, char ***env); void ft_expand_vars(char **av, char **env); char *ft_env_getval(char **env, char *key); diff --git a/42sh/libft b/42sh/libft index 70af533d..4e9b9eba 160000 --- a/42sh/libft +++ b/42sh/libft @@ -1 +1 @@ -Subproject commit 70af533db4c5a53646e2ea2e371d611cc9959f48 +Subproject commit 4e9b9eba0b3c38bba9543590c081c7fd33eeb2f5 diff --git a/42sh/src/builtin.c b/42sh/src/builtin.c index 6b10da42..02369ea5 100644 --- a/42sh/src/builtin.c +++ b/42sh/src/builtin.c @@ -10,7 +10,7 @@ t_builtin g_builtin[] = { {NULL, NULL}, }; -int ft_builtin_exec(char **av, char **env) +int ft_builtin(char **av, char ***env_p) { int i; @@ -19,39 +19,10 @@ int ft_builtin_exec(char **av, char **env) { if (ft_strcmp(g_builtin[i].name, *av) == 0) { - (g_builtin[i].f)(av, env); - return (0); + (g_builtin[i].f)(av, env_p); + return (1); } i++; } - return (1); -} - -int builtin_echo(char **av, char **env) -{ - (void)env; - av++; - while (*av) - { - ft_printf("%s", *av); - av++; - if (*av) - ft_putstr(" "); - } - ft_putendl(""); - return (0); -} - -int builtin_cd(char **av, char **env) -{ - (void)env; - ft_printf("builtin: %s\n", av[0]); - return (0); -} - -int builtin_exit(char **av, char **env) -{ - (void)env; - ft_printf("builtin: %s\n", av[0]); return (0); } diff --git a/42sh/src/builtin_cd.c b/42sh/src/builtin_cd.c new file mode 100644 index 00000000..2824a1b8 --- /dev/null +++ b/42sh/src/builtin_cd.c @@ -0,0 +1,8 @@ +#include "minishell.h" + +int builtin_cd(char **av, char ***env) +{ + (void)env; + ft_printf("builtin: %s\n", av[0]); + return (0); +} diff --git a/42sh/src/builtin_echo.c b/42sh/src/builtin_echo.c new file mode 100644 index 00000000..35272ee0 --- /dev/null +++ b/42sh/src/builtin_echo.c @@ -0,0 +1,16 @@ +#include "minishell.h" + +int builtin_echo(char **av, char ***env_p) +{ + (void)env_p; + av++; + while (*av) + { + ft_printf("%s", *av); + av++; + if (*av) + ft_putstr(" "); + } + ft_putchar('\n'); + return (0); +} diff --git a/42sh/src/builtin_env.c b/42sh/src/builtin_env.c index 5582431f..cdbc4469 100644 --- a/42sh/src/builtin_env.c +++ b/42sh/src/builtin_env.c @@ -1,22 +1,8 @@ #include "minishell.h" -int builtin_setenv(char **av, char **env) +int builtin_env(char **av, char ***env_p) { - (void)env; - ft_printf("builtin: %s\n", av[0]); - return (0); -} - -int builtin_unsetenv(char **av, char **env) -{ - (void)env; - ft_printf("builtin: %s\n", av[0]); - return (0); -} - -int builtin_env(char **av, char **env) -{ - (void)env; + (void)env_p; ft_printf("builtin: %s\n", av[0]); return (0); } diff --git a/42sh/src/builtin_exit.c b/42sh/src/builtin_exit.c new file mode 100644 index 00000000..514663a2 --- /dev/null +++ b/42sh/src/builtin_exit.c @@ -0,0 +1,15 @@ +#include "minishell.h" + +int builtin_exit(char **av, char ***env_p) +{ + int status; + + (void)env_p; + if (av[1]) + status = ft_atoi(av[1]); + else + status = ft_atoi(ft_env_getval(*env_p, "?")); + printf("exit status %i", status); + exit(status); + return (0); +} diff --git a/42sh/src/builtin_setenv.c b/42sh/src/builtin_setenv.c new file mode 100644 index 00000000..f051e568 --- /dev/null +++ b/42sh/src/builtin_setenv.c @@ -0,0 +1,29 @@ +#include "minishell.h" + +int builtin_setenv(char **av, char ***env_p) +{ + char *str; + char **env; + + env = *env_p; + if (ft_strcmp(av[0], "setenv") == 0) + av++; + if (!av[0]) + ft_sstrprint(*env_p, '\n'); + else + { + str = ft_str3join(av[0], "=", av[1]); + while (*env) + { + /* ft_printf("%s\n", env[i]); */ + if (ft_strcmp(*env, av[0]) == '=') + { + *env = str; + return (0); + } + env++; + } + *env_p = ft_sstradd(*env_p, str); + } + return (0); +} diff --git a/42sh/src/builtin_unsetenv.c b/42sh/src/builtin_unsetenv.c new file mode 100644 index 00000000..0e9370f7 --- /dev/null +++ b/42sh/src/builtin_unsetenv.c @@ -0,0 +1,8 @@ +#include "minishell.h" + +int builtin_unsetenv(char **av, char ***env) +{ + (void)env; + ft_printf("builtin: %s\n", av[0]); + return (0); +} diff --git a/42sh/src/ft_cmd.c b/42sh/src/ft_cmd.c index 989a18d2..fb119c66 100644 --- a/42sh/src/ft_cmd.c +++ b/42sh/src/ft_cmd.c @@ -1,34 +1,50 @@ #include "minishell.h" extern char **environ; -int ft_cmd_exec(char *cmd) +int ft_cmd_process(char *cmd) { - pid_t pid; - int status; char **path; char *execpath; char **argv; + /* path = NULL; */ + environ = ft_sstrdup(environ); path = ft_strsplit(ft_env_getval(environ, "PATH"), ':'); argv = ft_cmd_getav(cmd); ft_expand_vars(argv, environ); - if (ft_builtin_exec(argv, environ) == 0) + if (ft_builtin(argv, &environ)) return (0); else if (ft_strchr(argv[0], '/')) execpath = cmd; else if (!(execpath = ft_path_findexec(path, argv[0]))) return (-1); - /* ft_printf("%s @ %s\n", argv[0], execpath); */ + ft_printf("%s @ %s\n", argv[0], execpath); + return (ft_cmd_exec(execpath, argv, &environ)); +} + +int ft_cmd_exec(char *execpath, char **argv, char ***env_p) +{ + pid_t pid; + int status; + char **environ; + char **sstr; + + sstr = NULL; if (ft_path_access(execpath, argv[0])) return (-1); if ((pid = fork()) == -1) return (-1); else if (pid == 0) + { + environ = ft_sstrdup(*env_p); execve(execpath, argv, environ); + } else { wait(&status); - ft_printf("child process exited with %i\n", status); + sstr = ft_sstradd(sstr, "?"); + sstr = ft_sstradd(sstr, ft_itoa(status)); + builtin_setenv(sstr, env_p); } return (0); } diff --git a/42sh/src/main.c b/42sh/src/main.c index fc29fb75..6de49194 100644 --- a/42sh/src/main.c +++ b/42sh/src/main.c @@ -6,14 +6,10 @@ int main(void) while (1) { - ft_printf(SHELL_PROMPT); - /* if (get_next_line(0, &line) == 1) */ - /* continue ; */ - /* if (get_next_line(0, &line) == 0) */ - /* ft_cmd_exec(line); */ + ft_putstr(SHELL_PROMPT); if (get_next_line(0, &line) == -1) return (1); - ft_cmd_exec(line); + ft_cmd_process(line); } return (0); }