summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--02_exercise/CMakeLists.txt2
-rw-r--r--03_exercise/CMakeLists.txt3
-rwxr-xr-x03_exercise/cli/clientbin31152 -> 35192 bytes
-rw-r--r--03_exercise/cli/client.c16
-rw-r--r--03_exercise/srv/shell.c4
5 files changed, 15 insertions, 10 deletions
diff --git a/02_exercise/CMakeLists.txt b/02_exercise/CMakeLists.txt
index 82df5d5..c5ef1e1 100644
--- a/02_exercise/CMakeLists.txt
+++ b/02_exercise/CMakeLists.txt
@@ -7,7 +7,6 @@ set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED True)
add_compile_definitions(_GNU_SOURCE)
-
find_package(Sanitizers)
add_executable(prog prog.c)
@@ -15,7 +14,6 @@ add_executable(prog prog.c)
add_executable(shell shell.c)
target_link_libraries(shell PRIVATE array prompt_utils process builtin)
target_compile_options(shell INTERFACE ${PROJECT_WARNINGS})
-add_sanitizers(shell)
add_library(builtin builtins.c)
target_compile_options(builtin INTERFACE ${PROJECT_WARNINGS})
diff --git a/03_exercise/CMakeLists.txt b/03_exercise/CMakeLists.txt
index a03d39b..e72de65 100644
--- a/03_exercise/CMakeLists.txt
+++ b/03_exercise/CMakeLists.txt
@@ -14,6 +14,3 @@ add_executable(server srv/prompt_utils.c srv/array.c srv/shell.c srv/process.c s
target_compile_options(client INTERFACE ${PROJECT_WARNINGS})
target_compile_options(server INTERFACE ${PROJECT_WARNINGS})
-
-add_sanitizers(client)
-add_sanitizers(server)
diff --git a/03_exercise/cli/client b/03_exercise/cli/client
index 56618d6..4450079 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 67731f4..22f4e61 100644
--- a/03_exercise/cli/client.c
+++ b/03_exercise/cli/client.c
@@ -70,7 +70,7 @@ int main() {
return 0;
}
-void receive_file(int recv_sock, char *path, int size) {
+void receive_file(int recv_sock, char *path, size_t size, char *start_buf, size_t start_buf_len) {
char buffer[BUF_SIZE];
int file_fd;
int received;
@@ -85,6 +85,17 @@ void receive_file(int recv_sock, char *path, int size) {
received = 0;
+ if (start_buf) {
+ // there was part of the file already in the "packet" which was supposed to contain only the header
+ // put that into the file too
+ if (write_all(file_fd, start_buf, start_buf_len) != start_buf_len) {
+ perror("write start buf");
+ printf("\n");
+ return;
+ }
+ received += start_buf_len;
+ }
+
/* Read all data */
while (received < size) {
int nread;
@@ -138,9 +149,8 @@ bool check_get(char *buffer) {
char path[strlen(rest) + 1];
memcpy(path, rest, strlen(rest));
path[strlen(rest)] = 0;
- path[strlen(rest) - 1] = 0;
- receive_file(server_sock, path, file_size);
+ receive_file(server_sock, path, file_size, &(buffer[i+2]), strlen(&(buffer[i+2])));
return true;
}
diff --git a/03_exercise/srv/shell.c b/03_exercise/srv/shell.c
index 38c5f9d..0419f35 100644
--- a/03_exercise/srv/shell.c
+++ b/03_exercise/srv/shell.c
@@ -116,14 +116,14 @@ void send_file(int client_fd, char *path) {
int length = snprintf(NULL, 0, "%ld", sz);
sprintf(buffer, "<<!%ld!", sz);
- sprintf(&(buffer[3 + length + 1]), "%s\n", path);
+ sprintf(&(buffer[3 + length + 1]), "%s!\n", path);
if (write(client_fd, buffer, strlen(buffer)) != strlen(buffer)) {
perror("write header");
return;
}
- usleep(150);
+ usleep(250);
memset(buffer, 0, BUF_SIZE);