| summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/server/server.c | 1 | ||||
| -rw-r--r-- | src/server/server.h | 20 | ||||
| -rw-r--r-- | src/server/server_initialize.c | 8 | ||||
| -rw-r--r-- | src/server/server_new_connection.c | 2 | ||||
| -rw-r--r-- | src/server/server_types.h | 10 | ||||
| -rw-r--r-- | src/server/server_worker.c | 4 | ||||
| -rw-r--r-- | src/server/server_worker_handle_request.c | 414 | ||||
| -rw-r--r-- | src/server/server_worker_receive.c | 1 | ||||
| -rw-r--r-- | src/server/server_worker_send.c | 106 |
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; +} |


