From a7a6567942b778ad47683e9e608b6d0b148b4f66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Sun, 23 May 2021 16:22:11 +0200 Subject: [PATCH] feat: split some code --- .vscode/settings.json | 4 +- minishell | Bin 27168 -> 27264 bytes minishell.c | 184 ++++----------------------------------- utils.c | 195 ++++++++++++++++++++++++++++++++++++++++++ utils.h | 10 +++ 5 files changed, 223 insertions(+), 170 deletions(-) create mode 100644 utils.c create mode 100644 utils.h diff --git a/.vscode/settings.json b/.vscode/settings.json index eba2745..bc67dc0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,6 +6,8 @@ "stdlib.h": "c", "wait.h": "c", "*.bak": "c", - "*.tcc": "c" + "*.tcc": "c", + "errno.h": "c", + "string.h": "c" } } \ No newline at end of file diff --git a/minishell b/minishell index a6d1e3b708419c8509f561d416e872284511cb89..a83f70291be1d4394871c078db0ba71c847d7551 100755 GIT binary patch delta 7437 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 RPfId8>H={Ld!;zx{{h69eJ}t3 delta 7044 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 BCyW39 diff --git a/minishell.c b/minishell.c index 6d66e13..a79178e 100644 --- a/minishell.c +++ b/minishell.c @@ -11,15 +11,18 @@ #include #include "readcmd.h" #include "jobs.h" +#include "utils.h" extern int errno; struct cmdline *cmd; -int pid_fils, wait_code; - list jobs; +int pid_fils; +int wait_code; +int builtin_code; + int prompting = 0; jmp_buf goto_prompt; @@ -30,81 +33,6 @@ int file_in, file_out; int pipes[256][2]; int sous_fils[256]; -void handler_sigchld(int sig_num) -{ - do - { - pid_fils = waitpid(-1, &wait_code, WNOHANG | WUNTRACED | WCONTINUED); - if ((pid_fils == -1) && (errno != ECHILD)) - { // wait fail ? - fprintf(stderr, "ERROR: waiting for %d failed, (%d) %s\n", pid_fils, errno, strerror(errno)); - exit(errno); - } - - cell *job = trouver(&jobs, pid_fils); - if (job != NULL) - { - if (prompting) - { - printf("\n"); - } - - if (WIFSTOPPED(wait_code)) - { - printf("[%d] %d stopped: %s\n", job->id, job->pid, job->cmd); - } - else if (WIFCONTINUED(wait_code)) - { - printf("[%d] %d continued: %s\n", job->id, job->pid, job->cmd); - if (!strcmp(cmd->seq[0][0], "fg")) - { - supprimer(&jobs, job->pid); - } - } - else if (WIFEXITED(wait_code)) - { - printf("[%d] %d exited: %s\n", job->id, job->pid, job->cmd); - supprimer(&jobs, job->pid); - } - else if (wait_code == SIGKILL) - { - printf("[%d] %d killed: %s\n", job->id, job->pid, job->cmd); - supprimer(&jobs, job->pid); - } - } - } while (pid_fils > 0); - - if (prompting) - { - siglongjmp(goto_prompt, sig_num); - } -} - -void handler_sigint(int sig_num) -{ - printf("\n"); - if (!prompting) - { - kill(pid_fils, SIGKILL); - pause(); - } - siglongjmp(goto_prompt, sig_num); -} - -void handler_sigtstp(int sig_num) -{ - printf("\n"); - if (!prompting) - { - ajouter(&jobs, pid_fils, *(cmd->seq)); - kill(pid_fils, SIGSTOP); - pause(); - } - siglongjmp(goto_prompt, sig_num); -} - -// TODO handler dans un autre fichier - int main(int argc, char *argv[]) { initialiser(&jobs); @@ -132,101 +60,19 @@ int main(int argc, char *argv[]) cmd = readcmd(); prompting = 0; - // TODO: créer fonction "builtin" ? - // continue ou break en fonction de l'entier de retour - if (cmd == NULL) - { // EOF + builtin_code = builtin(); + if (builtin_code == 1) + { break; } - else if (cmd->err) - { // error from readcmd - fprintf(stderr, "ERROR: readcmd failed, %s\n", cmd->err); + else if (builtin_code == 2) + { continue; } - else if (cmd->seq[0] == NULL) - { // empty - continue; - } - else if (!strcmp(cmd->seq[0][0], "exit")) - { // "exit" - break; - } - else if (!strcmp(cmd->seq[0][0], "cd")) - { // "cd" - int ret = 0; - if (cmd->seq[0][1] == NULL) - { // no path - ret = chdir(initcd); - } - else - { // with path - ret = chdir(cmd->seq[0][1]); - } - if (ret) - { // wrong path - fprintf(stderr, "ERROR: cd failed, (%d) %s\n", errno, strerror(errno)); - } - continue; - } - else if (!strcmp(cmd->seq[0][0], "jobs")) - { // "jobs" - afficher(&jobs); - continue; - } - else if (!strcmp(cmd->seq[0][0], "bg")) - { // "bg" - cell *job; - if (cmd->seq[0][1] == NULL) - { // no id - fprintf(stderr, "ERROR: id missing\n"); - continue; - } - else - { // id specified - job = trouver_id(&jobs, atoi(cmd->seq[0][1])); - } - kill(job->pid, SIGCONT); - pause(); - continue; - } - else if (!strcmp(cmd->seq[0][0], "fg")) - { // "fg" - cell *job; - if (cmd->seq[0][1] == NULL) - { // no id - fprintf(stderr, "ERROR: id missing\n"); - continue; - } - else - { // id specified - job = trouver_id(&jobs, atoi(cmd->seq[0][1])); - pid_fils = job->pid; - } - kill(pid_fils, SIGCONT); - pause(); - waitpid(pid_fils, NULL, 0); - continue; - } - else if (!strcmp(cmd->seq[0][0], "stop")) - { // "stop" - cell *job; - if (cmd->seq[0][1] == NULL) - { // no id - fprintf(stderr, "ERROR: id missing\n"); - continue; - } - else - { // id specified - job = trouver_id(&jobs, atoi(cmd->seq[0][1])); - } - kill(job->pid, SIGSTOP); - pause(); - continue; - } - else if (!strcmp(cmd->seq[0][0], "pid")) - { // "pid" - printf("pid=%d\n", getpid()); - continue; + else if (builtin_code != 0) + { + fprintf(stderr, "ERROR: builtin command failed"); + exit(1); } int nb_pipe = -1; @@ -239,7 +85,7 @@ int main(int argc, char *argv[]) if (nb_pipe < 0) { // counting failed ? fprintf(stderr, "ERROR: counting pipes failed"); - exit(1); + exit(2); } if ((pid_fils = fork()) == -1) diff --git a/utils.c b/utils.c new file mode 100644 index 0000000..baeb338 --- /dev/null +++ b/utils.c @@ -0,0 +1,195 @@ +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "readcmd.h" +#include "jobs.h" + +extern int errno; +extern int pid_fils; +extern int wait_code; +extern int prompting; +extern list jobs; +extern struct cmdline *cmd; +extern jmp_buf goto_prompt; +extern char initcd[]; + +int builtin() +{ + if (cmd == NULL) + { // EOF + return 1; + } + else if (cmd->err) + { // error from readcmd + fprintf(stderr, "ERROR: readcmd failed, %s\n", cmd->err); + return 2; + } + else if (cmd->seq[0] == NULL) + { // empty + return 2; + } + else if (!strcmp(cmd->seq[0][0], "exit")) + { // "exit" + return 1; + } + else if (!strcmp(cmd->seq[0][0], "cd")) + { // "cd" + int ret = 0; + if (cmd->seq[0][1] == NULL) + { // no path + ret = chdir(initcd); + } + else + { // with path + ret = chdir(cmd->seq[0][1]); + } + if (ret) + { // wrong path + fprintf(stderr, "ERROR: cd failed, (%d) %s\n", errno, strerror(errno)); + } + return 2; + } + else if (!strcmp(cmd->seq[0][0], "jobs")) + { // "jobs" + afficher(&jobs); + return 2; + } + else if (!strcmp(cmd->seq[0][0], "bg")) + { // "bg" + cell *job; + if (cmd->seq[0][1] == NULL) + { // no id + fprintf(stderr, "ERROR: id missing\n"); + return 2; + } + else + { // id specified + job = trouver_id(&jobs, atoi(cmd->seq[0][1])); + } + kill(job->pid, SIGCONT); + pause(); + return 2; + } + else if (!strcmp(cmd->seq[0][0], "fg")) + { // "fg" + cell *job; + if (cmd->seq[0][1] == NULL) + { // no id + fprintf(stderr, "ERROR: id missing\n"); + return 2; + } + else + { // id specified + job = trouver_id(&jobs, atoi(cmd->seq[0][1])); + pid_fils = job->pid; + } + kill(pid_fils, SIGCONT); + pause(); + waitpid(pid_fils, NULL, 0); + return 2; + } + else if (!strcmp(cmd->seq[0][0], "stop")) + { // "stop" + cell *job; + if (cmd->seq[0][1] == NULL) + { // no id + fprintf(stderr, "ERROR: id missing\n"); + return 2; + } + else + { // id specified + job = trouver_id(&jobs, atoi(cmd->seq[0][1])); + } + kill(job->pid, SIGSTOP); + pause(); + return 2; + } + else if (!strcmp(cmd->seq[0][0], "pid")) + { // "pid" + printf("pid=%d\n", getpid()); + return 2; + } + + return 0; +} + +void handler_sigchld(int sig_num) +{ + do + { + pid_fils = waitpid(-1, &wait_code, WNOHANG | WUNTRACED | WCONTINUED); + if ((pid_fils == -1) && (errno != ECHILD)) + { // wait fail ? + fprintf(stderr, "ERROR: waiting for %d failed, (%d) %s\n", pid_fils, errno, strerror(errno)); + exit(errno); + } + + cell *job = trouver(&jobs, pid_fils); + if (job != NULL) + { + if (prompting) + { + printf("\n"); + } + + if (WIFSTOPPED(wait_code)) + { + printf("[%d] %d stopped: %s\n", job->id, job->pid, job->cmd); + } + else if (WIFCONTINUED(wait_code)) + { + printf("[%d] %d continued: %s\n", job->id, job->pid, job->cmd); + if (!strcmp(cmd->seq[0][0], "fg")) + { + supprimer(&jobs, job->pid); + } + } + else if (WIFEXITED(wait_code)) + { + printf("[%d] %d exited: %s\n", job->id, job->pid, job->cmd); + supprimer(&jobs, job->pid); + } + else if (wait_code == SIGKILL) + { + printf("[%d] %d killed: %s\n", job->id, job->pid, job->cmd); + supprimer(&jobs, job->pid); + } + } + } while (pid_fils > 0); + + if (prompting) + { + siglongjmp(goto_prompt, sig_num); + } +} + +void handler_sigint(int sig_num) +{ + printf("\n"); + if (!prompting) + { + kill(pid_fils, SIGKILL); + pause(); + } + siglongjmp(goto_prompt, sig_num); +} + +void handler_sigtstp(int sig_num) +{ + printf("\n"); + if (!prompting) + { + ajouter(&jobs, pid_fils, *(cmd->seq)); + kill(pid_fils, SIGSTOP); + pause(); + } + siglongjmp(goto_prompt, sig_num); +} diff --git a/utils.h b/utils.h new file mode 100644 index 0000000..1426e3d --- /dev/null +++ b/utils.h @@ -0,0 +1,10 @@ +#ifndef __UTILS_H +#define __UTILS_H + +int builtin(); + +void handler_sigchld(int sig_num); +void handler_sigint(int sig_num); +void handler_sigtstp(int sig_num); + +#endif \ No newline at end of file