|
@@ -12,9 +12,14 @@
|
|
#include <sys/types.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <fcntl.h>
|
|
|
|
+#include "error.h"
|
|
|
|
+#include "str.h"
|
|
#include "wildcard.h"
|
|
#include "wildcard.h"
|
|
#include "parser.h"
|
|
#include "parser.h"
|
|
|
|
|
|
|
|
+/* --- Extern --- */
|
|
|
|
+extern int serrno;
|
|
|
|
+
|
|
/* --- Fonctions privées --- */
|
|
/* --- Fonctions privées --- */
|
|
/**
|
|
/**
|
|
* Indique le nombre de commande dans une ligne
|
|
* Indique le nombre de commande dans une ligne
|
|
@@ -34,12 +39,14 @@ int nb_commands(char* line){
|
|
else if(*line == '|'){
|
|
else if(*line == '|'){
|
|
//Verif que ce n'est pas le dernier carac
|
|
//Verif que ce n'est pas le dernier carac
|
|
if(*(line + 1) == '\0'){
|
|
if(*(line + 1) == '\0'){
|
|
|
|
+ serrno = SEBADEND;
|
|
return SHELL_ERR;
|
|
return SHELL_ERR;
|
|
}
|
|
}
|
|
//Si un || on avance de 1 en plus
|
|
//Si un || on avance de 1 en plus
|
|
else if(*(line + 1) == '|'){
|
|
else if(*(line + 1) == '|'){
|
|
//Si à la fin de la chaine
|
|
//Si à la fin de la chaine
|
|
if(*(line + 2) == '\0'){
|
|
if(*(line + 2) == '\0'){
|
|
|
|
+ serrno = SEBADEND;
|
|
return SHELL_ERR;
|
|
return SHELL_ERR;
|
|
}
|
|
}
|
|
line++;
|
|
line++;
|
|
@@ -55,6 +62,7 @@ int nb_commands(char* line){
|
|
}
|
|
}
|
|
//Sinon il doit y avoir un vide pour etre le & du bck ou un > avant
|
|
//Sinon il doit y avoir un vide pour etre le & du bck ou un > avant
|
|
else if(*(line + 1) != '\0' && *(line - 1) != '>'){
|
|
else if(*(line + 1) != '\0' && *(line - 1) != '>'){
|
|
|
|
+ serrno = SEBADET;
|
|
return SHELL_ERR;
|
|
return SHELL_ERR;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -139,7 +147,8 @@ int set_io(Command* c, char* filename, int redir){
|
|
//Ouverture du fichier
|
|
//Ouverture du fichier
|
|
file = open(filename, O_CREAT | O_RDWR, S_IRWXU);
|
|
file = open(filename, O_CREAT | O_RDWR, S_IRWXU);
|
|
if(file == ERR){
|
|
if(file == ERR){
|
|
- perror("Erreur lors de l'ouverture du fichier pour la redirection : ");
|
|
|
|
|
|
+ addperror("Erreur lors de l'ouverture du fichier pour la redirection");
|
|
|
|
+ serrno = SEOPENF;
|
|
return SHELL_ERR;
|
|
return SHELL_ERR;
|
|
}
|
|
}
|
|
//Analyse dans quel descripteur il doit etre mis
|
|
//Analyse dans quel descripteur il doit etre mis
|
|
@@ -149,7 +158,7 @@ int set_io(Command* c, char* filename, int redir){
|
|
if(c->input != STDIN){
|
|
if(c->input != STDIN){
|
|
//On le ferme
|
|
//On le ferme
|
|
if(close(c->input) == -1){
|
|
if(close(c->input) == -1){
|
|
- perror("Erreur lors de la fermeture de l'ancien fichier de redirection : ");
|
|
|
|
|
|
+ addperror("Erreur lors de la fermeture de l'ancien fichier de redirection");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//Set nouveau fichier
|
|
//Set nouveau fichier
|
|
@@ -161,7 +170,7 @@ int set_io(Command* c, char* filename, int redir){
|
|
if(c->output != STDOUT){
|
|
if(c->output != STDOUT){
|
|
//On le ferme
|
|
//On le ferme
|
|
if(close(c->output) == -1){
|
|
if(close(c->output) == -1){
|
|
- perror("Erreur lors de la fermeture de l'ancien fichier de redirection : ");
|
|
|
|
|
|
+ addperror("Erreur lors de la fermeture de l'ancien fichier de redirection");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
c->output = file;
|
|
c->output = file;
|
|
@@ -175,7 +184,7 @@ int set_io(Command* c, char* filename, int redir){
|
|
if(c->error != STDERR){
|
|
if(c->error != STDERR){
|
|
//On le ferme
|
|
//On le ferme
|
|
if(close(c->error) == -1){
|
|
if(close(c->error) == -1){
|
|
- perror("Erreur lors de la fermeture de l'ancien fichier de redirection : ");
|
|
|
|
|
|
+ addperror("Erreur lors de la fermeture de l'ancien fichier de redirection");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
c->error = file;
|
|
c->error = file;
|
|
@@ -189,13 +198,13 @@ int set_io(Command* c, char* filename, int redir){
|
|
if(c->output != STDOUT){
|
|
if(c->output != STDOUT){
|
|
//On le ferme
|
|
//On le ferme
|
|
if(close(c->output) == -1){
|
|
if(close(c->output) == -1){
|
|
- perror("Erreur lors de la fermeture de l'ancien fichier de redirection : ");
|
|
|
|
|
|
+ addperror("Erreur lors de la fermeture de l'ancien fichier de redirection");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if(c->error != STDERR){
|
|
if(c->error != STDERR){
|
|
//On le ferme
|
|
//On le ferme
|
|
if(close(c->error) == -1){
|
|
if(close(c->error) == -1){
|
|
- perror("Erreur lors de la fermeture de l'ancien fichier de redirection : ");
|
|
|
|
|
|
+ addperror("Erreur lors de la fermeture de l'ancien fichier de redirection");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
c->output = file;
|
|
c->output = file;
|
|
@@ -206,6 +215,7 @@ int set_io(Command* c, char* filename, int redir){
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
default :
|
|
default :
|
|
|
|
+ serrno = SEREDIRTYPE;
|
|
return SHELL_ERR;
|
|
return SHELL_ERR;
|
|
}
|
|
}
|
|
//Si on arrive ici tous est ok
|
|
//Si on arrive ici tous est ok
|
|
@@ -229,6 +239,7 @@ int set_redirection(Command* c){
|
|
if(*buffer == '<'){
|
|
if(*buffer == '<'){
|
|
//Si il n'y a rien apres
|
|
//Si il n'y a rien apres
|
|
if(!(*(buffer + 1))){
|
|
if(!(*(buffer + 1))){
|
|
|
|
+ serrno = SEBADREDIR;
|
|
return SHELL_ERR;
|
|
return SHELL_ERR;
|
|
}
|
|
}
|
|
buffer++;
|
|
buffer++;
|
|
@@ -239,6 +250,7 @@ int set_redirection(Command* c){
|
|
else if (*buffer == '>'){
|
|
else if (*buffer == '>'){
|
|
//Si il n'y a rien apres
|
|
//Si il n'y a rien apres
|
|
if(!(*(buffer + 1))){
|
|
if(!(*(buffer + 1))){
|
|
|
|
+ serrno = SEBADREDIR;
|
|
return SHELL_ERR;
|
|
return SHELL_ERR;
|
|
} else {
|
|
} else {
|
|
buffer++;
|
|
buffer++;
|
|
@@ -246,6 +258,7 @@ int set_redirection(Command* c){
|
|
if(*buffer == '>'){
|
|
if(*buffer == '>'){
|
|
//Si il n'y a rien apres
|
|
//Si il n'y a rien apres
|
|
if(!(*(buffer + 1))){
|
|
if(!(*(buffer + 1))){
|
|
|
|
+ serrno = SEBADREDIR;
|
|
return SHELL_ERR;
|
|
return SHELL_ERR;
|
|
} else {
|
|
} else {
|
|
buffer++;
|
|
buffer++;
|
|
@@ -253,6 +266,7 @@ int set_redirection(Command* c){
|
|
if(*buffer == '&'){
|
|
if(*buffer == '&'){
|
|
//Si il n'y a rien apres
|
|
//Si il n'y a rien apres
|
|
if(!(*(buffer + 1))){
|
|
if(!(*(buffer + 1))){
|
|
|
|
+ serrno = SEBADREDIR;
|
|
return SHELL_ERR;
|
|
return SHELL_ERR;
|
|
}
|
|
}
|
|
buffer++;
|
|
buffer++;
|
|
@@ -268,6 +282,7 @@ int set_redirection(Command* c){
|
|
else if(*buffer == '&'){
|
|
else if(*buffer == '&'){
|
|
//Si il n'y a rien apres
|
|
//Si il n'y a rien apres
|
|
if(!(*(buffer + 1))){
|
|
if(!(*(buffer + 1))){
|
|
|
|
+ serrno = SEBADREDIR;
|
|
return SHELL_ERR;
|
|
return SHELL_ERR;
|
|
}
|
|
}
|
|
redir = SHELLRE_ALL;
|
|
redir = SHELLRE_ALL;
|
|
@@ -285,6 +300,7 @@ int set_redirection(Command* c){
|
|
buffer++;
|
|
buffer++;
|
|
//Si il n'y a rien apres
|
|
//Si il n'y a rien apres
|
|
if(!(*(buffer + 1))){
|
|
if(!(*(buffer + 1))){
|
|
|
|
+ serrno = SEBADREDIR;
|
|
return SHELL_ERR;
|
|
return SHELL_ERR;
|
|
} else {
|
|
} else {
|
|
buffer++;
|
|
buffer++;
|
|
@@ -293,6 +309,7 @@ int set_redirection(Command* c){
|
|
buffer++;
|
|
buffer++;
|
|
//Si il n'y a rien apres
|
|
//Si il n'y a rien apres
|
|
if(!(*(buffer + 1))){
|
|
if(!(*(buffer + 1))){
|
|
|
|
+ serrno = SEBADREDIR;
|
|
return SHELL_ERR;
|
|
return SHELL_ERR;
|
|
}
|
|
}
|
|
redir = SHELLR_ERR;
|
|
redir = SHELLR_ERR;
|
|
@@ -323,6 +340,7 @@ int set_redirection(Command* c){
|
|
return finCmd + 1;
|
|
return finCmd + 1;
|
|
}
|
|
}
|
|
//Sinon on est dans un redirection non terminée
|
|
//Sinon on est dans un redirection non terminée
|
|
|
|
+ serrno = SEBADCMD;
|
|
return SHELL_ERR;
|
|
return SHELL_ERR;
|
|
}
|
|
}
|
|
//Regarde si le nom du fichier est entre ""
|
|
//Regarde si le nom du fichier est entre ""
|
|
@@ -345,6 +363,7 @@ int set_redirection(Command* c){
|
|
}
|
|
}
|
|
//Si fin de la commande et guillemet alors erreur
|
|
//Si fin de la commande et guillemet alors erreur
|
|
if(!(*buffer) && guillemet){
|
|
if(!(*buffer) && guillemet){
|
|
|
|
+ serrno = SEBADCMD;
|
|
return SHELL_ERR;
|
|
return SHELL_ERR;
|
|
}
|
|
}
|
|
//Retire guillement si besoin
|
|
//Retire guillement si besoin
|
|
@@ -394,6 +413,7 @@ int split_command(Command* c, char* cmd){
|
|
if(*cmd == '"'){
|
|
if(*cmd == '"'){
|
|
//Verif que ce n'est pas la fin
|
|
//Verif que ce n'est pas la fin
|
|
if(!(*(cmd + 1))){
|
|
if(!(*(cmd + 1))){
|
|
|
|
+ serrno = SEBADCMD;
|
|
return SHELL_ERR;
|
|
return SHELL_ERR;
|
|
}
|
|
}
|
|
cmd++;
|
|
cmd++;
|
|
@@ -522,11 +542,13 @@ int parse_command(Command* c){
|
|
nbWildcard = wildcard(c->argv[i], nbWildcard, wildcardTab);
|
|
nbWildcard = wildcard(c->argv[i], nbWildcard, wildcardTab);
|
|
//Verif retour
|
|
//Verif retour
|
|
if(nbWildcard == ERR){
|
|
if(nbWildcard == ERR){
|
|
|
|
+ serrno = SEWC;
|
|
return SHELL_ERR;
|
|
return SHELL_ERR;
|
|
}
|
|
}
|
|
//Ajoute les wildcard dans argv (le +1 est la pour garder le NULL à la fin)
|
|
//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);
|
|
c->argv = insert_array(i, c->argv, c->argc + 1, wildcardTab, nbWildcard, &res);
|
|
if(res == ERR){
|
|
if(res == ERR){
|
|
|
|
+ serrno = SEADDWC;
|
|
return SHELL_ERR;
|
|
return SHELL_ERR;
|
|
}
|
|
}
|
|
c->argc = res - 1; //On ne compte pas le NULL final
|
|
c->argc = res - 1; //On ne compte pas le NULL final
|