Merge pull request #83 from Tiiffi/develop

Merge develop to master
This commit is contained in:
Tiiffi
2021-10-30 22:34:42 +03:00
committed by GitHub
5 changed files with 46 additions and 31 deletions

View File

@ -1,5 +1,14 @@
#### Version history: #### 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 ###### 0.7.1
- Deprecate `-i` flag for invoking terminal mode - Deprecate `-i` flag for invoking terminal mode
- Add workaround to prevent server-side bug. - Add workaround to prevent server-side bug.

View File

@ -1,4 +1,4 @@
Copyright (c) 2012-2020, Tiiffi <tiiffi at gmail> Copyright (c) 2012-2021, Tiiffi <tiiffi at gmail>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages

View File

@ -76,8 +76,7 @@ rcon.password=your_rcon_pasword
##### Contact: ##### Contact:
* WWW: https://github.com/Tiiffi/mcrcon/ * WWW: https://github.com/Tiiffi/mcrcon/
* MAIL: tiiffi at gmail * MAIL: tiiffi+mcrcon at gmail
* IRC: tiiffi @ quakenet
* BUG REPORTS: https://github.com/Tiiffi/mcrcon/issues/ * BUG REPORTS: https://github.com/Tiiffi/mcrcon/issues/
--- ---

View File

