-
Notifications
You must be signed in to change notification settings - Fork 0
/
shell.c
105 lines (97 loc) · 1.86 KB
/
shell.c
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
#include "minishell.h"
/**
* main - initial part of the simple shell
*
* @argc: number of arguments to main
* @argv: array with the arguments recieved
*
* Return: 0 always
*/
int main(int argc, char *argv[])
{
char *entry = NULL;
size_t n_bytes = 0;
int count = 0, inte = 1, retVal = 0;
(void) argc;
while (inte)
{
count++;
if (isatty(STDIN_FILENO) != 0)
write(STDOUT_FILENO, "#cisfun$ ", 9);
signal(SIGINT, sigfunc);
if (getline(&entry, &n_bytes, stdin) == EOF)
{
free(entry);
write(STDOUT_FILENO, "\n", isatty(STDIN_FILENO));
return (0);
}
entry = _null_char(entry);
conditions(argv[0], entry, &retVal, &count);
}
return (0);
}
/**
* conditions - checks conditions that main needs
*
* @argv: first agument of main
* @entry: string gotten from getline
* @retVal: Valor de retorno
* @count: n_ite
* Return: void
*/
void conditions(char *argv, char *entry, int *retVal, int *count)
{
int control = 1;
char *av[50];
struct stat st;
char *dir = NULL;
if (!speComs(entry, retVal))
control = 0;
_array_this(entry, av);
if (stat(av[0], &st) == 0)
{
create_child(av[0], av, retVal);
control = 0;
}
if (control)
dir = _searchpath(entry);
if (dir != NULL)
{
av[0] = dir;
create_child(av[0], av, retVal);
free(dir);
control = 0;
}
if (control)
{
_array_this(entry, av);
not_found(argv, *count, av[0], retVal);
}
}
/**
* create_child - executes a given command
*
* @route: route where the command is located
* @av: array where the route and arguments are stored
* @retVal: return of value
* Return: void
*/
void create_child(char *route, char **av, int *retVal)
{
pid_t child;
int status;
child = fork();
if (child == 0)
{
/*_array_this(entry, av);*/
if (execve(route, av, NULL) == -1)
exit(-1);
exit(0);
}
else
{
wait(&status);
if (WIFEXITED(status))
*retVal = WEXITSTATUS(status);
}
}