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
| //Bibliothèques
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
// Variables globales
int sec = 0, pid_parent = 0; //sec comptabilise les secondes, pid_parent le process ID
void timer() //Fonction qui va comptabiliser les secondes et couper au bout de 60 secondes
{
sec++;
if(sec == 60)
{
kill(pid_parent, 3);
}
else //si les secondes atteignent 60 on tue le processus sinon on augmente de 1 seconde
{
alarm(1);
}
}
int main()
{
int i = 0, bool = 1;
char afficherShell[100] = {"SHELL >"}; //Shell d'origine
char commandeSortie[100] = {"exit"}; //Contient la commande de sortie
char commandeTapee[100] = {""}; //Contient la commande tapée par l'utilisateur
// Bloc pour gerer le temps si l'utilisateur reste inactif
void (*pointeur)(); //Déclaration du pointeur pour la fonction de timer
pointeur = &timer; //Mise de l'adresse de la fonction dans le pointeur
signal(SIGALRM,pointeur);
alarm(1);
// Fin du bloc
while (bool == 1) //tant que Bool est egal à un on va faire tourner le programme
{
// Bloc d'affichage du Shell
printf("%s", afficherShell); //Affichage du Shell
gets(commandeTapee); //Récupération de la commande tapée
//Fin du bloc d'affichage du Shell
//Bloc qui va gérer le cas ou l'utilisateur entre le mot exit
if(strcmp(commandeTapee, commandeSortie) == 0)
{
bool = 0; //Mise à zero de bool et sortie de la boucle
}
//Fin du bloc de la gestion de la sortie
printf("Derniere commande tapee: %s\n",commandeTapee); //Affichage de la dernière commande tapée
//Bloc qui va gérer si l'utilisateur entre un Prompt
if (strstr(commandeTapee, "prompt"))
{
for (i=0; i<92; i++)
{
afficherShell[i] = commandeTapee[i+7]; //Supression de "prompt" ainsi que l'espace pour récupérer le nouveau shell.
}
}
//Fin du bloc prompt
//Bloc qui va executer les commandes Linux
else
{
int i =0,pos = 0, bool2 = 0, pid = 0, status =0, erreur = 0,execution_possible = 0;
char param[100], ligne[100],bin[100] = {"/bin/"};
strcpy (ligne,commandeTapee); // On va copier la commande entree dans ligne
for (i = 0; i < 100; i++)
{
if (ligne[i] == ' ') //Si la ligne entree contient un espace on va recuperer les arguments
{
pos = i;
for (i =pos; i < 100; i++)
{
ligne[pos] = ligne[i];
}
for (i =pos; i < 100; i++)
{
param[i-pos-1] = ligne[i];
}
bool2 = 1; //ici on met bool2 à 1 pour executer l'exec avec les paramètres
}
}
if(fork()) //Si fork on attend la fin
{
pid=wait(&status);
}
else
{
if (bool2 == 1) //Dans le cas ou l'on gère des paramètres
{
erreur = execlp(ligne, ligne, param,NULL);
if (erreur == -1) //Si la commande execlp retourne une erreur on affiche le message d'erreur
{
printf("Ce n'est pas une commande Linux valide!\n");
erreur = 0;
}
strcat( bin, ligne);
execution_possible = access(bin, 1);
if(execution_possible == -1)
{
printf("La commande n'est pas dans le /bin !\n");
}
}
else //Dans le cas ou l'on n'utilise pas de paramètres
{
erreur = execlp(ligne, ligne, NULL);
if (erreur == -1)
{
printf("Ce n'est pas une commande Linux valide\n");
erreur = 0;
}
strcat( bin, ligne);
execution_possible = access(bin, 1);
if(execution_possible == -1)
{
printf("La commande n'est pas dans le /bin !\n");
}
}
}
}
//Fin du bloc de gestion des commandes
if(strcmp(commandeTapee, commandeSortie) == 0)
{
bool = 0;
}
}
return 0;
} |
Partager