From 685d32641209b2671b154f52046d6bfd63bd9531 Mon Sep 17 00:00:00 2001 From: Niklas Halle Date: Mon, 8 Jun 2020 13:24:09 +0200 Subject: put und get gehen, jetzt sogar wirklich, glaube ich --- 03_exercise/srv/shell.c | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) (limited to '03_exercise/srv/shell.c') diff --git a/03_exercise/srv/shell.c b/03_exercise/srv/shell.c index 7a90945..cd053b6 100644 --- a/03_exercise/srv/shell.c +++ b/03_exercise/srv/shell.c @@ -33,31 +33,37 @@ int write_all(int target_sock, char *buffer, size_t size) { return sent; } -void receive_file(int sock, char *path, int size) { - char buffer[512]; +void receive_file(int recv_sock, char *path, int size) { + char buffer[BUF_SIZE]; int file_fd; - int nread, received; + 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"); } + if (size == 0) { + // just touch + close(file_fd); + return; + } received = 0; /* Read all data */ while (received < size) { - if ((nread = read(sock, buffer + received, size - received)) < 0) { - perror("Read"); - //pthread_exit(NULL); - exit(1); + int nread; + if ((nread = read(recv_sock, buffer, BUF_SIZE)) > 0) { + if (write_all(file_fd, buffer, nread) != nread) { + break; + } + received += nread; } - - received += nread; } - if (write_all(file_fd, buffer, strlen(buffer) + 1) == strlen(buffer) + 1) { - printf("successfully wrote to remote file \"%s/%s\"", get_current_dir_name(), path); + if (received == size) { + printf("successfully wrote to remote file \"%s/%s\"\n", get_current_dir_name(), path); printf("\n"); } else { - printf("error writing remote file \"%s/%s\"", get_current_dir_name(), path); + printf("error writing remote file \"%s/%s\"\n", get_current_dir_name(), path); printf("\n"); } @@ -96,8 +102,9 @@ void send_file(int client_fd, char *path) { memset(buffer, 0, BUF_SIZE); errno = 0; - while (read(file_fd, buffer, sizeof(buffer)) > 0) { - /*printf("Sent %i bytes\n", */write_all(client_fd, buffer, strlen(buffer) + 1)/*)*/; + size_t count; + while ((count = read(file_fd, buffer, sizeof(buffer))) > 0) { + /*printf("Sent %i bytes\n", */write_all(client_fd, buffer, count)/*)*/; } if (errno) -- cgit v1.2.3-54-g00ecf