execute.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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 "error.h"
  13. #include "execute.h"
  14. /* --- Extern --- */
  15. extern Error error;
  16. pid_t active = -1;
  17. pid_t last = -1;
  18. /* --- Fonctions publiques --- */
  19. boolean is_executable_file(const char * cmd) {
  20. int result;
  21. result = access(cmd, X_OK);
  22. if(result == ERR){
  23. return false;
  24. }
  25. return true;
  26. }
  27. int exec_shell(char* name, char** argv){
  28. pid_t pid;
  29. int result;
  30. //Fork pour l'exec
  31. pid = fork();
  32. if(pid == ERR){
  33. addperror("Erreur lors du fork pour la commande execvp");
  34. return EXIT_FAILURE;
  35. }
  36. //Fils
  37. else if(pid == 0){
  38. //Reset sortie erreur
  39. result = redirect_fd(STDERR, error.errfd);
  40. if(result == ERR){
  41. adderror("Impossible de redefinir la sortie d'erreur standard");
  42. exit(EXIT_FAILURE);
  43. }
  44. //Execute commande
  45. execvp(name, argv);
  46. //Si on arrive ici alors erreur
  47. addperror("Impossible d'executer la commande");
  48. exit(EXIT_FAILURE);
  49. }
  50. //Pere
  51. active = pid;
  52. wait(&result);
  53. last = pid;
  54. active = -1;
  55. //Retourne retour fils
  56. if(WIFEXITED(result)){
  57. return WEXITSTATUS(result);
  58. }
  59. return EXIT_FAILURE;
  60. }
  61. int exec_file(char* name, char** argv){
  62. pid_t pid;
  63. int result;
  64. //Fork pour l'exec
  65. pid = fork();
  66. if(pid == ERR){
  67. addperror("Erreur lors du fork pour la commande execvp");
  68. return EXIT_FAILURE;
  69. }
  70. //Fils
  71. else if(pid == 0){
  72. //Reset sortie erreur
  73. result = redirect_fd(STDERR, error.errfd);
  74. if(result == ERR){
  75. adderror("Impossible de redefinir la sortie d'erreur standard");
  76. exit(EXIT_FAILURE);
  77. }
  78. //Execute commande
  79. execv(name, argv);
  80. //Si on arrive ici alors erreur
  81. addperror("Impossible d'executer la commande");
  82. exit(EXIT_FAILURE);
  83. }
  84. //Pere
  85. active = pid;
  86. wait(&result);
  87. last = pid;
  88. active = -1;
  89. //Retourne retour fils
  90. if(WIFEXITED(result)){
  91. return WEXITSTATUS(result);
  92. }
  93. return EXIT_FAILURE;
  94. }