aboutsummaryrefslogtreecommitdiff
path: root/include/minishell.h
blob: e111119e3a221bf0c4543b760aeb9c9d3c37b373 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   minishell.h                                        :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: cacharle <marvin@42.fr>                    +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2020/02/26 15:33:51 by cacharle          #+#    #+#             */
/*   Updated: 2020/10/07 11:20:46 by cacharle         ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#ifndef MINISHELL_H
# define MINISHELL_H
#include <stdio.h>  // for debugging - dont remove

/*
** \file   minishell.h
** \brief  Common header
*/

# include <stdlib.h>
# include <string.h>
# include <unistd.h>
# include <fcntl.h>
# include <dirent.h>
# include <sys/wait.h>
# include <signal.h>
# include <sys/stat.h>
# include <stdbool.h>
# include <stdarg.h>

# include "libft.h"
# include "libft_ht.h"
# include "libft_lst.h"
# include "libft_util.h"
# include "libft_vec.h"
# include "libft_dstr.h"

# include "lexer.h"
# include "error.h"

/*
** \brief  Value of pipe entry if closed
*/

# define PIPE_CLOSED -1

# define BUILTIN_NOT_FOUND -2

typedef t_ftvec*	t_env;

/*
** \note  Having a fixed size buffer for pids should be fine
**        as long as it's greater than the process hard limit
*/

# define STATE_PIDS_MAX_SIZE 4096

typedef struct
{
	int				last_status;
	char			*progname;
	pid_t			pids[STATE_PIDS_MAX_SIZE];
	size_t			pids_len;
}					t_state;

extern t_state		g_state;

/*
** path.c
*/

int					path_search(t_env env, char *exec_name, char exec_path[PATH_MAX + 1], bool print);

/*
** env.c
*/

t_env				env_from_array(char **envp);
char				*env_search(t_env env, char *key, size_t *found_index);
char				*env_export(t_env env, char *key, char *value);
char				*env_search_first_match(t_env env, const char *haystack);
size_t				env_key_len(char *key, bool allow_status);

/*
** builtin*.c - directory with all builtin commands
*/

/*
** \brief       Type of a builtin main function
*/

typedef int			(*t_builtin_func)(char **argv, t_env env);

/*
** \brief       Entry of builtin lookup array
** \param name  Executable name of builtin
** \param func  Associated function
*/

typedef struct
{
	char			*name;
	t_builtin_func	func;
	bool			forked;
}					t_builtin_entry;

t_builtin_entry		*builtin_search_func(char *name);

int					builtin_echo(char **argv, t_env env);
int					builtin_cd(char **argv, t_env env);
int					builtin_pwd(char **argv, t_env env);
int					builtin_export(char **argv, t_env env);
int					builtin_unset(char **argv, t_env env);
int					builtin_env(char **argv, t_env env);
int					builtin_exit(char **argv, t_env env);

/*
** preprocess.c
*/

char				**preprocess(t_tok_lst **tokens, t_env env);
int					preprocess_filename(t_tok_lst **tokens, t_env env, char **filename);

/*
** signal.c
*/

void				signal_sigint(int signum);
void				signal_sigquit(int signum);
void				signal_sigterm(int signum);

/*
** utils.c
*/

void				print_prompt(void);

/*
** setup.c
*/

bool				setup(char *first_arg, t_env env);

#endif