summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/CMakeLists.txt1
-rw-r--r--src/server/server.c1
-rw-r--r--src/server/server.h20
-rw-r--r--src/server/server_initialize.c8
-rw-r--r--src/server/server_new_connection.c2
-rw-r--r--src/server/server_types.h10
-rw-r--r--src/server/server_worker.c4
-rw-r--r--src/server/server_worker_handle_request.c414
-rw-r--r--src/server/server_worker_receive.c1
-rw-r--r--src/server/server_worker_send.c106
10 files changed, 562 insertions, 5 deletions
diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt
index ca476fb..3b64500 100644
--- a/src/server/CMakeLists.txt
+++ b/src/server/CMakeLists.txt
@@ -11,6 +11,7 @@ set(
${CMAKE_CURRENT_SOURCE_DIR}/server_worker.c
${CMAKE_CURRENT_SOURCE_DIR}/server_worker_handle_request.c
${CMAKE_CURRENT_SOURCE_DIR}/server_worker_receive.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/server_worker_send.c
)
set(SRC_FILES ${SRC_FILES} PARENT_SCOPE)
diff --git a/src/server/server.c b/src/server/server.c
index 197faf6..edd1bd7 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -84,3 +84,4 @@ int ZoO_server_main
return 0;
}
+
diff --git a/src/server/server.h b/src/server/server.h
index 90103ed..b8c0bc8 100644
--- a/src/server/server.h
+++ b/src/server/server.h
@@ -55,4 +55,24 @@ int ZoO_server_worker_handle_request
struct ZoO_server_worker worker [const restrict static 1]
);
+int ZoO_server_worker_send_confirm_protocol_version
+(
+ struct ZoO_server_worker worker [const restrict static 1]
+);
+
+int ZoO_server_worker_send_positive
+(
+ struct ZoO_server_worker worker [const restrict static 1]
+);
+
+int ZoO_server_worker_send_negative
+(
+ struct ZoO_server_worker worker [const restrict static 1]
+);
+
+int ZoO_server_worker_send_generated_reply
+(
+ struct ZoO_server_worker worker [const restrict static 1]
+);
+
#endif
diff --git a/src/server/server_initialize.c b/src/server/server_initialize.c
index 9213156..e0632a4 100644
--- a/src/server/server_initialize.c
+++ b/src/server/server_initialize.c
@@ -4,6 +4,8 @@
#include "../parameters/parameters.h"
+#include "../knowledge/knowledge.h"
+
#include "server.h"
static int initialize_worker_collection
@@ -67,6 +69,7 @@ void initialize_thread_parameters
{
server->thread_params.thread_collection = &(server->workers);
server->thread_params.server_params = params;
+ server->thread_params.knowledge = &(server->k);
server->thread_params.socket = -1;
}
@@ -81,6 +84,11 @@ int ZoO_server_initialize
return -1;
}
+ if (ZoO_knowledge_initialize(&(server->k)) < 0)
+ {
+ return -1;
+ }
+
if
(
ZoO_server_socket_open
diff --git a/src/server/server_new_connection.c b/src/server/server_new_connection.c
index 5392de5..46b38fc 100644
--- a/src/server/server_new_connection.c
+++ b/src/server/server_new_connection.c
@@ -89,7 +89,7 @@ static int get_new_thread (struct ZoO_server server [const restrict static 1])
new_threads =
(struct ZoO_server_thread_data *) realloc
(
- &(server->workers.threads),
+ server->workers.threads,
(
sizeof(struct ZoO_server_thread_data)
* ((size_t) server->workers.threads_capacity)
diff --git a/src/server/server_types.h b/src/server/server_types.h
index 1ba9f96..a6fb875 100644
--- a/src/server/server_types.h
+++ b/src/server/server_types.h
@@ -13,7 +13,7 @@
#include "../parameters/parameters_types.h"
-#include "../pipe/pipe_types.h"
+#include "../error/error.h"
#define ZoO_SERVER_MAX_RETRIES 10
#define ZoO_SERVER_BUFFER_SIZE 0
@@ -66,10 +66,15 @@ struct ZoO_server_thread_parameters
struct ZoO_server_worker
{
struct ZoO_server_thread_parameters params;
+ FILE * socket_as_file;
+
char * buffer;
size_t buffer_capacity;
size_t buffer_length;
- FILE * socket_as_file;
+
+ ZoO_index * sequence_buffer;
+ size_t sequence_buffer_capacity;
+ size_t sequence_buffer_length;
};
struct ZoO_server
@@ -77,6 +82,7 @@ struct ZoO_server
struct ZoO_server_thread_collection workers;
struct ZoO_server_socket socket;
struct ZoO_server_thread_parameters thread_params;
+ struct ZoO_knowledge k;
};
#endif
diff --git a/src/server/server_worker.c b/src/server/server_worker.c
index bd3b5d1..c96f92e 100644
--- a/src/server/server_worker.c
+++ b/src/server/server_worker.c
@@ -23,6 +23,10 @@ static int initialize
worker->buffer_capacity = 0;
worker->buffer_length = 0;
+ worker->sequence_buffer = (ZoO_index *) NULL;
+ worker->sequence_buffer_capacity = 0;
+ worker->sequence_buffer_length = 0;
+
worker->socket_as_file = fdopen(worker->params.socket, "w+");
if (worker->socket_as_file == (FILE *) NULL)
diff --git a/src/server/server_worker_handle_request.c b/src/server/server_worker_handle_request.c
index 0c97091..a1450df 100644
--- a/src/server/server_worker_handle_request.c
+++ b/src/server/server_worker_handle_request.c
@@ -1,11 +1,423 @@
+#include "../pervasive.h"
+
+#include "../error/error.h"
+
+#include "../sequence/sequence.h"
+
+#include "../knowledge/knowledge.h"
+
+#include "../parameters/parameters.h"
+
+#include "../storage/storage.h"
+
#include "server.h"
-int ZoO_server_worker_handle_request
+static int load_reply
+(
+ struct ZoO_server_worker worker [const restrict static 1]
+)
+{
+ ZoO_index rarest_word_id;
+
+ if
+ (
+ ZoO_knowledge_lock_access
+ (
+ worker->params.knowledge,
+ worker->socket_as_file
+ ) < 0
+ )
+ {
+ return -1;
+ }
+
+ if
+ (
+ ZoO_knowledge_rarest_word
+ (
+ worker->params.knowledge,
+ worker->sequence_buffer,
+ worker->sequence_buffer_length,
+ &rarest_word_id
+ ) < 0
+ )
+ {
+ ZoO_S_ERROR(worker->socket_as_file, "Could not find rarest word.");
+
+ ZoO_knowledge_unlock_access
+ (
+ worker->params.knowledge,
+ worker->socket_as_file
+ );
+
+ return -1;
+ }
+
+ ZoO_knowledge_unlock_access
+ (
+ worker->params.knowledge,
+ worker->socket_as_file
+ );
+
+ ZoO_DEBUG
+ (
+ worker->socket_as_file,
+ 1,
+ "Word selected as pillar: %u",
+ rarest_word_id
+ );
+
+ if
+ (
+ ZoO_sequence_create_from
+ (
+ rarest_word_id,
+ (size_t *) NULL,
+ worker->params.knowledge,
+ ZoO_parameters_get_markov_order(worker->params.server_params),
+ &(worker->sequence_buffer),
+ &(worker->sequence_buffer_capacity),
+ &(worker->sequence_buffer_length),
+ worker->socket_as_file
+ ) < 0
+ )
+ {
+ ZoO_S_ERROR(worker->socket_as_file, "Could not create reply from selected word.");
+
+ return -1;
+ }
+
+ if
+ (
+ ZoO_sequence_to_undercase_string
+ (
+ worker->sequence_buffer,
+ worker->sequence_buffer_length,
+ worker->params.knowledge,
+ &(worker->buffer),
+ &(worker->buffer_capacity),
+ &(worker->buffer_length),
+ worker->socket_as_file
+ ) < 0
+ )
+ {
+ ZoO_S_ERROR(worker->socket_as_file, "Could not convert reply sequence to string.");
+
+ return -1;
+ }
+
+ return 0;
+}
+
+static int handle_rpv
(
struct ZoO_server_worker worker [const restrict static 1]
)
{
/* TODO */
+ return -1;
+}
+
+static int handle_rl
+(
+ struct ZoO_server_worker worker [const restrict static 1]
+)
+{
+ if
+ (
+ ZoO_sequence_from_undercase_string
+ (
+ (const ZoO_char *) (worker->buffer + 4),
+ (worker->buffer_length - 5),
+ worker->params.knowledge,
+ &(worker->sequence_buffer),
+ &(worker->sequence_buffer_capacity),
+ &(worker->sequence_buffer_length),
+ worker->socket_as_file
+ ) < 0
+ )
+ {
+ return ZoO_server_worker_send_negative(worker);
+ }
+
+ if
+ (
+ ZoO_knowledge_lock_access
+ (
+ worker->params.knowledge,
+ worker->socket_as_file
+ ) < 0
+ )
+ {
+ return ZoO_server_worker_send_negative(worker);
+ }
+
+ if
+ (
+ ZoO_knowledge_learn_sequence
+ (
+ worker->params.knowledge,
+ worker->sequence_buffer,
+ worker->sequence_buffer_length,
+ ZoO_parameters_get_markov_order(worker->params.server_params),
+ worker->socket_as_file
+ ) < 0
+ )
+ {
+ ZoO_knowledge_unlock_access
+ (
+ worker->params.knowledge,
+ worker->socket_as_file
+ );
+
+ return ZoO_server_worker_send_negative(worker);
+ }
+
+ ZoO_knowledge_unlock_access
+ (
+ worker->params.knowledge,
+ worker->socket_as_file
+ );
+
+ return ZoO_server_worker_send_positive(worker);
+}
+
+static int handle_rls
+(
+ struct ZoO_server_worker worker [const restrict static 1]
+)
+{
+ if
+ (
+ ZoO_sequence_from_undercase_string
+ (
+ (const ZoO_char *) (worker->buffer + 5),
+ (worker->buffer_length - 6),
+ worker->params.knowledge,
+ &(worker->sequence_buffer),
+ &(worker->sequence_buffer_capacity),
+ &(worker->sequence_buffer_length),
+ worker->socket_as_file
+ ) < 0
+ )
+ {
+ return ZoO_server_worker_send_negative(worker);
+ }
+
+ if
+ (
+ ZoO_knowledge_lock_access
+ (
+ worker->params.knowledge,
+ worker->socket_as_file
+ ) < 0
+ )
+ {
+ return ZoO_server_worker_send_negative(worker);
+ }
+
+ if
+ (
+ ZoO_knowledge_learn_sequence
+ (
+ worker->params.knowledge,
+ worker->sequence_buffer,
+ worker->sequence_buffer_length,
+ ZoO_parameters_get_markov_order(worker->params.server_params),
+ worker->socket_as_file
+ ) < 0
+ )
+ {
+ ZoO_knowledge_unlock_access
+ (
+ worker->params.knowledge,
+ worker->socket_as_file
+ );
+
+ return ZoO_server_worker_send_negative(worker);
+ }
+
+ ZoO_knowledge_unlock_access
+ (
+ worker->params.knowledge,
+ worker->socket_as_file
+ );
+
+ if
+ (
+ ZoO_storage_write_line
+ (
+ ZoO_parameters_get_storage_filename(worker->params.server_params),
+ (worker->buffer + 5),
+ (worker->buffer_length - 5), /* Keep the \n this time. */
+ worker->socket_as_file
+ ) < 0
+ )
+ {
+ return ZoO_server_worker_send_negative(worker);
+ }
+
+ return ZoO_server_worker_send_positive(worker);
+}
+
+static int handle_rlsr
+(
+ struct ZoO_server_worker worker [const restrict static 1]
+)
+{
+ if
+ (
+ ZoO_sequence_from_undercase_string
+ (
+ (const ZoO_char *) (worker->buffer + 6),
+ (worker->buffer_length - 7),
+ worker->params.knowledge,
+ &(worker->sequence_buffer),
+ &(worker->sequence_buffer_capacity),
+ &(worker->sequence_buffer_length),
+ worker->socket_as_file
+ ) < 0
+ )
+ {
+ return ZoO_server_worker_send_negative(worker);
+ }
+
+ if
+ (
+ ZoO_knowledge_lock_access
+ (
+ worker->params.knowledge,
+ worker->socket_as_file
+ ) < 0
+ )
+ {
+ return ZoO_server_worker_send_negative(worker);
+ }
+
+ if
+ (
+ ZoO_knowledge_learn_sequence
+ (
+ worker->params.knowledge,
+ worker->sequence_buffer,
+ worker->sequence_buffer_length,
+ ZoO_parameters_get_markov_order(worker->params.server_params),
+ worker->socket_as_file
+ ) < 0
+ )
+ {
+ ZoO_knowledge_unlock_access
+ (
+ worker->params.knowledge,
+ worker->socket_as_file
+ );
+
+ return ZoO_server_worker_send_negative(worker);
+ }
+
+ ZoO_knowledge_unlock_access
+ (
+ worker->params.knowledge,
+ worker->socket_as_file
+ );
+
+ if
+ (
+ ZoO_storage_write_line
+ (
+ ZoO_parameters_get_storage_filename(worker->params.server_params),
+ (worker->buffer + 6),
+ (worker->buffer_length - 6), /* Keep the \n this time. */
+ worker->socket_as_file
+ ) < 0
+ )
+ {
+ return ZoO_server_worker_send_negative(worker);
+ }
+
+ if (load_reply(worker) < 0)
+ {
+ return ZoO_server_worker_send_negative(worker);
+ }
+
+ if (ZoO_server_worker_send_generated_reply(worker) < 0)
+ {
+ return -1;
+ }
+
+ return ZoO_server_worker_send_positive(worker);
+}
+
+static int handle_rr
+(
+ struct ZoO_server_worker worker [const restrict static 1]
+)
+{
+ if
+ (
+ ZoO_sequence_from_undercase_string
+ (
+ (const ZoO_char *) (worker->buffer + 4),
+ (worker->buffer_length - 5),
+ worker->params.knowledge,
+ &(worker->sequence_buffer),
+ &(worker->sequence_buffer_capacity),
+ &(worker->sequence_buffer_length),
+ worker->socket_as_file
+ ) < 0
+ )
+ {
+ ZoO_S_DEBUG(worker->socket_as_file, 1, "?RR failed at string to sequence.");
+
+ return ZoO_server_worker_send_negative(worker);
+ }
+
+ if (load_reply(worker) < 0)
+ {
+ ZoO_S_DEBUG(worker->socket_as_file, 1, "?RR failed at load reply.");
+ return ZoO_server_worker_send_negative(worker);
+ }
+
+ if (ZoO_server_worker_send_generated_reply(worker) < 0)
+ {
+ return -1;
+ }
+
+ return ZoO_server_worker_send_positive(worker);
+}
+
+int ZoO_server_worker_handle_request
+(
+ struct ZoO_server_worker worker [const restrict static 1]
+)
+{
+ if (ZoO_IS_PREFIX("?RPV ", worker->buffer))
+ {
+ return handle_rpv(worker);
+ }
+ else if (ZoO_IS_PREFIX("?RL ", worker->buffer))
+ {
+ return handle_rl(worker);
+ }
+ else if (ZoO_IS_PREFIX("?RLS ", worker->buffer))
+ {
+ return handle_rls(worker);
+ }
+ else if (ZoO_IS_PREFIX("?RLSR ", worker->buffer))
+ {
+ return handle_rlsr(worker);
+ }
+ else if (ZoO_IS_PREFIX("?RR ", worker->buffer))
+ {
+ return handle_rr(worker);
+ }
+ else
+ {
+ ZoO_S_ERROR(worker->socket_as_file, "Unsupported request received.");
+
+ return ZoO_server_worker_send_negative(worker);
+ }
+
return 0;
}
diff --git a/src/server/server_worker_receive.c b/src/server/server_worker_receive.c
index 4dc2fc7..10944a9 100644
--- a/src/server/server_worker_receive.c
+++ b/src/server/server_worker_receive.c
@@ -1,6 +1,5 @@
#include "server.h"
-
int ZoO_server_worker_receive
(
struct ZoO_server_worker worker [const restrict static 1]
diff --git a/src/server/server_worker_send.c b/src/server/server_worker_send.c
new file mode 100644
index 0000000..6ba6d67
--- /dev/null
+++ b/src/server/server_worker_send.c
@@ -0,0 +1,106 @@
+#include "../pervasive.h"
+
+#include "server.h"
+
+int ZoO_server_worker_send_confirm_protocol_version
+(
+ struct ZoO_server_worker worker [const restrict static 1]
+)
+{
+ int err;
+
+ err = fprintf(worker->socket_as_file, "!CPV 1\n");
+
+ if (err <= 0)
+ {
+ /* TODO: error message? */
+
+ return -1;
+ }
+
+ return 0;
+}
+
+int ZoO_server_worker_send_positive
+(
+ struct ZoO_server_worker worker [const restrict static 1]
+)
+{
+ int err;
+
+ err = fprintf(worker->socket_as_file, "!P\n");
+
+ if (err <= 0)
+ {
+ /* TODO: error message? */
+
+ return -1;
+ }
+
+ return 0;
+}
+
+int ZoO_server_worker_send_negative
+(
+ struct ZoO_server_worker worker [const restrict static 1]
+)
+{
+ int err;
+
+ err = fprintf(worker->socket_as_file, "!N\n");
+
+ if (err <= 0)
+ {
+ /* TODO: error message? */
+
+ return -1;
+ }
+
+ return 0;
+}
+
+int ZoO_server_worker_send_generated_reply
+(
+ struct ZoO_server_worker worker [const restrict static 1]
+)
+{
+ int err;
+
+ /* TODO */
+ err = fputs
+ (
+ "!GR ",
+ worker->socket_as_file
+ );
+
+ if (err <= 0)
+ {
+ /* TODO: error message? */
+
+ return -1;
+ }
+
+ err =
+ fwrite
+ (
+ worker->buffer,
+ sizeof(ZoO_char),
+ worker->buffer_length,
+ worker->socket_as_file
+ );
+
+ err = fputs
+ (
+ "\n",
+ worker->socket_as_file
+ );
+
+ if (err <= 0)
+ {
+ /* TODO: error message? */
+
+ return -1;
+ }
+
+ return 0;
+}