summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNiklas Halle <niklas@niklashalle.net>2020-06-07 12:51:27 +0200
committerNiklas Halle <niklas@niklashalle.net>2020-06-07 12:51:27 +0200
commit9629104f494a441681fd28295f98531682875fc7 (patch)
tree8dc7069a149880fcadc38050df34c128e06d5be1
parent2821f125c91c192cdd28997e78f366f2db2d39c4 (diff)
downloadbetriebssysteme-9629104f494a441681fd28295f98531682875fc7.tar.gz
betriebssysteme-9629104f494a441681fd28295f98531682875fc7.zip
put works
-rw-r--r--03_exercise/.srv_pid2
-rwxr-xr-x03_exercise/cli/clientbin28384 -> 28360 bytes
-rw-r--r--03_exercise/cli/client.c41
-rw-r--r--03_exercise/srv/server.c27
-rw-r--r--03_exercise/srv/shell.c72
5 files changed, 78 insertions, 64 deletions
diff --git a/03_exercise/.srv_pid b/03_exercise/.srv_pid
index ab09251..8dcdde2 100644
--- a/03_exercise/.srv_pid
+++ b/03_exercise/.srv_pid
@@ -1 +1 @@
-1493889
+2202992
diff --git a/03_exercise/cli/client b/03_exercise/cli/client
index 0fcf5c1..34d1d01 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 c1bc5d1..052dabd 100644
--- a/03_exercise/cli/client.c
+++ b/03_exercise/cli/client.c
@@ -50,36 +50,38 @@ int write_all(int sock, char *buffer, int size) {
}
void send_file(int server_fd, char *path) {
- char buffer[512];
- int file_fd;
-
- if ((file_fd = open(path, O_RDONLY)) == -1) { perror("Open"); }
-
- FILE *file = fdopen(file_fd, "r");
+ printf("Trying to send \"%s\" to remote...\n", path);
+ char buffer[BUF_SIZE];
+ memset(buffer, 0, BUF_SIZE);
+ int tmp_fd, file_fd;
+ if ((tmp_fd = open(path, O_RDONLY)) == -1) { perror("Open"); }
+ FILE *file = fdopen(tmp_fd, "r");
fseek(file, 0L, SEEK_END);
long int sz = ftell(file);
fseek(file, 0L, SEEK_SET);
+ fclose(file);
+ close(tmp_fd);
+ if ((file_fd = open(path, O_RDONLY)) == -1) { perror("Open"); }
int length = snprintf(NULL, 0, "%ld", sz);
- char msg[length + 1 + 3];
- sprintf(msg, "<<!%ld", sz);
+ sprintf(buffer, "<<!%ld!", sz);
+ sprintf(&(buffer[3 + length + 1]), "%s\n", path);
- write(server_fd, msg, strlen(msg));
-
- int size;
- while (read(file_fd, buffer, sizeof(buffer)) != 0) {
- size = strlen(buffer) + 1;
- if (write(server_fd, &size, sizeof(size)) < 0) {
- perror("Write");
- exit(1);
- }
+ write(server_fd, buffer, strlen(buffer));
+ memset(buffer, 0, BUF_SIZE);
+ errno = 0;
+ while (read(file_fd, buffer, sizeof(buffer)) > 0) {
printf("Sent %i bytes\n", write_all(server_fd, buffer, strlen(buffer) + 1));
}
- fclose(file);
+ if (errno)
+ perror("wad");
+
close(file_fd);
+
+ printf("done.\n");
}
#define BREAK 1
@@ -143,7 +145,7 @@ int main() {
pid_t pid = fork();
int done = 0;
- if (pid == 0) {
+ if (pid != 0) {
read_stdin(&done);
} else {
read_server_sock(&done);
@@ -175,6 +177,7 @@ void read_stdin(int *done) {
ssize_t length;
while (!*done) {
+ memset(stdinp_buffer, 0, BUF_SIZE);
if ((length = read(STDIN_FILENO, stdinp_buffer, BUF_SIZE)) > 0) {
switch (parse(sock, stdinp_buffer, length)) {
case CONTINUE:
diff --git a/03_exercise/srv/server.c b/03_exercise/srv/server.c
index 8527b83..11f7482 100644
--- a/03_exercise/srv/server.c
+++ b/03_exercise/srv/server.c
@@ -49,33 +49,6 @@ int main() {
printf("srv: connected: %s\n", inet_ntoa(cli_addr.sin_addr));
int status = shell(cfd);
- /*
- while ((bytes = read(sock, in_buf, BUF_SIZE)) != 0) {
- if (bytes < 0)
- die("Couldn't receive message");
-
- //printf("srv: %s\n", in_buf);
-
- if (strcmp(in_buf, "get") == 0) {
- // TODO: implement get
- } else if (strcmp(in_buf, "put") == 0) {
- // TODO: implement put
- } else if (strcmp(in_buf, "ping") == 0) {
- strncpy(out_buf, "pong!", sizeof(out_buf));
- } else {
- // TODO: connect our shell implementation
- memcpy(out_buf, "got: ", sizeof(out_buf));
- memcpy(out_buf + sizeof("got: ") - 1, in_buf, BUF_SIZE - sizeof("got: ") + 1);
- }
-
- if (write(sock, out_buf, sizeof(out_buf)) < 0)
- die("Couldn't send message");
-
- memset(in_buf, 0, BUF_SIZE);
- memset(out_buf, 0, BUF_SIZE);
- }*/
-
- //printf("srv: closing down\n");
close(cfd);
close(sfd);
diff --git a/03_exercise/srv/shell.c b/03_exercise/srv/shell.c
index 449905b..aea1a68 100644
--- a/03_exercise/srv/shell.c
+++ b/03_exercise/srv/shell.c
@@ -38,24 +38,21 @@ void receive_file(int sock, char *path, int size) {
if ((file_fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644)) == -1) { perror("Open"); }
- while (true) {
- received = 0;
-
- /* Read all data */
- while (received < size) {
- if ((nread = read(sock, buffer + received, size - received)) < 0) {
- perror("Read");
- //pthread_exit(NULL);
- exit(1);
- }
+ received = 0;
- received += nread;
+ /* Read all data */
+ while (received < size) {
+ if ((nread = read(sock, buffer + received, size - received)) < 0) {
+ perror("Read");
+ //pthread_exit(NULL);
+ exit(1);
}
- if (strncmp(buffer, "end", 4) == 0) { break; }
-
- write_all(file_fd, buffer, strlen(buffer) + 1);
+ received += nread;
}
+
+ write_all(file_fd, buffer, strlen(buffer) + 1);
+ close(file_fd);
}
void signal_handler(int signal) {
@@ -69,6 +66,44 @@ void signal_handler(int signal) {
}
}
+bool check_put(char *buffer, int sock) {
+ // "<<!bytecount!name"
+ char cmd[4];
+ char rest[BUF_SIZE - 3];
+ size_t file_size;
+
+ memcpy(cmd, buffer, 3);
+ cmd[3] = 0;
+
+ if (strcmp(cmd, "<<!") == 0) {
+ int offset = 3;
+ int i = offset;
+ for (; i < BUF_SIZE; ++i) {
+ if (buffer[i] == '!')
+ break;
+ rest[i - offset] = buffer[i];
+ }
+ rest[i - offset] = 0;
+ file_size = atoi(rest);
+
+ offset = ++i;
+ for (; i < BUF_SIZE; ++i) {
+ if (buffer[i] == '!')
+ break;
+ rest[i - offset] = buffer[i];
+ }
+ rest[i - offset] = 0;
+ char path[strlen(rest) + 1];
+ memcpy(path, rest, strlen(rest));
+ path[strlen(rest)] = 0;
+
+ receive_file(sock, path, file_size);
+
+ return true;
+ }
+ return false;
+}
+
int shell(int in_fd) {
setvbuf(stderr, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
@@ -85,7 +120,7 @@ int shell(int in_fd) {
"And with `|` you can pipe the output from one process to the input of another\n"
);
- char const *const original_wd = get_current_dir_name();
+ char const *const original_wd = ".";//get_current_dir_name();
//char const *prompt = relative_path(original_wd, original_wd);
bool done = false;
@@ -110,6 +145,9 @@ int shell(int in_fd) {
continue;
}
+ if (check_put(line, in_fd))
+ continue;
+
processes = NULL;
parse_line(line, &processes);
@@ -134,7 +172,7 @@ int shell(int in_fd) {
if (ret)
printf("[%i] ", ret);
else
- printf("%s\n", get_current_dir_name());
+ printf("%s\n", "."/*get_current_dir_name()*/);
} else if (strcmp(processes[0].argv[0], "exit") == 0) {
done = true;
@@ -159,7 +197,7 @@ int shell(int in_fd) {
printf("Disconnecting...");
- free((void *) original_wd);
+ //free((void *) original_wd);
return 0;
}