From e1520589de17d08c4bde37f1198f18d012a1f377 Mon Sep 17 00:00:00 2001 From: Niklas Halle Date: Sat, 6 Jun 2020 14:06:00 +0200 Subject: basic shell works - sometimes goes out of sync (running current command only after issueing the next) --- 03_exercise/.srv_pid | 2 +- 03_exercise/cli/client | Bin 23056 -> 23640 bytes 03_exercise/cli/client.c | 39 +++++++++++++----- 03_exercise/echo_server/server.c | 85 +++++++++++++++++++-------------------- 03_exercise/srv/server | Bin 58760 -> 58856 bytes 03_exercise/srv/shell.c | 18 +++++---- CMakeLists.txt | 2 + 7 files changed, 85 insertions(+), 61 deletions(-) diff --git a/03_exercise/.srv_pid b/03_exercise/.srv_pid index 4e6d37a..ed33336 100644 --- a/03_exercise/.srv_pid +++ b/03_exercise/.srv_pid @@ -1 +1 @@ -1768723 +618929 diff --git a/03_exercise/cli/client b/03_exercise/cli/client index 53ba0d8..c57cade 100755 Binary files a/03_exercise/cli/client and b/03_exercise/cli/client differ diff --git a/03_exercise/cli/client.c b/03_exercise/cli/client.c index 527c67c..83b4dec 100644 --- a/03_exercise/cli/client.c +++ b/03_exercise/cli/client.c @@ -3,6 +3,8 @@ #include #include +#include +#include #include #include #include @@ -10,7 +12,21 @@ #define PORT 9000 #define HOST "127.0.0.1" -#define BUF_SIZE 1024 +#define BUF_SIZE 2048 + +int cfd; + +/* Signal Handler for SIGINT */ +void sigintHandler(int sig_num) { + errno = 0; + if (fcntl(cfd, F_GETFD) != -1 || errno != EBADF) { + write(cfd, "exit\n", 6); + close(cfd); + } + printf("Terminating client\n"); + fflush(stdout); + exit(-1); +} static inline void die(const char *msg) { perror(msg); @@ -23,8 +39,7 @@ int main() { .sin_port = htons(PORT), .sin_addr.s_addr = inet_addr(HOST) }; - char buf[BUF_SIZE]; - int cfd; + char buf[BUF_SIZE]; if ((cfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) die("Could not open socket"); @@ -36,8 +51,14 @@ int main() { size_t cap = 0; __ssize_t length; + if (read(cfd, buf, BUF_SIZE) < 0) + die("Could not receive message"); + + printf("%s\n$> ", buf); + memset(buf, 0, BUF_SIZE); + while (1) { - printf("%s > ", HOST); + //printf("[C] awaiting command\n"); if ((length = getline(&line, &cap, stdin)) < 0) { fprintf(stderr, "Failed to read from STDIN"); fflush(stderr); @@ -49,14 +70,14 @@ int main() { continue; } - line[length - 1] = '\0'; // cut the line feed + strncpy(buf, line, strlen(line) + 1); - strncpy(buf, line, strlen(line)); + //printf("[C] pre send: \"%s\"\n", buf); - if (write(cfd, buf, BUF_SIZE) < 0) + if (write(cfd, buf, strlen(line)) < 0) die("Could not send message"); - if (strcmp(line, "exit") == 0) { + if (strcmp(line, "exit\n") == 0) { free(line); line = NULL; break; @@ -65,7 +86,7 @@ int main() { if (read(cfd, buf, BUF_SIZE) < 0) die("Could not receive message"); - printf("%s\n", buf); + printf("%s$> ", buf); memset(buf, 0, BUF_SIZE); free(line); line = NULL; diff --git a/03_exercise/echo_server/server.c b/03_exercise/echo_server/server.c index faf309c..5f647c1 100644 --- a/03_exercise/echo_server/server.c +++ b/03_exercise/echo_server/server.c @@ -7,50 +7,47 @@ #include #include -static inline void die(const char* msg) -{ - perror(msg); - exit(-1); +static inline void die(const char *msg) { + perror(msg); + exit(-1); } -int main() -{ - struct sockaddr_in srv_addr, cli_addr; - int sockopt = 1; - socklen_t sad_sz = sizeof(struct sockaddr_in); - int sfd, cfd; - ssize_t bytes; - char buf[256]; - - srv_addr.sin_family = AF_INET; - srv_addr.sin_port = htons(8000); - srv_addr.sin_addr.s_addr = INADDR_ANY; - - if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) - die("Couldn't open the socket"); - - setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (char*) &sockopt, sizeof(sockopt)); - - if (bind(sfd, (struct sockaddr*) &srv_addr, sad_sz) < 0) - die("Couldn't bind socket"); - - if (listen(sfd, 1) < 0) - die("Couldn't listen to the socket"); - - cfd = accept(sfd, (struct sockaddr*) &cli_addr, &sad_sz); - if (cfd < 0) - die("Couldn't accept incoming connection"); - - while ((bytes = read(cfd, buf, sizeof(buf))) != 0) - { - if (bytes < 0) - die("Couldn't receive message"); - - if (write(cfd, buf, bytes) < 0) - die("Couldn't send message"); - } - - close(cfd); - close(sfd); - return 0; +int main() { + struct sockaddr_in srv_addr, cli_addr; + int sockopt = 1; + socklen_t sad_sz = sizeof(struct sockaddr_in); + int sfd, cfd; + ssize_t bytes; + char buf[256]; + + srv_addr.sin_family = AF_INET; + srv_addr.sin_port = htons(8000); + srv_addr.sin_addr.s_addr = INADDR_ANY; + + if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) + die("Couldn't open the socket"); + + setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (char *) &sockopt, sizeof(sockopt)); + + if (bind(sfd, (struct sockaddr *) &srv_addr, sad_sz) < 0) + die("Couldn't bind socket"); + + if (listen(sfd, 1) < 0) + die("Couldn't listen to the socket"); + + cfd = accept(sfd, (struct sockaddr *) &cli_addr, &sad_sz); + if (cfd < 0) + die("Couldn't accept incoming connection"); + + while ((bytes = read(cfd, buf, sizeof(buf))) != 0) { + if (bytes < 0) + die("Couldn't receive message"); + + if (write(cfd, buf, bytes) < 0) + die("Couldn't send message"); + } + + close(cfd); + close(sfd); + return 0; } diff --git a/03_exercise/srv/server b/03_exercise/srv/server index 232330a..efe2660 100755 Binary files a/03_exercise/srv/server and b/03_exercise/srv/server differ diff --git a/03_exercise/srv/shell.c b/03_exercise/srv/shell.c index a32fc5f..74586c7 100644 --- a/03_exercise/srv/shell.c +++ b/03_exercise/srv/shell.c @@ -11,7 +11,7 @@ #include "prompt_utils.h" #include "builtins.h" -#define BUF_SIZE 256 +#define BUF_SIZE 2048 process *processes; @@ -55,19 +55,19 @@ int shell(int in_fd) { bool done = false; while (!done) { char line[BUF_SIZE]; + __ssize_t length; - for (int i = 0; i < BUF_SIZE; ++i) { - read(in_fd, line + i, 1); - if (line[i] == '\n') { - line[i] = 0; - break; - } + if ((length = read(in_fd, line, BUF_SIZE)) < 0) { + fprintf(stderr, "Failed to read from STDIN"); + fflush(stderr); + exit(-1); } if (strspn(line, " \n\t") == strlen(line)) { // skip empty lines - empty being just spaces or tabs continue; } + line[length - 1] = '\0'; // cut the line feed processes = NULL; parse_line(line, &processes); @@ -92,6 +92,8 @@ int shell(int in_fd) { if (ret) printf("[%i] ", ret); + else + printf("%s\n", get_current_dir_name()); } else if (strcmp(processes[0].argv[0], "exit") == 0) { done = true; @@ -115,6 +117,8 @@ int shell(int in_fd) { free_processes(&processes); } + printf("Disconnecting..."); + free((void *) original_wd); return 0; diff --git a/CMakeLists.txt b/CMakeLists.txt index 41de2c8..5d0441e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,6 +28,7 @@ set(CLANG_WARNINGS # (ie printf) -Werror ) + set(GCC_WARNINGS ${CLANG_WARNINGS} -Wmisleading-indentation # warn if indentation implies blocks where blocks @@ -37,4 +38,5 @@ set(GCC_WARNINGS -Wlogical-op # warn about logical operations being used where bitwise were # probably wanted ) + set(PROJECT_WARNINGS ${GCC_WARNINGS}) -- cgit v1.2.3-54-g00ecf