back to scratko.xyz
aboutsummaryrefslogtreecommitdiff
path: root/server/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'server/server.c')
-rw-r--r--server/server.c41
1 files changed, 27 insertions, 14 deletions
diff --git a/server/server.c b/server/server.c
index f842a70..8ebc937 100644
--- a/server/server.c
+++ b/server/server.c
@@ -14,7 +14,6 @@
#include "card_stack.h"
#include "card_queue.h"
-
static void init_session(struct session *new_session, struct sockaddr_in *from,
int fd, int player_position)
{
@@ -62,12 +61,24 @@ static void close_connection(struct server *serv)
if(!serv->sess_arr[i])
continue;
serv->sess_arr[i]->state = disconnect;
- send_disconnect_status(serv->sess_arr[i]->fd);
- close(serv->sess_arr[i]->fd);
+ if(serv->sess_arr[i]->fd != -1) {
+ send_disconnect_status(serv->sess_arr[i]->fd);
+ close(serv->sess_arr[i]->fd);
+ }
+ clear_stack(&serv->sess_arr[i]->deck);
free(serv->sess_arr[i]);
serv->sess_arr[i] = NULL;
}
serv->connected_players_counter = 0;
+ free(serv->cc.number_arr);
+ free(serv->shuffled_deck);
+ free(serv->turn_queue);
+ free(serv->gi);
+ serv->cc.number_arr = NULL;
+ serv->shuffled_deck = NULL;
+ serv->turn_queue = NULL;
+ serv->gi = NULL;
+ clear_queue(&serv->cq);
}
static int check_playable_player_number(struct server *serv)
@@ -93,10 +104,6 @@ static void init_new_game(struct server *serv)
serv->trump_card =
extract_trump_card(serv->shuffled_deck, &serv->shuffled_deck_size);
serv->trump_suit = serv->trump_card + strlen(serv->trump_card) - 1;
-#if 0
- serv->trump_suit = find_trump_suit(serv->shuffled_deck,
- &serv->shuffled_deck_size);
-#endif
serv->turn_queue = malloc(sizeof(struct session*) *
serv->connected_players_counter);
serv->turn_queue_size = serv->connected_players_counter;
@@ -354,7 +361,7 @@ static void define_phase_after_tossing(struct server *serv)
}
else {
put_all_cards_from_queue_to_table(&serv->cot, &serv->cq);
- if(is_receiving_cards_limit(&serv->cot, serv->turn_queue[1]->deck,
+ if(!is_receiving_cards_limit(&serv->cot, serv->turn_queue[1]->deck,
&serv->cq) &&
check_someone_can_toss_card(serv->turn_queue,
serv->turn_queue_size,
@@ -383,7 +390,7 @@ static void define_phase_after_tossing(struct server *serv)
} else {
serv->turn_queue[1]->defense_lost = 1;
put_all_cards_from_queue_to_table(&serv->cot, &serv->cq);
- if(is_receiving_cards_limit(&serv->cot,
+ if(!is_receiving_cards_limit(&serv->cot,
serv->turn_queue[1]->deck,
&serv->cq) &&
check_someone_can_toss_card(serv->turn_queue,
@@ -692,7 +699,7 @@ static int check_server_state_change_conditions(struct server *serv)
static void make_data_transfer(struct server *serv, fd_set *readfds,
fd_set *writefds)
{
- int i, result;
+ int i, result, close_connection_status = 0;
for(i = 0; i < serv->max_sess_arr_size; ++i) {
if(!serv->sess_arr[i])
continue;
@@ -749,12 +756,12 @@ static void make_data_transfer(struct server *serv, fd_set *readfds,
get_cards_from_tossing_player(serv->sess_arr[i],
serv->turn_queue[1]->deck,
&serv->cot, &serv->cq);
- if(result == 1 || result == 2)
+ if(result == answer_got || result == anwer_got_with_limit)
serv->sess_arr[i]->tm = answer_got;
- if(result == 2)
+ if(result == anwer_got_with_limit)
serv->tossing_limit = 1;
- else if(result == 3)
+ else if(result == cancel)
serv->sess_arr[i]->tm = cancel;
}
break;
@@ -765,6 +772,12 @@ static void make_data_transfer(struct server *serv, fd_set *readfds,
print_game_result(serv->sess_arr[i], serv->durak_position);
break;
}
+ if(!result) {
+ close(i);
+ serv->sess_arr[i]->fd = -1;
+ close_connection_status = 1;
+ result = 1; /* next can be reading that's not ready */
+ }
}
if(serv->state == start_game || serv->state == table ||
serv->state == end_game)
@@ -772,7 +785,7 @@ static void make_data_transfer(struct server *serv, fd_set *readfds,
if(check_server_state_change_conditions(serv))
serv->change_server_state = 1;
/* connection is closed */
- if(!result) {
+ if(close_connection_status) {
close_connection(serv);
serv->change_server_state = 0;
serv->state = no_players;