| 12
 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