execute.c 2.2 KB

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