-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathhelp.c
More file actions
136 lines (112 loc) · 6.6 KB
/
Copy pathhelp.c
File metadata and controls
136 lines (112 loc) · 6.6 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
133
134
135
136
#include "dependencies.c"
void general_help(){
printf("\nIntegrantes: Alben Luis Urquiza Rojas y Karel Diaz Vergara del 212\n\n");
printf(Red"Importante: Esto es una lista de las cosas que no debes escribir en este shell:"RESET "\n");
printf(Red" No escribir parentesis(), ni llaves{}, ni corchetes[] con el objetivo de evitar un comportamiento inesperado.\n"RESET "\n");
printf(Red" Mientras se esta ejecutando el shell no se puede borrar el file_h.\n"RESET "\n");
printf(Blue"Funcionalidades:"RESET "\n");
printf("basic: funcionalidades basicas (3 puntos)\n");
printf("multi-pipe: multiples tuberias (1 punto)\n");
printf("help: ayuda (1 punto)\n");
printf("spaces: cualquier cantidad de espacios entre el comando y sus argumentos (0.5 puntos)\n");
printf("history: historial y sus funcionalidades (0.5 puntos)\n");
printf("ctrl+c: que el programa soporte el ctrl+c sin detenerse (0.5 puntos)\n");
printf("chain: soporta el encadenamiento de comandos (0.5 puntos)\n");
printf("if: soporta las condicionales (1 punto)\n");
printf("multi-if: soporta la anidacion de condiciones (0.5 puntos)\n");
printf("variables: declaracion, eliminacion y lista de variables globales (1 punto)\n");
printf("\n");
printf(Blue"Comandos built-in:"RESET"\n");
printf("cd: cambia de directorios\n");
printf("pwd: muestra el path del directorio en que se encuentra\n");
printf("exit: termina la ejecucion del shell\n");
printf("help: muestra esta ayuda\n");
printf("history: muestra las ultimas 10 lineas de commandos ejecutadas en este shell\n");
printf("again <number>: Ejecuta la linea <number> en el history, si esta linea no existe en el history pues \n mostraremos error al ejecutar el comando, <again> debe ser un numero entre el 1 y el\n 10 \'again\'\n");
printf("true: comando que retorna exit status 0\n");
printf("false: comando que retorna exit status 1\n");
printf("get <var>: si existe una variable asignada con el nombre <var> se mostrara su valor\n");
printf("set <var> <args>: creara una variable con el nombre <var> y su valor <args> en caso de que no exista,\n de lo contrario se modificara solo su valor.\n");
printf("unset <var>: Si existe una variable asignada con el nombre <var> sera eliminada.\n");
printf("\n");
printf("Keyword: if, multi-if\n");
printf(" Descripcion: Nuestro shell soporta la secuencia if then else end, donde el else es opcional\n");
printf(" y ademas soporta cualquier cantidad de if anidados.\n");
printf("Keyword: chain\n");
printf(" Descripcion: Funcionan todas las formas de encadenar comandos ya sea ; || &&\n");
printf("Keyword: Pipes\n");
printf(" Descripcion: En desarrollo\n");
printf("Keyword: Ctrl+C\n");
printf(" Descripcion: Cuando un proceso esta en ejecucion, al presionar Ctrl + C se le\n");
printf(" envia SIGINT, si este decide ignorarlo, pues en el proximo Ctrl+c\n");
printf(" presionado se le enviara al proceso SIGKILL\n");
printf("Keyword: Variables\n");
printf(" Descripcion: Declaracion, eliminacion y lista de variables globales.\n");
printf("\n" Blue "Para mas informacion buscar los detalles de cada una de estas funcionalidades"RESET"\n");
printf("help <func>: imprime la ayuda de la funcionalidad func, aqui una lista de las funcionalidades soportadas por el help:\n");
printf("\nTotal de puntos: 9.5 puntos\n\n");
}
int help(Command *input_process,int in,int out){
if(input_process->length_args == 1){
general_help();
return 0;
}
char *param = input_process->args[1];
if(strcmp(param, "ctrl+c") == 0){
printf(Blue"ctrl+c" RESET": Si se presiona \"ctrl+c\" y un proceso esta corriendo, se le manda un SIGINT, en caso de que el proceso rechace\n");
printf(" esta senal y se presione nuevamente ctrl+c se le mandara SIGKILL con el objetivo de detenerlo.\n");
printf("Nota: si no hay ningun proceso corriendo, no ocurre nada, y es ignorado el \"ctrl+c\".\n");
return 0;
}
else if(strcmp(param, "true") == 0){
printf(Blue"true"RESET ": corresponde a la ejecucion de un comando que su exit_status es 0.\n");
return 0;
}
else if(strcmp(param, "false") == 0){
printf(Blue"false"RESET ": corresponde a la ejecucion de un comando que su exit_status es 1.\n");
return 0;
}
else if(strcmp(param, "if") == 0){
printf(Blue"if, multi-if"RESET ": nuestro shell tiene la capacidad de procesar condiciones, veamos la estructura de un if:\n");
printf( Yellow"if"RESET " linea_de_comandos1 " Yellow"then "RESET "linea_de_comandos2 " Yellow "else " RESET "linea_de_comandos3 " Yellow "end"RESET "\n");
printf("Puede o no tener " Yellow "else " RESET "por ejemplo:\n");
printf( Yellow"if"RESET " linea_de_comandos1 " Yellow"then "RESET "linea_de_comandos2 " Yellow "end"RESET "\n");
printf("Entonces nuestro shell pasara a ejecutar linea_de_comandos1, si este tiene un exit_status igual a 0 entonces\n");
printf("pasara a ejecutarse linea_de_comandos2, en caso de que el exit_status de linea_de_comandos1 haya sido\n");
printf("distinto de 0 entonces se ejecutara linea_de_comandos3 siempre y cuando haya "Blue "else"RESET" en la condicion.\n");
printf("Nuestro shell soporta el anidamiento de condiciones\n");
return 0;
}
else if(strcmp(param, "cd") == 0){
printf(Blue"cd"RESET ": Cambia de directorio.\n");
return 0;
}
else if(strcmp(param, "pwd") == 0){
printf(Blue"pwd"RESET ": Muestra el path del directorio en el que se encuentra el shell.\n");
return 0;
}
else if(strcmp(param, "basic") == 0);
else if(strcmp(param, "multi-pipe") == 0);
else if(strcmp(param, "background") == 0);
else if(strcmp(param, "spaces") == 0);
else if(strcmp(param, "history") == 0);
else if(strcmp(param, "chain") == 0);
else if(strcmp(param, "variables") == 0);
else if(strcmp(param, "multi-if") == 0);
else{
printf(Red "No se encontro la ayuda para el comando: %s." RESET "\n", param);
return 1;
}
// fprintf(stderr,"LLEGO");
char *path_help = malloc(TAM_PATH);
strcpy(path_help,path_initial);
strcat(path_help,"/.help/");
strcat(path_help,param);
int fd = open(path_help,O_CREAT | O_RDONLY);
char *tmp = malloc(5);
while(read(fd,tmp,1) > 0){
write(out,tmp,1);
}
close(fd);
return 0;
}