diff options
author | Niklas Halle <niklas@niklashalle.net> | 2020-06-08 13:24:09 +0200 |
---|---|---|
committer | Niklas Halle <niklas@niklashalle.net> | 2020-06-08 13:24:09 +0200 |
commit | 685d32641209b2671b154f52046d6bfd63bd9531 (patch) | |
tree | 33ca6cc0139d628b36d2955de1a954aa4a5b528f /03_exercise/cli/client.c | |
parent | 0940e27cb8dc9829130e141c599efee780cc4d67 (diff) | |
download | betriebssysteme-685d32641209b2671b154f52046d6bfd63bd9531.tar.gz betriebssysteme-685d32641209b2671b154f52046d6bfd63bd9531.zip |
put und get gehen, jetzt sogar wirklich, glaube ich
Diffstat (limited to '03_exercise/cli/client.c')
-rw-r--r-- | 03_exercise/cli/client.c | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/03_exercise/cli/client.c b/03_exercise/cli/client.c index f3a4479..9ae6c0a 100644 --- a/03_exercise/cli/client.c +++ b/03_exercise/cli/client.c @@ -19,6 +19,8 @@ #define BREAK 1 #define CONTINUE 2 +char *get_current_dir_name(void); + int server_sock; pid_t pid; @@ -56,39 +58,50 @@ int main() { pid = fork(); - if (pid != 0) { + if (pid == 0) { read_stdin(); } else { read_server_sock(); } close(server_sock); + kill(pid, SIGKILL); + return 0; } void receive_file(int recv_sock, char *path, int size) { - char buffer[512]; + char buffer[BUF_SIZE]; int file_fd; int received; 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) { int nread; - if ((nread = read(recv_sock, buffer + received, size - received)) < 0) { - perror("Read"); - //pthread_exit(NULL); - exit(1); + 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 got remote file \"%s\"\n", path); + if (received == size) { + printf("successfully got remote file \"%s/%s\"", get_current_dir_name(), path); + printf("\n"); + } else { + printf("error getting remote file \"%s/%s\"", get_current_dir_name(), path); + printf("\n"); } close(file_fd); @@ -102,7 +115,7 @@ bool check_get(char *buffer) { cmd[3] = 0; if (strcmp(cmd, "<<!") == 0) { - printf("[c]: \"%s\"\n", buffer); + //printf("[c]: \"%s\"\n", buffer); int offset = 3; int i = offset; char rest[BUF_SIZE - 3]; @@ -177,7 +190,6 @@ void read_stdin() { } } } - kill(pid, SIGKILL); } void sigintHandler(int sig_num) { @@ -243,8 +255,9 @@ void send_file(char *path) { memset(buffer, 0, BUF_SIZE); errno = 0; - while (read(file_fd, buffer, sizeof(buffer)) > 0) { - printf("Sent %i bytes\n", write_all(server_sock, buffer, strlen(buffer) + 1)); + size_t count; + while ((count = read(file_fd, buffer, sizeof(buffer))) > 0) { + printf("Sent %i bytes\n", write_all(server_sock, buffer, count)); } if (errno) |