const char *host;
const char *port;
- int next_client_id;
-
ttt_client_t **clients;
int clients_size;
int num_clients;
server->host = host;
server->port = port;
- server->next_client_id = 0;
-
server->clients = NULL;
server->clients_size = 0;
server->num_clients = 0;
{
int i;
ttt_error_t error = TTT_ERROR_NONE;
- char *name;
+ const char *name;
pthread_mutex_lock (&server->mutex);
- name = xstrdup (ttt_client_get_name (client));
+ name = ttt_client_get_name (client);
- if (name == NULL) {
- xasprintf(&name, "user%03d", server->next_client_id++);
- ttt_client_set_name (client, name);
- }
+ assert (name != NULL);
+
+ if (name[0] == '\0')
+ return TTT_ERROR_INVALID_NAME;
- /* XXX: If generated name is not unique, this will return an error,
- which violates the protocol. */
for (i = 0; i < server->num_clients; i++) {
if (strcmp (ttt_client_get_name (server->clients[i]), name) == 0) {
- error = TTT_ERROR_INVALIDNAME;
+ error = TTT_ERROR_INVALID_NAME;
goto CLEANUP_LOCK;
}
}
printf ("Client %s has joined.\n", name);
- free (name);
server->num_clients++;
pthread_mutex_unlock (&server->mutex);
}
+/* Exported: See ttt-server.h for documentation. */
void
ttt_server_broadcast (ttt_server_t *server, const char *message)
{
pthread_mutex_unlock (&server->mutex);
}
+/* Exported: See ttt-server.h for documentation. */
+const char*
+ttt_server_who (ttt_server_t *server)
+{
+ int i;
+ char *response;
+
+ pthread_mutex_lock (&server->mutex);
+
+ xasprintf (&response, "WHO");
+
+ for (i = 0; i < server->num_clients; i++)
+ xasprintf (&response, "%s %s %d",
+ response,
+ ttt_client_get_name (server->clients[i]),
+ ttt_client_get_num_wins (server->clients[i]));
+
+ xasprintf (&response, "%s\n", response);
+
+ pthread_mutex_unlock (&server->mutex);
+
+ return response;
+}
+
/* Exported: See ttt-server.h for documentation. */
const char*
ttt_server_get_host (ttt_server_t *server)