execute.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * File: execute.c
  3. * Author: Arthur Brandao
  4. *
  5. * Created on 9 novembre 2018
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <unistd.h>
  10. #include <sys/types.h>
  11. #include <wait.h>
  12. #include <string.h>
  13. #include "error.h"
  14. #include "execute.h"
  15. /* --- Extern --- */
  16. extern Error error;
  17. pid_t active = -1;
  18. pid_t last = -1;
  19. /* --- Fonctions publiques --- */
  20. boolean is_executable_file(const char * cmd) {
  21. int result;
  22. result = access(cmd, X_OK);
  23. if(result == ERR){
  24. return false;
  25. }
  26. return true;
  27. }
  28. int exec_shell(char* name, char** argv){
  29. pid_t pid;
  30. int result;
  31. //Fork pour l'exec
  32. pid = fork();
  33. if(pid == ERR){
  34. addperror("Erreur lors du fork pour la commande execvp");
  35. return EXIT_FAILURE;
  36. }
  37. //Fils
  38. else if(pid == 0){
  39. //Reset sortie erreur
  40. result = redirect_fd(STDERR, error.errfd);
  41. if(result == ERR){
  42. adderror("Impossible de redefinir la sortie d'erreur standard");
  43. exit(EXIT_FAILURE);
  44. }
  45. //Execute commande
  46. execvp(name, argv);
  47. //Si on arrive ici alors erreur
  48. char* errmsg = "Erreur dans le fichier execute.c, fonction exec_shell : Impossible d'executer la commande\n";
  49. if(write(result, errmsg, sizeof(char) * strlen(errmsg)) == ERR){
  50. addperror("Impossible d'écrire dans le fichier de log");
  51. }
  52. fprintf(stderr, "Commande introuvable\n");
  53. exit(EXIT_FAILURE);
  54. }
  55. //Pere
  56. active = pid;
  57. wait(&result);
  58. last = pid;
  59. active = -1;
  60. //Retourne retour fils
  61. if(WIFEXITED(result)){
  62. return WEXITSTATUS(result);
  63. }
  64. return EXIT_FAILURE;
  65. }
  66. int exec_file(char* name, char** argv){
  67. pid_t pid;
  68. int result;
  69. //Fork pour l'exec
  70. pid = fork();
  71. if(pid == ERR){
  72. addperror("Erreur lors du fork pour la commande execvp");
  73. return EXIT_FAILURE;
  74. }
  75. //Fils
  76. else if(pid == 0){
  77. //Reset sortie erreur
  78. result = redirect_fd(STDERR, error.errfd);
  79. if(result == ERR){
  80. adderror("Impossible de redefinir la sortie d'erreur standard");
  81. exit(EXIT_FAILURE);
  82. }
  83. //Execute commande
  84. execv(name, argv);
  85. //Si on arrive ici alors erreur
  86. addperror("Impossible d'executer la commande");
  87. exit(EXIT_FAILURE);
  88. }
  89. //Pere
  90. active = pid;
  91. wait(&result);
  92. last = pid;
  93. active = -1;
  94. //Retourne retour fils
  95. if(WIFEXITED(result)){
  96. return WEXITSTATUS(result);
  97. }
  98. return EXIT_FAILURE;
  99. }