summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNiklas Halle <niklas@niklashalle.net>2020-06-06 14:06:00 +0200
committerNiklas Halle <niklas@niklashalle.net>2020-06-06 14:06:00 +0200
commite1520589de17d08c4bde37f1198f18d012a1f377 (patch)
treeb4a0f93466c9c53688bad02c69d39d409d23ce5b
parent74abc79434fe895d0ca863e4d1d6c5c16b54f296 (diff)
downloadbetriebssysteme-e1520589de17d08c4bde37f1198f18d012a1f377.tar.gz
betriebssysteme-e1520589de17d08c4bde37f1198f18d012a1f377.zip
basic shell works - sometimes goes out of sync (running current command only after issueing the next)
-rw-r--r--03_exercise/.srv_pid2
-rwxr-xr-x03_exercise/cli/clientbin23056 -> 23640 bytes
-rw-r--r--03_exercise/cli/client.c39
-rw-r--r--03_exercise/echo_server/server.c85
-rwxr-xr-x03_exercise/srv/serverbin58760 -> 58856 bytes
-rw-r--r--03_exercise/srv/shell.c18
-rw-r--r--CMakeLists.txt2
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
--- a/03_exercise/cli/client
+++ b/03_exercise/cli/client
Binary files 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 <stdlib.h>
#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
@@ -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 <netinet/in.h>
#include <arpa/inet.h>
-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
--- a/03_exercise/srv/server
+++ b/03_exercise/srv/server
Binary files 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})