123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- /*
- * File: execute.c
- * Author: Arthur Brandao
- *
- * Created on 9 novembre 2018
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <wait.h>
- #include <string.h>
- #include "error.h"
- #include "execute.h"
- /* --- Extern --- */
- extern Error error;
- pid_t active = -1;
- pid_t last = -1;
- /* --- Fonctions publiques --- */
- boolean is_executable_file(const char * cmd) {
- int result;
- result = access(cmd, X_OK);
- if(result == ERR){
- return false;
- }
- return true;
- }
- int exec_shell(char* name, char** argv){
- pid_t pid;
- int result;
- //Fork pour l'exec
- pid = fork();
- if(pid == ERR){
- addperror("Erreur lors du fork pour la commande execvp");
- return EXIT_FAILURE;
- }
- //Fils
- else if(pid == 0){
- //Reset sortie erreur
- result = redirect_fd(STDERR, error.errfd);
- if(result == ERR){
- adderror("Impossible de redefinir la sortie d'erreur standard");
- exit(EXIT_FAILURE);
- }
- //Execute commande
- execvp(name, argv);
- //Si on arrive ici alors erreur
- char* errmsg = "Erreur dans le fichier execute.c, fonction exec_shell : Impossible d'executer la commande\n";
- if(write(result, errmsg, sizeof(char) * strlen(errmsg)) == ERR){
- addperror("Impossible d'écrire dans le fichier de log");
- }
- fprintf(stderr, "Commande introuvable\n");
- exit(EXIT_FAILURE);
- }
- //Pere
- active = pid;
- wait(&result);
- last = pid;
- active = -1;
- //Retourne retour fils
- if(WIFEXITED(result)){
- return WEXITSTATUS(result);
- }
- return EXIT_FAILURE;
- }
- int exec_file(char* name, char** argv){
- pid_t pid;
- int result;
- //Fork pour l'exec
- pid = fork();
- if(pid == ERR){
- addperror("Erreur lors du fork pour la commande execvp");
- return EXIT_FAILURE;
- }
- //Fils
- else if(pid == 0){
- //Reset sortie erreur
- result = redirect_fd(STDERR, error.errfd);
- if(result == ERR){
- adderror("Impossible de redefinir la sortie d'erreur standard");
- exit(EXIT_FAILURE);
- }
- //Execute commande
- execv(name, argv);
- //Si on arrive ici alors erreur
- addperror("Impossible d'executer la commande");
- exit(EXIT_FAILURE);
- }
- //Pere
- active = pid;
- wait(&result);
- last = pid;
- active = -1;
- //Retourne retour fils
- if(WIFEXITED(result)){
- return WEXITSTATUS(result);
- }
- return EXIT_FAILURE;
- }
|