# HG changeset patch # User Mike Becker # Date 1774790248 -7200 # Node ID 864f59271974dcff239079f1c08152287167314e # Parent 9b64437262a2d28efa333d0d9fc683afb3e65d01 implement option to play via Unix domain socket resolves #816 diff -r 9b64437262a2 -r 864f59271974 src/client.c --- a/src/client.c Sun Mar 29 13:26:00 2026 +0200 +++ b/src/client.c Sun Mar 29 15:17:28 2026 +0200 @@ -34,8 +34,10 @@ #include #include -static int client_connect(Server *server, char *host, short port) { - if (net_find(server, host, port)) { +static int client_connect(Server *server, Settings *settings) { + if (settings->usedomainsocket + ? net_find_sock(server, settings->serverhost) + : net_find_tcp(server, settings->serverhost, settings->port)) { addstr("Can't find server"); return 1; } @@ -65,7 +67,7 @@ int client_run(Settings *settings) { Server server; - if (client_connect(&server, settings->serverhost, settings->port)) { + if (client_connect(&server, settings)) { net_destroy(&server); return 1; } diff -r 9b64437262a2 -r 864f59271974 src/colors.c --- a/src/colors.c Sun Mar 29 13:26:00 2026 +0200 +++ b/src/colors.c Sun Mar 29 15:17:28 2026 +0200 @@ -30,7 +30,7 @@ #include "colors.h" #include -void init_colorpairs() { +void init_colorpairs(void) { init_pair(COL_APP, COLOR_WHITE, COLOR_BLACK); init_pair(COL_BW, COLOR_BLACK, COLOR_CYAN); init_pair(COL_BB, COLOR_BLACK, COLOR_BLUE); diff -r 9b64437262a2 -r 864f59271974 src/colors.h --- a/src/colors.h Sun Mar 29 13:26:00 2026 +0200 +++ b/src/colors.h Sun Mar 29 15:17:28 2026 +0200 @@ -36,7 +36,7 @@ #define COL_BB 4 #define COL_WW 5 -void init_colorpairs(); +void init_colorpairs(void); #endif /* COLORS_H */ diff -r 9b64437262a2 -r 864f59271974 src/game.c --- a/src/game.c Sun Mar 29 13:26:00 2026 +0200 +++ b/src/game.c Sun Mar 29 15:17:28 2026 +0200 @@ -541,8 +541,10 @@ void game_play(Settings *settings, GameState *gamestate, int opponent) { inputy = getmaxy(stdscr) - 6; - uint8_t mycolor = is_server(settings) ? settings->gameinfo.servercolor : - opponent_color(settings->gameinfo.servercolor); + uint8_t mycolor = settings->gameinfo.servercolor; + if (!settings->ishost) { + mycolor = opponent_color(mycolor); + } bool myturn = (gamestate->lastmove ? (gamestate->lastmove->move.piece & COLOR_MASK) : BLACK) != mycolor; diff -r 9b64437262a2 -r 864f59271974 src/game.h --- a/src/game.h Sun Mar 29 13:26:00 2026 +0200 +++ b/src/game.h Sun Mar 29 15:17:28 2026 +0200 @@ -39,18 +39,30 @@ typedef struct { GameInfo gameinfo; - char* serverhost; /* NULL, if we are about to start a server */ + /** + * Server host address. + * TCP: server address or \c NULL when we are the server + * Domain Socket: the path to the domain socket + */ + char* serverhost; char* continuepgn; short port; + bool ishost; + bool usedomainsocket; bool singlemachine; bool disableflip; bool unicode; } Settings; -#define is_server(settings) !((settings)->serverhost) - void game_play_singlemachine(Settings *settings); +/** + * Plays a network game of chess. + * + * @param settings the game settings + * @param gamestate the current game state + * @param opponent file descriptor for the opponent + */ void game_play(Settings *settings, GameState *gamestate, int opponent); void game_review(Settings* settings, GameState *gamestate); diff -r 9b64437262a2 -r 864f59271974 src/main.c --- a/src/main.c Sun Mar 29 13:26:00 2026 +0200 +++ b/src/main.c Sun Mar 29 15:17:28 2026 +0200 @@ -37,14 +37,16 @@ #include #include #include +#include int get_settings(int argc, char **argv, Settings *settings) { char *valid; unsigned long int time, port; uint8_t timeunit = 60; size_t len; + bool port_set = false; - for (int opt ; (opt = getopt(argc, argv, "a:bc:Fhp:rsS:t:Uv")) != -1 ;) { + for (int opt ; (opt = getopt(argc, argv, "a:bc:Fhp:rsS:t:uUv")) != -1 ;) { switch (opt) { case 'c': settings->continuepgn = optarg; @@ -61,6 +63,14 @@ case 'F': settings->disableflip = true; break; + case 'u': + if (port_set) { + fprintf(stderr, "Cannot use Unix domain sockets " + "when a TCP port was specified.\n"); + return 1; + } + settings->usedomainsocket = true; + break; case 'U': settings->unicode = false; break; @@ -87,6 +97,15 @@ } break; case 'p': + if (port_set) { + fprintf(stderr, "Cannot use -p twice.\n"); + return 1; + } + if (settings->usedomainsocket) { + fprintf(stderr, "Cannot specify TCP port " + "when using Unix domain sockets.\n"); + return 1; + } port = strtol(optarg, &valid, 10); if (port < 1025 || port > 65535 || *valid != '\0') { fprintf(stderr, @@ -96,6 +115,7 @@ return 1; } else { settings->port = (short) port; + port_set = true; } break; case 'v': @@ -111,6 +131,7 @@ " -c Continue the specified game\n" " -h This help page\n" " -p TCP port to use (default: 27015)\n" +" -u Use Unix domain socket instead of TCP\n" " -U Disables unicode pieces\n" " -v Print version information and exits\n" "\nServer options\n" @@ -119,13 +140,16 @@ " -r Distribute color randomly\n" " -t