summaryrefslogtreecommitdiffstats
path: root/03_exercise/srv/shell.c
diff options
context:
space:
mode:
Diffstat (limited to '03_exercise/srv/shell.c')
-rw-r--r--03_exercise/srv/shell.c37
1 files changed, 22 insertions, 15 deletions
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)