execute.c 2.1 KB

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