command.c 3.3 KB

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