From 58a7a86bc3a9e62f63040c973c553e565808d995 Mon Sep 17 00:00:00 2001 From: kabiroberai Date: Fri, 31 Jan 2020 17:26:27 +0530 Subject: [PATCH 1/8] Flush stdout when needed This is required on certain machines (eg the iSH emulator on iOS) --- mcrcon.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mcrcon.c b/mcrcon.c index 3324875..5f23447 100644 --- a/mcrcon.c +++ b/mcrcon.c @@ -557,6 +557,8 @@ void packet_print(rc_packet *packet) // print newline if string has no newline if (packet->data[i-1] != 10 && packet->data[i-1] != 13) putchar('\n'); + + fflush(stdout); } rc_packet *packet_build(int id, int cmd, char *s1) @@ -654,6 +656,7 @@ int run_terminal_mode(int sock) while (global_connection_alive) { putchar('>'); + fflush(stdout); int len = get_line(command, DATA_BUFFSIZE); if ((strcasecmp(command, "exit") && strcasecmp(command, "quit")) == 0) From 336f52866849d98dd7ac7e30d1993f92d5c13c93 Mon Sep 17 00:00:00 2001 From: Addison G Date: Wed, 12 Aug 2020 14:10:58 +1000 Subject: [PATCH 2/8] Fixed compiler bug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes the compiler issue: ``` mcrcon.c: In function ‘packet_build’: mcrcon.c:576:2: warning: ‘strncpy’ specified bound 4096 equals destination size [-Wstringop-truncation] strncpy(packet.data, s1, DATA_BUFFSIZE); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``` --- mcrcon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcrcon.c b/mcrcon.c index 3324875..5cf5ffe 100644 --- a/mcrcon.c +++ b/mcrcon.c @@ -573,7 +573,7 @@ rc_packet *packet_build(int id, int cmd, char *s1) packet.size = sizeof(int) * 2 + s1_len + 2; packet.id = id; packet.cmd = cmd; - strncpy(packet.data, s1, DATA_BUFFSIZE); + strncpy(packet.data, s1, DATA_BUFFSIZE - 1); return &packet; } From ada14bb4d9617cc9a70fe3b82c40b679b25c88ba Mon Sep 17 00:00:00 2001 From: jbaldus Date: Wed, 13 Jan 2021 19:22:02 -0500 Subject: [PATCH 3/8] Fixes typo in ANSI escape sequence for LCYAN --- mcrcon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcrcon.c b/mcrcon.c index 3324875..8d66ba9 100644 --- a/mcrcon.c +++ b/mcrcon.c @@ -484,7 +484,7 @@ void print_color(int color) "\033[0;1;30m", /* 08 DGREY 0x38 */ "\033[0;1;34m", /* 09 LBLUE 0x39 */ "\033[0;1;32m", /* 10 LGREEN 0x61 */ - "\033[0:1;36m", /* 11 LCYAN 0x62 */ + "\033[0;1;36m", /* 11 LCYAN 0x62 */ "\033[0;1;31m", /* 12 LRED 0x63 */ "\033[0;1;35m", /* 13 LPURPLE 0x64 */ "\033[0;1;33m", /* 14 YELLOW 0x65 */ From 48c065c3042d38db0df75c89853bb92b32562191 Mon Sep 17 00:00:00 2001 From: Tiiffi Date: Mon, 15 Feb 2021 03:29:44 +0200 Subject: [PATCH 4/8] Use setvbuf() instead of fflush() --- mcrcon.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mcrcon.c b/mcrcon.c index 61ea417..f681b1c 100644 --- a/mcrcon.c +++ b/mcrcon.c @@ -167,6 +167,10 @@ int main(int argc, char *argv[]) if (!port) port = "25575"; if (!host) host = "localhost"; + // disable output buffering (https://github.com/Tiiffi/mcrcon/pull/39) + setvbuf(stdout, NULL, _IONBF, 0); + setvbuf(stderr, NULL, _IONBF, 0); + if(argc < 1 && pass == NULL) usage(); // default getopt error handler enabled @@ -557,8 +561,6 @@ void packet_print(rc_packet *packet) // print newline if string has no newline if (packet->data[i-1] != 10 && packet->data[i-1] != 13) putchar('\n'); - - fflush(stdout); } rc_packet *packet_build(int id, int cmd, char *s1) @@ -656,7 +658,7 @@ int run_terminal_mode(int sock) while (global_connection_alive) { putchar('>'); - fflush(stdout); + int len = get_line(command, DATA_BUFFSIZE); if ((strcasecmp(command, "exit") && strcasecmp(command, "quit")) == 0) From b3147ebe43a81f243d24b9c47785f1b5cfbae6d4 Mon Sep 17 00:00:00 2001 From: Tiiffi Date: Mon, 15 Feb 2021 04:31:07 +0200 Subject: [PATCH 5/8] Fix erroneous string length check --- mcrcon.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mcrcon.c b/mcrcon.c index f681b1c..e6b8077 100644 --- a/mcrcon.c +++ b/mcrcon.c @@ -568,13 +568,13 @@ rc_packet *packet_build(int id, int cmd, char *s1) static rc_packet packet = {0, 0, 0, { 0x00 }}; // size + id + cmd + s1 + s2 NULL terminator - int s1_len = strlen(s1); - if (s1_len > DATA_BUFFSIZE) { - fprintf(stderr, "Warning: Command string too long (%d). Maximum allowed: %d.\n", s1_len, DATA_BUFFSIZE); + int len = strlen(s1); + if (len >= DATA_BUFFSIZE) { + fprintf(stderr, "Warning: Command string too long (%d). Maximum allowed: %d.\n", len, DATA_BUFFSIZE - 1); return NULL; } - packet.size = sizeof(int) * 2 + s1_len + 2; + packet.size = sizeof(int) * 2 + len + 2; packet.id = id; packet.cmd = cmd; strncpy(packet.data, s1, DATA_BUFFSIZE - 1); From fca278e092f4818262385769335615ac7f83f47b Mon Sep 17 00:00:00 2001 From: Tiiffi Date: Sat, 30 Oct 2021 22:16:29 +0300 Subject: [PATCH 6/8] - Quit gracefully when Ctrl-D or Ctrl-C is pressed - Remove "exit" and "quit" as quit commands --- mcrcon.c | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/mcrcon.c b/mcrcon.c index e6b8077..dadccad 100644 --- a/mcrcon.c +++ b/mcrcon.c @@ -24,8 +24,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -123,8 +123,11 @@ void exit_proc(void) } // Check windows & linux behaviour !!! -void sighandler(/*int sig*/) +void sighandler(int sig) { + if (sig == SIGINT) + putchar('\n'); + global_connection_alive = 0; #ifndef _WIN32 exit(EXIT_SUCCESS); @@ -242,10 +245,7 @@ int main(int argc, char *argv[]) exit_code = EXIT_FAILURE; } - net_close(global_rsock); - global_rsock = -1; - - return exit_code; + exit(exit_code); } void usage(void) @@ -433,6 +433,7 @@ rc_packet *net_recv_packet(int sd) return NULL; } + // NOTE(Tiiffi): This should fail if size is out of spec! if (psize < 10 || psize > DATA_BUFFSIZE) { fprintf(stderr, "Warning: invalid packet size (%d). Must over 10 and less than %d.\n", psize, DATA_BUFFSIZE); @@ -654,20 +655,18 @@ int run_terminal_mode(int sock) int ret = 0; char command[DATA_BUFFSIZE] = {0x00}; - puts("Logged in. Type 'quit' or 'exit' to quit."); + puts("Logged in.\nType 'Q' or press Ctrl-D / Ctrl-C to disconnect."); while (global_connection_alive) { putchar('>'); int len = get_line(command, DATA_BUFFSIZE); - - if ((strcasecmp(command, "exit") && strcasecmp(command, "quit")) == 0) - break; - - if(command[0] == 'Q' && command[1] == 0) + if (len < 1) continue; + + if (strcasecmp(command, "Q") == 0) break; - if(len > 0 && global_connection_alive) + if (len > 0 && global_connection_alive) ret += rcon_command(sock, command); /* Special case for "stop" command to prevent server-side bug. @@ -681,7 +680,7 @@ int run_terminal_mode(int sock) break; } - command[0] = len = 0; + //command[0] = len = 0; } return ret; @@ -691,11 +690,14 @@ int run_terminal_mode(int sock) int get_line(char *buffer, int bsize) { char *ret = fgets(buffer, bsize, stdin); - if (ret == NULL) - exit(EXIT_FAILURE); - - if (buffer[0] == 0) - global_connection_alive = 0; + if (ret == NULL) { + if (ferror(stdin)) { + fprintf(stderr, "Error %d: %s\n", errno, strerror(errno)); + exit(EXIT_FAILURE); + } + putchar('\n'); + exit(EXIT_SUCCESS); + } // remove unwanted characters from the buffer buffer[strcspn(buffer, "\r\n")] = '\0'; From 05aaff88d417c99de5259515db508c81169f7632 Mon Sep 17 00:00:00 2001 From: Tiiffi Date: Sat, 30 Oct 2021 22:21:25 +0300 Subject: [PATCH 7/8] Update version information, changelog and readme --- CHANGELOG.md | 9 +++++++++ LICENSE | 2 +- README.md | 3 +-- mcrcon.1 | 2 +- mcrcon.c | 2 +- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8768cb..7e51993 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ #### Version history: +###### 0.7.2 + - Quit gracefully when Ctrl-D or Ctrl+C is pressed + - Remove "exit" and "quit" as quitting commands + * these are actual rcon commands on some servers + - Suppress compiler warning (strncpy) + - fix erroneous string length in packet building function + - Fix typo in ANSI escape sequence for LCYAN + - Make stdout and stderr unbuffered + ###### 0.7.1 - Deprecate `-i` flag for invoking terminal mode - Add workaround to prevent server-side bug. diff --git a/LICENSE b/LICENSE index 454fb9f..86bda18 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2012-2020, Tiiffi +Copyright (c) 2012-2021, Tiiffi This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/README.md b/README.md index 300695a..9961fab 100644 --- a/README.md +++ b/README.md @@ -76,8 +76,7 @@ rcon.password=your_rcon_pasword ##### Contact: * WWW: https://github.com/Tiiffi/mcrcon/ -* MAIL: tiiffi at gmail -* IRC: tiiffi @ quakenet +* MAIL: tiiffi+mcrcon at gmail * BUG REPORTS: https://github.com/Tiiffi/mcrcon/issues/ --- diff --git a/mcrcon.1 b/mcrcon.1 index db9d282..9255407 100644 --- a/mcrcon.1 +++ b/mcrcon.1 @@ -1,7 +1,7 @@ .\" Process this file with .\" groff -man -Tascii mcrcon.1 .\" -.TH MCRCON 1 "January 2020" "Version 0.7.1" +.TH MCRCON 1 "October 2021" "Version 0.7.2" .SH NAME mcrcon \- send rcon commands to a Minecraft server .SH SYNOPSIS diff --git a/mcrcon.c b/mcrcon.c index dadccad..b8f8012 100644 --- a/mcrcon.c +++ b/mcrcon.c @@ -47,7 +47,7 @@ #include #endif -#define VERSION "0.7.1" +#define VERSION "0.7.2" #define IN_NAME "mcrcon" #define VER_STR IN_NAME" "VERSION" (built: "__DATE__" "__TIME__")" From 7b8ea2bf39f2f3803de53b09f9eec7964b29ae17 Mon Sep 17 00:00:00 2001 From: Tiiffi Date: Sat, 30 Oct 2021 22:30:12 +0300 Subject: [PATCH 8/8] Update copyright year --- mcrcon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcrcon.c b/mcrcon.c index b8f8012..79c8aba 100644 --- a/mcrcon.c +++ b/mcrcon.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2020, Tiiffi + * Copyright (c) 2012-2021, Tiiffi * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages