|
@@ -16,6 +16,9 @@
|
|
|
#include "wildcard.h"
|
|
|
#include "parser.h"
|
|
|
|
|
|
+/* --- Extern --- */
|
|
|
+extern int serrorno;
|
|
|
+
|
|
|
/* --- Fonctions privées --- */
|
|
|
/**
|
|
|
* Indique le nombre de commande dans une ligne
|
|
@@ -35,12 +38,14 @@ int nb_commands(char* line){
|
|
|
else if(*line == '|'){
|
|
|
//Verif que ce n'est pas le dernier carac
|
|
|
if(*(line + 1) == '\0'){
|
|
|
+ serrorno = SEBADEND;
|
|
|
return SHELL_ERR;
|
|
|
}
|
|
|
//Si un || on avance de 1 en plus
|
|
|
else if(*(line + 1) == '|'){
|
|
|
//Si à la fin de la chaine
|
|
|
if(*(line + 2) == '\0'){
|
|
|
+ serrorno = SEBADEND;
|
|
|
return SHELL_ERR;
|
|
|
}
|
|
|
line++;
|
|
@@ -56,6 +61,7 @@ int nb_commands(char* line){
|
|
|
}
|
|
|
//Sinon il doit y avoir un vide pour etre le & du bck ou un > avant
|
|
|
else if(*(line + 1) != '\0' && *(line - 1) != '>'){
|
|
|
+ serrorno = SEBADET;
|
|
|
return SHELL_ERR;
|
|
|
}
|
|
|
}
|
|
@@ -141,6 +147,7 @@ int set_io(Command* c, char* filename, int redir){
|
|
|
file = open(filename, O_CREAT | O_RDWR, S_IRWXU);
|
|
|
if(file == ERR){
|
|
|
perror("Erreur lors de l'ouverture du fichier pour la redirection : ");
|
|
|
+ serrorno = SEOPENF;
|
|
|
return SHELL_ERR;
|
|
|
}
|
|
|
//Analyse dans quel descripteur il doit etre mis
|
|
@@ -207,6 +214,7 @@ int set_io(Command* c, char* filename, int redir){
|
|
|
}
|
|
|
break;
|
|
|
default :
|
|
|
+ serrorno = SEREDIRTYPE;
|
|
|
return SHELL_ERR;
|
|
|
}
|
|
|
//Si on arrive ici tous est ok
|
|
@@ -230,6 +238,7 @@ int set_redirection(Command* c){
|
|
|
if(*buffer == '<'){
|
|
|
//Si il n'y a rien apres
|
|
|
if(!(*(buffer + 1))){
|
|
|
+ serrorno = SEBADREDIR;
|
|
|
return SHELL_ERR;
|
|
|
}
|
|
|
buffer++;
|
|
@@ -240,6 +249,7 @@ int set_redirection(Command* c){
|
|
|
else if (*buffer == '>'){
|
|
|
//Si il n'y a rien apres
|
|
|
if(!(*(buffer + 1))){
|
|
|
+ serrorno = SEBADREDIR;
|
|
|
return SHELL_ERR;
|
|
|
} else {
|
|
|
buffer++;
|
|
@@ -247,6 +257,7 @@ int set_redirection(Command* c){
|
|
|
if(*buffer == '>'){
|
|
|
//Si il n'y a rien apres
|
|
|
if(!(*(buffer + 1))){
|
|
|
+ serrorno = SEBADREDIR;
|
|
|
return SHELL_ERR;
|
|
|
} else {
|
|
|
buffer++;
|
|
@@ -254,6 +265,7 @@ int set_redirection(Command* c){
|
|
|
if(*buffer == '&'){
|
|
|
//Si il n'y a rien apres
|
|
|
if(!(*(buffer + 1))){
|
|
|
+ serrorno = SEBADREDIR;
|
|
|
return SHELL_ERR;
|
|
|
}
|
|
|
buffer++;
|
|
@@ -269,6 +281,7 @@ int set_redirection(Command* c){
|
|
|
else if(*buffer == '&'){
|
|
|
//Si il n'y a rien apres
|
|
|
if(!(*(buffer + 1))){
|
|
|
+ serrorno = SEBADREDIR;
|
|
|
return SHELL_ERR;
|
|
|
}
|
|
|
redir = SHELLRE_ALL;
|
|
@@ -286,6 +299,7 @@ int set_redirection(Command* c){
|
|
|
buffer++;
|
|
|
//Si il n'y a rien apres
|
|
|
if(!(*(buffer + 1))){
|
|
|
+ serrorno = SEBADREDIR;
|
|
|
return SHELL_ERR;
|
|
|
} else {
|
|
|
buffer++;
|
|
@@ -294,6 +308,7 @@ int set_redirection(Command* c){
|
|
|
buffer++;
|
|
|
//Si il n'y a rien apres
|
|
|
if(!(*(buffer + 1))){
|
|
|
+ serrorno = SEBADREDIR;
|
|
|
return SHELL_ERR;
|
|
|
}
|
|
|
redir = SHELLR_ERR;
|
|
@@ -324,6 +339,7 @@ int set_redirection(Command* c){
|
|
|
return finCmd + 1;
|
|
|
}
|
|
|
//Sinon on est dans un redirection non terminée
|
|
|
+ serrorno = SEBADCMD;
|
|
|
return SHELL_ERR;
|
|
|
}
|
|
|
//Regarde si le nom du fichier est entre ""
|
|
@@ -346,6 +362,7 @@ int set_redirection(Command* c){
|
|
|
}
|
|
|
//Si fin de la commande et guillemet alors erreur
|
|
|
if(!(*buffer) && guillemet){
|
|
|
+ serrorno = SEBADCMD;
|
|
|
return SHELL_ERR;
|
|
|
}
|
|
|
//Retire guillement si besoin
|
|
@@ -395,6 +412,7 @@ int split_command(Command* c, char* cmd){
|
|
|
if(*cmd == '"'){
|
|
|
//Verif que ce n'est pas la fin
|
|
|
if(!(*(cmd + 1))){
|
|
|
+ serrorno = SEBADCMD;
|
|
|
return SHELL_ERR;
|
|
|
}
|
|
|
cmd++;
|
|
@@ -523,11 +541,13 @@ int parse_command(Command* c){
|
|
|
nbWildcard = wildcard(c->argv[i], nbWildcard, wildcardTab);
|
|
|
//Verif retour
|
|
|
if(nbWildcard == ERR){
|
|
|
+ serrorno = SEWC;
|
|
|
return SHELL_ERR;
|
|
|
}
|
|
|
//Ajoute les wildcard dans argv (le +1 est la pour garder le NULL à la fin)
|
|
|
c->argv = insert_array(i, c->argv, c->argc + 1, wildcardTab, nbWildcard, &res);
|
|
|
if(res == ERR){
|
|
|
+ serrorno = SEADDWC;
|
|
|
return SHELL_ERR;
|
|
|
}
|
|
|
c->argc = res - 1; //On ne compte pas le NULL final
|