-
Notifications
You must be signed in to change notification settings - Fork 0
/
executor.c
115 lines (104 loc) · 1.97 KB
/
executor.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
106
107
108
109
110
111
112
113
114
115
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include "command.h"
#include "prompt.h"
#include "executor.h"
#include "builtins.h"
#include "aliases.h"
pid_t pid = -1;
int get_pid()
{
return pid;
}
int exec(Command *c)
{
if (c->argc == 0 || c->argv[0] == NULL)
{
return 0;
}
expand(c);
handle_aliases(c);
//print_cmds(c);
if (c->abort)
{
fprintf(stderr, "dsh: Aborting...\n");
return 0;
}
if (is_builtin(c))
{
handle_builtins(c);
}
else
{
pid = fork();
if (pid == 0) //child
{
handle_redirects(c);
handle_pipes(c);
execvp(c->argv[0], c->argv);
fprintf(stderr, "dsh: Command not found: %s\n", c->argv[0]);
exit(1);
}
if (!c->dont_wait)
{
int exit_code;
waitpid(pid, &exit_code, 0);
if (WIFEXITED(exit_code))
{
set_exit_code(WEXITSTATUS(exit_code));
}
pid = -1;
}
else
{
int status;
waitpid(-1, &status, WNOHANG);
}
if (c->pipe_in)
{
close(c->pipe_in);
c->pipe_in = 0;
}
if (c->pipe_out)
{
close(c->pipe_out);
c->pipe_out = 0;
}
}
return 1;
}
void run(Command *c)
{
if (c == NULL)
return;
int valid = 1;
Command *i = c;
while (i && valid)
{
if (i->pipe_to)
{
int pfds[2];
pipe(pfds);
i->pipe_out = pfds[1];
i->pipe_to->pipe_in = pfds[0];
}
if (i->dont_wait)
{
apply_dont_wait(i);
}
valid = exec(i);
i = next_cmd(i);
}
}
void signal_process(int signo)
{
if (pid > 0)
{
kill(pid, signo);
}
}