Semino asserzioni qua e là e aggiungo -DNDEBUG ai flag di compilazione
Aggiungo l'handler per SIGABRT (asserzioni fallite) in log.c
Riscrivo get_winner() in tris_game.c
Aggiusto un bug nel client (lo username dell'avversario non veniva memorizzato)
Implemento la gestione dei turni per il client
Implemento il comando "cheat" per il client
Cambio il comportamento di log_message() quando il loglevel del messaggio è un
OR di più livelli: sui logfile wrapped comparirà con il livello più *basso* tra
quelli in comune al messaggio e al file.
Aggiungo la scrittura dei timestamp all'apertura e chiusura dei logfile
Implemento l'attesa con timeout in get_hello(), tramite poll()
Risolvo un bug su server e client (scambio infinito di BADREQ)
Aggiungo poll_in() al client e implemento il timeout per get_play_response()
Riscrivo make_move() e end_match() per eliminare codice ridondante. Implemento
l'invio di REQ_END al server in caso di errore nel contattare l'altro client (o
per timeout) e la terminazione della partita in caso di vittoria, pareggio o
sconfitta.
Implemento la terminazione della partita alla ricezione di REQ_END dall'altro
client
Implemento nel server la gestione dell'arrivo di REQ_END dal client richiedente
mentre la richiesta di gioco è ancora aperta
Implemento la gestione dell'arrivo di risposte ritardate a richieste annullate,
nel client
Rifattorizzo il server (1^ parte)
Rifattorizzo il server (2^ parte)
Aggiungo il newline in set_handler.h
Implemento nel server la gestione di REQ_END mentre è BUSY, con cancel_request()
Merge branch 'master' (early part) into gettext