X-Git-Url: https://git.cworth.org/git?p=ttt;a=blobdiff_plain;f=src%2Fttt-server.c;h=c50a797b259ec8bf1dbb6b74886bba2468ca4131;hp=2bc3a529b51efca60af87679488e248facd84b46;hb=907321c065fb1383e800f0794981df91d4327f57;hpb=15672ac8305a1c5ba0d9bf6edabb0a194c30628e;ds=sidebyside diff --git a/src/ttt-server.c b/src/ttt-server.c index 2bc3a52..c50a797 100644 --- a/src/ttt-server.c +++ b/src/ttt-server.c @@ -19,7 +19,8 @@ * Author: Carl Worth */ -#include "ttt.h" +#include "ttt-server.h" + #include "ttt-args.h" #include "ttt-client.h" #include "ttt-socket.h" @@ -46,17 +47,17 @@ ttt_server_init (ttt_server_t *server) server->num_clients = 0; } -static ttt_client_t * -ttt_server_create_client (ttt_server_t *server, int client_socket) +/* Exported: See ttt-server.h for documentation. */ +int +ttt_server_register_client (ttt_server_t *server, ttt_client_t *client) { - ttt_client_t *client; + int id; pthread_mutex_lock (&server->mutex); - client = ttt_client_create (server, client_socket, - server->next_client_id++); + id = server->next_client_id++; - printf ("Client %d has joined.\n", client->id); + printf ("Client %d has joined.\n", id); server->num_clients++; @@ -74,11 +75,12 @@ ttt_server_create_client (ttt_server_t *server, int client_socket) pthread_mutex_unlock (&server->mutex); - return client; + return id; } -static void -ttt_server_destroy_client (ttt_server_t *server, ttt_client_t *client) +/* Exported: See ttt-server.h for documentation. */ +void +ttt_server_unregister_client (ttt_server_t *server, ttt_client_t *client) { int i; @@ -90,57 +92,16 @@ ttt_server_destroy_client (ttt_server_t *server, ttt_client_t *client) assert (i < server->num_clients); - printf ("Client %d has left.\n", client->id); + printf ("Client %d has left.\n", ttt_client_get_id (client)); memmove (&server->clients[i], &server->clients[i+1], (server->num_clients - i - 1) * sizeof (ttt_client_t *)); server->num_clients--; - ttt_client_destroy (client); - pthread_mutex_unlock (&server->mutex); } -static void * -_handle_client_requests_thread (void *closure) -{ - ttt_client_t *client = closure; - ttt_server_t *server = client->server; - char *request; - - while (1) { - - request = ttt_client_read_line (client); - if (request == NULL) - break; - - ttt_server_broadcast (client->server, request); - } - - ttt_server_destroy_client (server, client); - - return (void *) 0; -} - -static void -_accept_client (void *closure, int client_socket) -{ - ttt_server_t *server = closure; - ttt_client_t *client; - int err; - - client = ttt_server_create_client (server, client_socket); - - err = pthread_create (&client->thread, NULL, - _handle_client_requests_thread, client); - if (err != 0) { - fprintf (stderr, "Error: pthread_create failed: %s. Aborting.\n", - strerror (err)); - exit (1); - } -} - void ttt_server_broadcast (ttt_server_t *server, const char *message) { @@ -176,6 +137,14 @@ static const char *WELCOME_MESSAGE = "protocol), but a custom client would still be a fine project for a\n" "motivated beginning programmer.\n\n"; +static void +_ttt_server_accept (void *closure, int client_socket) +{ + ttt_server_t *server = closure; + + ttt_client_new (server, client_socket); +} + int main (int argc, char **argv) { @@ -195,7 +164,7 @@ main (int argc, char **argv) ttt_server_init (&server); while (1) - ttt_socket_accept (socket, _accept_client, &server); + ttt_socket_accept (socket, _ttt_server_accept, &server); /* We only reach here if something bad happened. */ return 1;