Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions inc/builtin.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
/* ::: :::::::: */
/* builtin.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ttsubo <ttsubo@student.42.fr> +#+ +:+ +#+ */
/* By: dayano <dayano@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/13 17:19:01 by ttsubo #+# #+# */
/* Updated: 2025/04/21 11:20:16 by ttsubo ### ########.fr */
/* Updated: 2025/05/01 16:59:28 by dayano ### ########.fr */
/* */
/* ************************************************************************** */

Expand All @@ -15,15 +15,17 @@

# define PATH_MAX 4096

# include "struct.h"
# include "builtin_utils.h"
# include "struct.h"

typedef int (*t_builtin)(int argc, char *argv[], t_minish *minish);

int builtin_echo(int argc, char *argv[]);
int builtin_pwd(int argc, char *argv[]);
int builtin_exit(int argc, char *argv[]);
int builtin_cd(int argc, char *argv[]);
int builtin_env(int argc, char **argv, t_minish *minish);
int builtin_unset(int argc, char *argv[], t_minish *minish);
int builtin_export(int argc, char **argv, t_minish *minish);
int builtin_echo(int argc, char *argv[], t_minish *minish);
int builtin_pwd(int argc, char *argv[], t_minish *minish);
int builtin_exit(int argc, char *argv[], t_minish *minish);
int builtin_cd(int argc, char *argv[], t_minish *minish);
int builtin_env(int argc, char **argv, t_minish *minish);
int builtin_unset(int argc, char *argv[], t_minish *minish);
int builtin_export(int argc, char **argv, t_minish *minish);

#endif
7 changes: 4 additions & 3 deletions inc/builtin_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,17 @@
/* ::: :::::::: */
/* builtin_utils.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ttsubo <ttsubo@student.42.fr> +#+ +:+ +#+ */
/* By: dayano <dayano@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/20 19:47:50 by ttsubo #+# #+# */
/* Updated: 2025/04/29 14:48:10 by ttsubo ### ########.fr */
/* Updated: 2025/05/01 16:15:02 by dayano ### ########.fr */
/* */
/* ************************************************************************** */

#ifndef BUILTIN_UTILS_H
# define BUILTIN_UTILS_H

# include "struct.h"
# include <stdbool.h>
# include <stddef.h>

Expand All @@ -28,4 +29,4 @@ int export_exec(int argc, char **argv, t_minish *minish);
int print_sorted_env(t_env *head);
void export_err_invalid(char *sh, char *arg);

#endif
#endif
4 changes: 2 additions & 2 deletions inc/invoke_command.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
/* By: dayano <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/20 21:21:13 by dayano #+# #+# */
/* Updated: 2025/04/29 16:47:04 by dayano ### ########.fr */
/* Updated: 2025/05/01 16:38:55 by dayano ### ########.fr */
/* */
/* ************************************************************************** */

Expand All @@ -17,7 +17,7 @@
# include <stdbool.h>

int invoke_commands(t_cmd *cmd_head, t_minish *minish);
int exec_unit_builtin(t_cmd *cmd_head);
int exec_unit_builtin(t_cmd *cmd, t_minish *minish);

// wait_pipeline.c
int wait_pipeline(t_cmd *cmd_head);
Expand Down
7 changes: 4 additions & 3 deletions src/builtin/cd.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,18 @@
/* ::: :::::::: */
/* cd.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ttsubo <ttsubo@student.42.fr> +#+ +:+ +#+ */
/* By: dayano <dayano@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/14 11:12:37 by ttsubo #+# #+# */
/* Updated: 2025/04/20 19:53:11 by ttsubo ### ########.fr */
/* Updated: 2025/05/01 15:49:07 by dayano ### ########.fr */
/* */
/* ************************************************************************** */

#include "main.h"

