I've done my project ... for the moment
parent
20841218dc
commit
49ba17f549
28
mini_shell.c
28
mini_shell.c
|
@ -35,12 +35,14 @@ int main(int argc, char **argv, char **env)
|
||||||
// Boucle principale qui attend les commandes
|
// Boucle principale qui attend les commandes
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
if(UUID == 0)
|
if(UUID == 0) // Si l'utilisateur est root alors il a droit à son prompt personnalisé
|
||||||
printf("[ root ] %s # ", (char *) getenv("PWD"));
|
printf("[ root ] %s # ", (char *) getenv("PWD"));
|
||||||
else
|
else
|
||||||
printf("[ %s ] %s $ ",(char *) getenv("USER"), (char *) getenv("PWD"));
|
printf("[ %s ] %s $ ",(char *) getenv("USER"), (char *) getenv("PWD"));
|
||||||
|
|
||||||
arg1 = arg2 = arg3 = NULL;
|
arg1 = arg2 = arg3 = NULL;
|
||||||
commandeInterne = 0;
|
commandeInterne = 0;
|
||||||
|
|
||||||
lire(&arg1, &arg2, &arg3);
|
lire(&arg1, &arg2, &arg3);
|
||||||
|
|
||||||
if(arg1 != NULL)
|
if(arg1 != NULL)
|
||||||
|
@ -53,7 +55,7 @@ int main(int argc, char **argv, char **env)
|
||||||
}
|
}
|
||||||
if(strcmp(arg1, "exit") == 0)
|
if(strcmp(arg1, "exit") == 0)
|
||||||
{
|
{
|
||||||
commandeInterne = 1;
|
commandeInterne = 1; // Écrit simplement pour rester cohérent, mais un peu inutile :)
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
if(commandeInterne == 0)
|
if(commandeInterne == 0)
|
||||||
|
@ -156,7 +158,9 @@ void execution(char *arg1, char *arg2, char *arg3, char **env)
|
||||||
signal(SIGINT, quitter);
|
signal(SIGINT, quitter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(options);
|
if(options != NULL) free(options);
|
||||||
|
if(arg1 != NULL) free(arg1);
|
||||||
|
|
||||||
}
|
}
|
||||||
void changeDirectory(char * path)
|
void changeDirectory(char * path)
|
||||||
{
|
{
|
||||||
|
@ -193,16 +197,22 @@ void lire(char** arg1, char** arg2, char** arg3)
|
||||||
}
|
}
|
||||||
char *lireChaine3()
|
char *lireChaine3()
|
||||||
{
|
{
|
||||||
char *ptr, *ptr1;
|
char *ptr, *ptr1 = NULL;
|
||||||
int c;
|
int c;
|
||||||
int i=0;
|
int i=0;
|
||||||
int nb=10;
|
int nb=10;
|
||||||
|
|
||||||
ptr=malloc(nb);
|
ptr = malloc(nb);
|
||||||
assert(ptr);
|
assert(ptr);
|
||||||
|
|
||||||
while((c=getchar()) != '\n' && c != EOF)
|
while((c=getchar()) != '\n' )
|
||||||
{
|
{
|
||||||
|
// Si on envoit EOF (^D) alors on quitte le shell (comme sur les shells qu'on utilise habituellement)
|
||||||
|
if(c == EOF)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
if (i==nb-1)
|
if (i==nb-1)
|
||||||
{
|
{
|
||||||
ptr1=malloc(nb=nb*2);
|
ptr1=malloc(nb=nb*2);
|
||||||
|
@ -228,6 +238,7 @@ char *lireChaine3()
|
||||||
free(ptr);
|
free(ptr);
|
||||||
ptr=ptr1;
|
ptr=ptr1;
|
||||||
}
|
}
|
||||||
|
ptr1 = NULL;
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
void erreur(char *s)
|
void erreur(char *s)
|
||||||
|
@ -247,14 +258,13 @@ void executionPipe(char *arg1, char *arg3, char **env)
|
||||||
{
|
{
|
||||||
int pipefd[2];
|
int pipefd[2];
|
||||||
pipe(pipefd);
|
pipe(pipefd);
|
||||||
int fd0, fd2, pid;
|
int pid2;
|
||||||
FILE * fd00, *fd01, *fd02;
|
|
||||||
|
|
||||||
char ** options = malloc(sizeof(char *)*3);
|
char ** options = malloc(sizeof(char *)*3);
|
||||||
options[0] = arg1;
|
options[0] = arg1;
|
||||||
options[1] = NULL;
|
options[1] = NULL;
|
||||||
|
|
||||||
if((pid = fork()) == 0) // Dans le fils : exécution de la première commande
|
if((pid2 = fork()) == 0) // Dans le fils : exécution de la première commande
|
||||||
{
|
{
|
||||||
close(pipefd[0]);
|
close(pipefd[0]);
|
||||||
close(1); dup(pipefd[1]);
|
close(1); dup(pipefd[1]);
|
||||||
|
|
Loading…
Reference in New Issue