command.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /*
  2. * File: command.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 "error.h"
  11. #include "str.h"
  12. #include "parser.h"
  13. #include "command.h"
  14. /* --- Extern --- */
  15. extern Error error;
  16. char* cmdlist[3] = {
  17. "cd",
  18. "exit",
  19. NULL
  20. };
  21. boolean exitsh = false;
  22. /* --- Fonctions publiques --- */
  23. void ini_pid_list(pid_list* pl) {
  24. pl->first = NULL;
  25. pl->last = NULL;
  26. }
  27. pid_node* add_pid(pid_list* pl, pid_t pid, int job) {
  28. pid_node* pn = malloc(sizeof (pid_node));
  29. pn->pid = pid;
  30. pn->job = job;
  31. pn->next = NULL;
  32. if (pl->first == NULL) {
  33. pn->prev = NULL;
  34. pl->first = pn;
  35. pl->last = pn;
  36. } else {
  37. pn->prev = pl->last;
  38. pl->last->next = pn;
  39. pl->last = pn;
  40. }
  41. return pn;
  42. }
  43. pid_node* search_pid(pid_list* pl, pid_t pid) {
  44. pid_node* pn = pl->first;
  45. while (pn != NULL) {
  46. if (pn->pid == pid) {
  47. return pn;
  48. }
  49. pn = pn->next;
  50. }
  51. return NULL;
  52. }
  53. void remove_pid(pid_list* pl, pid_node* pn) {
  54. //Si 1er et seul
  55. if (pn->prev == NULL && pn->next == NULL) {
  56. pl->first = NULL;
  57. pl->last = NULL;
  58. }
  59. //Si 1er et non seul
  60. else if (pn->prev == NULL && pn->next != NULL) {
  61. pn->next->prev = NULL;
  62. pl->first = pn->next;
  63. }
  64. //Si dernier
  65. else if (pn->next == NULL) {
  66. pn->prev->next = NULL;
  67. pl->last = pn->prev;
  68. }
  69. //Sinon si il est au milieu
  70. else {
  71. pn->prev->next = pn->next;
  72. pn->next->prev = pn->prev;
  73. }
  74. //Free
  75. free(pn);
  76. }
  77. void clean_pid(pid_list* pl) {
  78. pid_node* tmp, * pn = pl->first;
  79. while (pn != NULL) {
  80. tmp = pn->next;
  81. free(pn);
  82. pn = tmp;
  83. }
  84. pl->first = NULL;
  85. pl->last = NULL;
  86. }
  87. boolean is_internal_cmd(const char* cmd) {
  88. //Parcours tableau pour trouver correspondance
  89. for (int i = 0; cmdlist[i] != NULL; i++) {
  90. if (strncmp(cmd, cmdlist[i], strlen(cmd)) == 0) {
  91. return true;
  92. }
  93. }
  94. return false;
  95. }
  96. int launch_internal_command(Command* cmd) {
  97. int result, length = strlen(cmd->name) + 1;
  98. //cd
  99. if (strncmp(cmd->name, cmdlist[0], length) == 0) {
  100. result = cd(cmd->argc, cmd->argv);
  101. return result;
  102. }
  103. //exit
  104. else if (strncmp(cmd->name, cmdlist[1], length) == 0) {
  105. result = exit_sh(cmd->argc, cmd->argv);
  106. return result;
  107. }
  108. //Aucune commande
  109. else {
  110. return SHELL_FAIL;
  111. }
  112. }
  113. /* --- Commandes --- */
  114. int cd(int argc, char** argv) {
  115. //Si trop d'arguments
  116. if (argc > 2) {
  117. error.print("too many arguments : 1 required, %d given\n", argc - 1);
  118. return EXIT_FAILURE;
  119. } else {
  120. //Si aucun argument on va à la racine
  121. if (argc == 1) {
  122. if (chdir("/") == ERR) {
  123. addperror("Erreur chdir()");
  124. return EXIT_FAILURE;
  125. }
  126. }
  127. //Sinon on va dans le dossier indiqué par l'utilisateur
  128. else {
  129. if (chdir(argv[1]) == ERR) {
  130. error.print("path does not exist\n");
  131. return EXIT_FAILURE;
  132. }
  133. }
  134. }
  135. return EXIT_SUCCESS;
  136. //show_current_dir("current working directory is: ", "\n");
  137. }
  138. int exit_sh(int argc, char** argv){
  139. exitsh = true;
  140. return EXIT_SUCCESS;
  141. }