|
@@ -15,31 +15,97 @@
|
|
|
|
|
|
/* --- Extern --- */
|
|
|
extern Error error;
|
|
|
-char* cmdlist[2] = {
|
|
|
+char* cmdlist[2] = {
|
|
|
"cd",
|
|
|
NULL
|
|
|
};
|
|
|
|
|
|
/* --- Fonctions publiques --- */
|
|
|
-boolean is_internal_cmd(const char* cmd){
|
|
|
+void ini_pid_list(pid_list* pl) {
|
|
|
+ pl->first = NULL;
|
|
|
+ pl->last = NULL;
|
|
|
+}
|
|
|
+
|
|
|
+pid_node* add_pid(pid_list* pl, pid_t pid) {
|
|
|
+ pid_node* pn = malloc(sizeof (pid_node));
|
|
|
+ pn->pid = pid;
|
|
|
+ pn->next = NULL;
|
|
|
+ if (pl->first = NULL) {
|
|
|
+ pn->prev = NULL;
|
|
|
+ pl->first = pn;
|
|
|
+ pl->last = pn;
|
|
|
+ } else {
|
|
|
+ pn->prev = pl->last;
|
|
|
+ pl->last->next = pn;
|
|
|
+ pl->last = pn;
|
|
|
+ }
|
|
|
+ return pn;
|
|
|
+}
|
|
|
+
|
|
|
+pid_node* search_pid(pid_list* pl, pid_t pid) {
|
|
|
+ pid_node pn = pl->first;
|
|
|
+ while (pn != NULL) {
|
|
|
+ if (pn->pid == pid) {
|
|
|
+ return pn;
|
|
|
+ }
|
|
|
+ pn = pn->next;
|
|
|
+ }
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
+void remove_pid(pid_list* pl, pid_node* pn) {
|
|
|
+ //Si 1er et seul
|
|
|
+ if (pn->prev == NULL && pn->next == NULL) {
|
|
|
+ pl->first = NULL;
|
|
|
+ pl->last = NULL;
|
|
|
+ }
|
|
|
+ //Si 1er et non seul
|
|
|
+ else if (pn->prev == NULL && pn->next != NULL) {
|
|
|
+ pn->next->prev = NULL;
|
|
|
+ pl->first = pn->next;
|
|
|
+ }
|
|
|
+ //Si dernier
|
|
|
+ else if (pn->next == NULL) {
|
|
|
+ pn->prev->next = NULL;
|
|
|
+ pl->last = pn->prev;
|
|
|
+ }
|
|
|
+ //Sinon si il est au milieu
|
|
|
+ else {
|
|
|
+ pn->prev->next = pn->next;
|
|
|
+ pn->next->prev = pn->prev;
|
|
|
+ }
|
|
|
+ //Free
|
|
|
+ free(pn);
|
|
|
+}
|
|
|
+
|
|
|
+void clean_pid(pid_list* pl) {
|
|
|
+ pid_node* tmp, * pn = pl->first;
|
|
|
+ while (pn != NULL) {
|
|
|
+ tmp = pn->next;
|
|
|
+ free(pn);
|
|
|
+ pn = tmp;
|
|
|
+ }
|
|
|
+ free(pl);
|
|
|
+}
|
|
|
+
|
|
|
+boolean is_internal_cmd(const char* cmd) {
|
|
|
//Parcours tableau pour trouver correspondance
|
|
|
- for(int i = 0; cmdlist[i] != NULL; i++){
|
|
|
+ for (int i = 0; cmdlist[i] != NULL; i++) {
|
|
|
printf("%s - %s\n", cmd, cmdlist[i]);
|
|
|
- if(strncmp(cmd, cmdlist[i], strlen(cmdlist[i]) + 1) == 0){
|
|
|
+ if (strncmp(cmd, cmdlist[i], strlen(cmdlist[i]) + 1) == 0) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-int launch_internal_command(Command* cmd){
|
|
|
+int launch_internal_command(Command* cmd) {
|
|
|
int result, length = strlen(cmd->name) + 1;
|
|
|
//cd
|
|
|
- if(strncmp(cmd->name, cmdlist[0], length) == 0){
|
|
|
+ if (strncmp(cmd->name, cmdlist[0], length) == 0) {
|
|
|
result = cd(cmd->argc, cmd->argv);
|
|
|
return result;
|
|
|
- }
|
|
|
- //Aucune commande
|
|
|
+ } //Aucune commande
|
|
|
else {
|
|
|
return SHELL_FAIL;
|
|
|
}
|
|
@@ -58,8 +124,8 @@ int cd(int argc, char** argv) {
|
|
|
addperror("Erreur chdir()");
|
|
|
return SHELL_ERR;
|
|
|
}
|
|
|
- }
|
|
|
- //Sinon on va dans le dossier indiqué par l'utilisateur
|
|
|
+ }
|
|
|
+ //Sinon on va dans le dossier indiqué par l'utilisateur
|
|
|
else {
|
|
|
if (chdir(argv[1]) == ERR) {
|
|
|
error.print("path does not exist\n");
|