-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.c
More file actions
132 lines (116 loc) · 3.29 KB
/
Copy pathmain.c
File metadata and controls
132 lines (116 loc) · 3.29 KB
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
#include "builtin.h"
#include "history.h"
#include "prompt.h"
#include "shell.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main() {
char cmdLine[MAX] = {0}; // Linea a ejecutar
int setStdout =
dup(1); // Definir entrada y salida estándar para empezar la ejecución
int setStdin = dup(0);
char *originalCmd =
NULL; // Aquí se guardara la cadena recibida sin ningúna modificación
struct cmdInfo *cmd_info = (struct cmdInfo *)malloc(
sizeof(struct cmdInfo)); // Aquí se guardarán las informaciones
// relacionadas a la ejecución de la shell
readHistory(cmd_info); // Cargar del archivo history.log el history
while (1) {
// Restablecer entrada y salida estándar
close(1);
dup(setStdout);
close(0);
dup(setStdin);
// si el comando ejecutado terminó satisfactoriamente se añade a history
if (cmd_info->runtime_error == 0 && originalCmd != NULL &&
originalCmd[0] != ' ' && originalCmd[0] != '\n') {
updateHistory(originalCmd, cmd_info);
}
// prompt y lee nuevo comando
printPrompt();
fgets(cmdLine, MAX, stdin);
// guarda la cadena original
originalCmd = (char *)malloc(strlen(cmdLine) + 1);
strcpy(originalCmd, cmdLine);
int br = 0;
int cont = 0;
while (1) {
// si se recibe esto no sucede nada
if (cmdLine[0] == '\n') {
cont = 1;
break;
}
if (cmdLine[0] == '#') {
cmd_info->runtime_error = 0;
cont = 1;
break;
}
// Cerrar Shell
if (strncmp(cmdLine, "exit\n", 5) == 0) {
updateHistory(originalCmd, cmd_info);
writeHistory(cmd_info);
free(originalCmd);
br = 1;
break;
}
// Cambiar de directorio
if (strncmp(cmdLine, "cd", 2) == 0) {
if (cmdLine[2] == ' ' || cmdLine[2] == '\n') {
changeDir(cmdLine, cmd_info);
cont = 1;
break;
}
}
// Mostrar history
if (strncmp(cmdLine, "history\n", 8) == 0) {
updateHistory(originalCmd, cmd_info);
printHistory(cmd_info);
cont = 1;
break;
}
// Ejecutar último comando nuevamente
if (strncmp(cmdLine, "again", 4) == 0) {
originalCmd = runAgain(cmdLine, cmd_info);
if (originalCmd == NULL) {
printf("Numero de comando fuera de rango\n");
cont = 1;
break;
}
strcpy(cmdLine, originalCmd);
continue;
}
if (strncmp(cmdLine, "jobs", 4) == 0) {
print_jobs();
cont = 1;
break;
}
if (strncmp(cmdLine, "fg", 2) == 0) {
char *pointer = strchr(cmdLine, ' ');
if (pointer == NULL) {
printf("No se especificó un PID\n");
break;
}
int number = (int)strtol(pointer + 1, NULL, 10);
wait_job(number);
cont = 1;
break;
}
break;
}
if (cont) {
continue;
}
if (br) {
break;
}
// En caso de q no se ejecute ningún comando built in, se pasará a la
// ejecución del comando
execute(cmdLine, cmd_info);
continue;
}
// cuando termina la ejecución se exporta el history a history.log
writeHistory(cmd_info);
exit(EXIT_SUCCESS);
}