@ -1,7 +1,7 @@
.\" Process this file with .\" Process this file with
.\" groff -man -Tascii mcrcon.1 .\" 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 .SH NAME
mcrcon \- send rcon commands to a Minecraft server mcrcon \- send rcon commands to a Minecraft server
.SH SYNOPSIS .SH SYNOPSIS

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012-2020, Tiiffi <tiiffi at gmail> * Copyright (c) 2012-2021, Tiiffi <tiiffi at gmail>
* *
* This software is provided 'as-is', without any express or implied * This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages * warranty. In no event will the authors be held liable for any damages
@ -24,8 +24,8 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdint.h> #include <stdint.h>
#include <stdbool.h>
#include <string.h> #include <string.h>
#include <strings.h>
#include <signal.h> #include <signal.h>
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
@ -47,7 +47,7 @@
#include <netdb.h> #include <netdb.h>
#endif #endif
#define VERSION "0.7.1" #define VERSION "0.7.2"
#define IN_NAME "mcrcon" #define IN_NAME "mcrcon"
#define VER_STR IN_NAME" "VERSION" (built: "__DATE__" "__TIME__")" #define VER_STR IN_NAME" "VERSION" (built: "__DATE__" "__TIME__")"
@ -123,8 +123,11 @@ void exit_proc(void)
} }
// Check windows & linux behaviour !!! // Check windows & linux behaviour !!!
void sighandler(/*int sig*/) void sighandler(int sig)
{ {
if (sig == SIGINT)
putchar('\n');
global_connection_alive = 0; global_connection_alive = 0;
#ifndef _WIN32 #ifndef _WIN32
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
@ -167,6 +170,10 @@ int main(int argc, char *argv[])
if (!port) port = "25575"; if (!port) port = "25575";
if (!host) host = "localhost"; 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(); if(argc < 1 && pass == NULL) usage();
// default getopt error handler enabled // default getopt error handler enabled
@ -238,10 +245,7 @@ int main(int argc, char *argv[])
exit_code = EXIT_FAILURE; exit_code = EXIT_FAILURE;
} }
net_close(global_rsock); exit(exit_code);
global_rsock = -1;
return exit_code;
} }
void usage(void) void usage(void)
@ -429,6 +433,7 @@ rc_packet *net_recv_packet(int sd)
return NULL; return NULL;
} }
// NOTE(Tiiffi): This should fail if size is out of spec!
if (psize < 10 || psize > DATA_BUFFSIZE) { if (psize < 10 || psize > DATA_BUFFSIZE) {
fprintf(stderr, "Warning: invalid packet size (%d). Must over 10 and less than %d.\n", psize, DATA_BUFFSIZE); fprintf(stderr, "Warning: invalid packet size (%d). Must over 10 and less than %d.\n", psize, DATA_BUFFSIZE);
@ -484,7 +489,7 @@ void print_color(int color)
"\033[0;1;30m", /* 08 DGREY 0x38 */ "\033[0;1;30m", /* 08 DGREY 0x38 */
"\033[0;1;34m", /* 09 LBLUE 0x39 */ "\033[0;1;34m", /* 09 LBLUE 0x39 */
"\033[0;1;32m", /* 10 LGREEN 0x61 */ "\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;31m", /* 12 LRED 0x63 */
"\033[0;1;35m", /* 13 LPURPLE 0x64 */ "\033[0;1;35m", /* 13 LPURPLE 0x64 */
"\033[0;1;33m", /* 14 YELLOW 0x65 */ "\033[0;1;33m", /* 14 YELLOW 0x65 */
@ -564,16 +569,16 @@ rc_packet *packet_build(int id, int cmd, char *s1)
static rc_packet packet = {0, 0, 0, { 0x00 }}; static rc_packet packet = {0, 0, 0, { 0x00 }};
// size + id + cmd + s1 + s2 NULL terminator // size + id + cmd + s1 + s2 NULL terminator
int s1_len = strlen(s1); int len = strlen(s1);
if (s1_len > DATA_BUFFSIZE) { if (len >= DATA_BUFFSIZE) {
fprintf(stderr, "Warning: Command string too long (%d). Maximum allowed: %d.\n", s1_len, DATA_BUFFSIZE); fprintf(stderr, "Warning: Command string too long (%d). Maximum allowed: %d.\n", len, DATA_BUFFSIZE - 1);
return NULL; return NULL;
} }
packet.size = sizeof(int) * 2 + s1_len + 2; packet.size = sizeof(int) * 2 + len + 2;
packet.id = id; packet.id = id;
packet.cmd = cmd; packet.cmd = cmd;
strncpy(packet.data, s1, DATA_BUFFSIZE); strncpy(packet.data, s1, DATA_BUFFSIZE - 1);
return &packet; return &packet;
} }
@ -650,19 +655,18 @@ int run_terminal_mode(int sock)
int ret = 0; int ret = 0;
char command[DATA_BUFFSIZE] = {0x00}; 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) { while (global_connection_alive) {
putchar('>'); putchar('>');
int len = get_line(command, DATA_BUFFSIZE); int len = get_line(command, DATA_BUFFSIZE);
if (len < 1) continue;
if ((strcasecmp(command, "exit") && strcasecmp(command, "quit")) == 0)
if (strcasecmp(command, "Q") == 0)
break; break;
if(command[0] == 'Q' && command[1] == 0) if (len > 0 && global_connection_alive)
break;
if(len > 0 && global_connection_alive)
ret += rcon_command(sock, command); ret += rcon_command(sock, command);
/* Special case for "stop" command to prevent server-side bug. /* Special case for "stop" command to prevent server-side bug.
@ -676,7 +680,7 @@ int run_terminal_mode(int sock)
break; break;
} }
command[0] = len = 0; //command[0] = len = 0;
} }
return ret; return ret;
@ -686,11 +690,14 @@ int run_terminal_mode(int sock)
int get_line(char *buffer, int bsize) int get_line(char *buffer, int bsize)
{ {
char *ret = fgets(buffer, bsize, stdin); char *ret = fgets(buffer, bsize, stdin);
if (ret == NULL) if (ret == NULL) {
exit(EXIT_FAILURE); if (ferror(stdin)) {
fprintf(stderr, "Error %d: %s\n", errno, strerror(errno));
if (buffer[0] == 0) exit(EXIT_FAILURE);
global_connection_alive = 0; }
putchar('\n');
exit(EXIT_SUCCESS);
}
// remove unwanted characters from the buffer // remove unwanted characters from the buffer
buffer[strcspn(buffer, "\r\n")] = '\0'; buffer[strcspn(buffer, "\r\n")] = '\0';