int builtin_cd(int argc, char *argv[])
int builtin_cd(int argc, char *argv[], t_minish *minish)
{
(void)minish;
if (argc != 2)
return (error_mes(argv[0], "wrong argument"), EXIT_FAILURE);
if (chdir(argv[1]) < 0)
Expand Down
9 changes: 5 additions & 4 deletions src/builtin/echo.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@
/* ::: :::::::: */
/* echo.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ttsubo <ttsubo@student.42.fr> +#+ +:+ +#+ */
/* By: dayano <dayano@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/14 11:12:37 by ttsubo #+# #+# */
/* Updated: 2025/04/27 14:58:05 by ttsubo ### ########.fr */
/* Updated: 2025/05/01 15:48:48 by dayano ### ########.fr */
/* */
/* ************************************************************************** */

#include "main.h"

/**
* @brief Determines if the option is n only.
* @brief Determines if the option is n only.
*
* @param arg
* @return 0: Contains other than n
Expand Down Expand Up @@ -42,11 +42,12 @@ static int _has_only_n_option(char *arg)
* @param argv
* @return 0: Always returns 0.
*/
int builtin_echo(int argc, char *argv[])
int builtin_echo(int argc, char *argv[], t_minish *minish)
{
int i;
int nl_flg;

(void)minish;
i = 1;
nl_flg = 1;
while (i < argc)
Expand Down
7 changes: 4 additions & 3 deletions src/builtin/exit.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,18 @@
/* ::: :::::::: */
/* exit.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ttsubo <ttsubo@student.42.fr> +#+ +:+ +#+ */
/* By: dayano <dayano@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/13 21:20:48 by dayano #+# #+# */
/* Updated: 2025/04/20 19:53:29 by ttsubo ### ########.fr */
/* Updated: 2025/05/01 15:50:02 by dayano ### ########.fr */
/* */
/* ************************************************************************** */

#include "main.h"

int builtin_exit(int argc, char *argv[])
int builtin_exit(int argc, char *argv[], t_minish *minish)
{
(void)minish;
if (argc != 1)
return (error_mes(argv[0], "too many arguments"), EXIT_FAILURE);
if (printf("exit\n") < 0)
Expand Down
7 changes: 4 additions & 3 deletions src/builtin/pwd.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,20 @@
/* ::: :::::::: */
/* pwd.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ttsubo <ttsubo@student.42.fr> +#+ +:+ +#+ */
/* By: dayano <dayano@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/13 16:46:01 by dayano #+# #+# */
/* Updated: 2025/04/20 19:53:56 by ttsubo ### ########.fr */
/* Updated: 2025/05/01 15:49:32 by dayano ### ########.fr */
/* */
/* ************************************************************************** */

#include "main.h"

int builtin_pwd(int argc, char *argv[])
int builtin_pwd(int argc, char *argv[], t_minish *minish)
{
char pwd[PATH_MAX];

(void)minish;
if (argc != 1)
{
error_mes(argv[0], "wrong argument");
Expand Down
4 changes: 2 additions & 2 deletions src/invoke_cmd/exec_pipeline.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
/* By: dayano <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/21 13:14:15 by dayano #+# #+# */
/* Updated: 2025/04/29 16:52:01 by dayano ### ########.fr */
/* Updated: 2025/05/01 16:51:13 by dayano ### ########.fr */
/* */
/* ************************************************************************** */

Expand Down Expand Up @@ -57,7 +57,7 @@ static pid_t _fork_command(t_cmd *cmd, t_cmd *cmd_head, t_pipe_io *pipefds,
if ((cmd->next != NULL) && is_redirect(cmd->next))
redirect(cmd->next);
if (is_builtin(cmd))
exit(exec_unit_builtin(cmd));
exit(exec_unit_builtin(cmd, minish));
execute_cmd(cmd, minish);
print_error(cmd->argv[0]);
exit(EXIT_FAILURE);
Expand Down
62 changes: 54 additions & 8 deletions src/invoke_cmd/invoke_command.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
/* ::: :::::::: */
/* invoke_command.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: dayano <dayano@student.42.fr> +#+ +:+ +#+ */
/* By: ttsubo <ttsubo@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/20 21:19:33 by dayano #+# #+# */
/* Updated: 2025/04/28 21:37:53 by dayano ### ########.fr */
/* Updated: 2025/05/01 17:07:37 by ttsubo ### ########.fr */
/* */
/* ************************************************************************** */

Expand All @@ -23,8 +23,38 @@
*/
static bool is_unit_builtin(t_cmd *cmd_head)
{
(void)cmd_head;
return (false);
t_cmd *cmd;

cmd = cmd_head;
if (is_redirect(cmd))
cmd = cmd->next;
if ((is_builtin(cmd) && cmd->next == NULL) || (is_builtin(cmd)
&& is_redirect(cmd->next)))
return (true);
else
return (false);
}

static int _execute_builtin(t_cmd *cmd, t_minish *minish)
{
static const t_builtin builtin_funcs[] = {
builtin_echo, builtin_pwd, builtin_exit, builtin_cd,
builtin_env, builtin_export, builtin_unset, NULL
};
static char *builtin_list[] = {
"echo", "pwd", "exit", "cd",
"env", "export", "unset", NULL
};
int i;

i = 0;
while (builtin_list[i])
{
if (!ft_strcmp(cmd->argv[0], builtin_list[i]))
return (builtin_funcs[i](cmd->argc, cmd->argv, minish));
i++;
}
return (print_error(cmd->argv[0]), EXIT_FAILURE);
}

/**
Expand All @@ -35,10 +65,25 @@ static bool is_unit_builtin(t_cmd *cmd_head)
* @param cmd_head
* @return int
*/
int exec_unit_builtin(t_cmd *cmd_head)
int exec_unit_builtin(t_cmd *cmd, t_minish *minish)
{
(void)cmd_head;
return (0);
t_cmd *builtin_cmd;

builtin_cmd = cmd;
if (cmd && is_redirect(cmd))
{
redirect(cmd);
if (cmd->next)
{
cmd = cmd->next;
builtin_cmd = cmd;
}
else
return (print_error(cmd->argv[0]), EXIT_FAILURE);
}
if (cmd->next && is_redirect(cmd->next))
redirect(cmd->next);
return (_execute_builtin(builtin_cmd, minish));
}

/**
Expand All @@ -54,10 +99,11 @@ int invoke_commands(t_cmd *cmd_head, t_minish *minish)
int original_stdin;
int original_stdout;

status = 0;
original_stdin = dup(STDIN_FILENO);
original_stdout = dup(STDOUT_FILENO);
if (is_unit_builtin(cmd_head))
status = exec_unit_builtin(cmd_head);
status = exec_unit_builtin(cmd_head, minish);
else
{
exec_pipeline(cmd_head, minish);
Expand Down
27 changes: 23 additions & 4 deletions src/invoke_cmd/pipeline_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
/* ::: :::::::: */
/* pipeline_helper.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: dayano <dayano@student.42.fr> +#+ +:+ +#+ */
/* By: ttsubo <ttsubo@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/24 14:29:29 by dayano #+# #+# */
/* Updated: 2025/04/28 21:07:41 by dayano ### ########.fr */
/* Updated: 2025/05/01 17:08:00 by ttsubo ### ########.fr */
/* */
/* ************************************************************************** */

Expand All @@ -33,8 +33,27 @@ bool is_tail(t_cmd *cmd)
return (false);
}

bool is_builtin(t_cmd *cmd)
static bool str_in_list(char *cmd, char **list)
{
(void)cmd;
int i;

i = 0;
while (list[i])
{
if (!ft_strcmp(cmd, list[i]))
return (true);
i++;
}
return (false);
}

bool is_builtin(t_cmd *cmd)
{
static char *builtin_list[] = {
"echo", "pwd", "exit", "cd", "env", "export", "unset", NULL
};

if (!cmd || !cmd->argv || !cmd->argv[0])
return (false);
return (str_in_list(cmd->argv[0], builtin_list));
}