summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNiklas Halle <niklas@niklashalle.net>2020-06-08 13:38:05 +0200
committerNiklas Halle <niklas@niklashalle.net>2020-06-08 13:38:05 +0200
commitfb3b792ba17afb41e9662fd3b60492f0c12fa0f0 (patch)
tree1ff0bd283d430279478fce1c7cb291354fca9051
parent685d32641209b2671b154f52046d6bfd63bd9531 (diff)
downloadbetriebssysteme-fb3b792ba17afb41e9662fd3b60492f0c12fa0f0.tar.gz
betriebssysteme-fb3b792ba17afb41e9662fd3b60492f0c12fa0f0.zip
first kinda ready stand, with comment in shell.c explaining a bit
-rw-r--r--03_exercise/srv/shell.c41
1 files changed, 33 insertions, 8 deletions
diff --git a/03_exercise/srv/shell.c b/03_exercise/srv/shell.c
index cd053b6..b93030f 100644
--- a/03_exercise/srv/shell.c
+++ b/03_exercise/srv/shell.c
@@ -12,6 +12,23 @@
#include "prompt_utils.h"
#include "builtins.h"
+/*
+ * READ ME
+ * sorry für den unaufgeräumten Code hier :/
+ *
+ * What works:
+ * - remote shell, weitesgehend die funktionalität der vorhergehenden aufgabe (damit auch pipes und background,
+ * auch wenn wir das nicht ausführlich getestet haben)
+ * - get und put für dateien
+ * What doesn't work:
+ * - mehrere clients an einem server
+ * Known bugs:
+ * - exit beendet nicht nur die client-server connection und setzt den server wieder in einen wartenden zustand,
+ * sondern terminiert ebenfalls den server
+ * - das erkennen, wann eine neue prompt geprintet werden muss ist aktuell sehr hacky client seitig implementiert,
+ * scheitert teilweise - die eingabe geht trzd ganz normal, es wird nur keine prompt angezeigt
+ */
+
char *get_current_dir_name(void);
#define BUF_SIZE 2048
@@ -24,6 +41,7 @@ int write_all(int target_sock, char *buffer, size_t size) {
while (sent < size) {
if ((nwrite = write(target_sock, buffer + sent, size - sent)) < 0) {
perror("Write");
+ printf("\n");
return -1;
}
@@ -38,7 +56,10 @@ void receive_file(int recv_sock, char *path, int size) {
int file_fd;
int received;
- if ((file_fd = open(path, (O_WRONLY | O_CREAT | O_TRUNC), 0644)) == -1) { perror("Open"); }
+ if ((file_fd = open(path, (O_WRONLY | O_CREAT | O_TRUNC), 0644)) == -1) {
+ perror("Open");
+ printf("\n");
+ }
if (size == 0) {
// just touch
@@ -78,6 +99,7 @@ void send_file(int client_fd, char *path) {
if ((tmp_fd = open(path, O_RDONLY)) == -1) {
perror("Open");
+ printf("\n");
return;
}
FILE *file = fdopen(tmp_fd, "r");
@@ -88,10 +110,11 @@ void send_file(int client_fd, char *path) {
close(tmp_fd);
if ((file_fd = open(path, O_RDONLY)) == -1) {
perror("Open");
+ printf("\n");
return;
}
- int length = snprintf(NULL, 0, "%ld", sz);
+ int length = snprintf(NULL, 0, "%ld", sz);
sprintf(buffer, "<<!%ld!", sz);
sprintf(&(buffer[3 + length + 1]), "%s\n", path);
@@ -107,8 +130,10 @@ void send_file(int client_fd, char *path) {
/*printf("Sent %i bytes\n", */write_all(client_fd, buffer, count)/*)*/;
}
- if (errno)
+ if (errno) {
perror("wad");
+ printf("\n");
+ }
close(file_fd);
@@ -128,16 +153,16 @@ void signal_handler(int signal) {
bool check_put(char *buffer, int sock) {
// "<<!bytecount!name"
- char cmd[4];
- char rest[BUF_SIZE - 3];
+ char cmd[4];
+ char rest[BUF_SIZE - 3];
size_t file_size;
memcpy(cmd, buffer, 3);
cmd[3] = 0;
if (strcmp(cmd, "<<!") == 0) {
- int offset = 3;
- int i = offset;
+ int offset = 3;
+ int i = offset;
for (; i < BUF_SIZE; ++i) {
if (buffer[i] == '!')
break;
@@ -146,7 +171,7 @@ bool check_put(char *buffer, int sock) {
rest[i - offset] = 0;
file_size = atoi(rest);
- offset = ++i;
+ offset = ++i;
for (; i < BUF_SIZE; ++i) {
if (buffer[i] == '!')
break;