command.c 3.1 KB

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