diff options
Diffstat (limited to '03_exercise')
-rwxr-xr-x | 03_exercise/cli/client | bin | 30912 -> 31152 bytes | |||
-rw-r--r-- | 03_exercise/cli/client.c | 41 | ||||
-rw-r--r-- | 03_exercise/srv/shell.c | 37 |
3 files changed, 49 insertions, 29 deletions
diff --git a/03_exercise/cli/client b/03_exercise/cli/client Binary files differindex ecaa0d8..56618d6 100755 --- a/03_exercise/cli/client +++ b/03_exercise/cli/client 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) 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) |