From 7e728d971b95f115c7e9c2def21815034d9bde54 Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Wed, 1 Jul 2020 21:29:06 +0200 Subject: Reduce some rcon duplication by using a common function --- shared/rcon-protocol.c | 29 +++++++++++++++++++++++++++++ shared/rcon-protocol.h | 16 ++++++++++------ 2 files changed, 39 insertions(+), 6 deletions(-) (limited to 'shared') diff --git a/shared/rcon-protocol.c b/shared/rcon-protocol.c index 0cf73fc..1941662 100644 --- a/shared/rcon-protocol.c +++ b/shared/rcon-protocol.c @@ -75,6 +75,35 @@ static void write_end(char **pos, size_t *len) *len += RCON_END_LEN; } +bool rcon_protocol_verify_response(int32_t id_sent, int32_t id_recv, + enum rcon_packet_type t_sent, + enum rcon_packet_type t_recv, + const char **error) +{ + if (t_sent == RCON_PACKET_LOGIN) { + if (t_recv != RCON_PACKET_LOGIN_RESPONSE) { + *error = "invalid reply id"; + return false; + } else if (id_recv == RCON_PACKET_LOGIN_FAIL_ID) { + *error = "login failure"; + return false; + } else if (id_recv != id_sent) { + *error = "invalid reply id"; + return false; + } + } else { + if (t_recv != RCON_PACKET_RESPONSE) { + *error = "invalid reply type"; + return false; + } else if (id_recv != id_sent) { + *error = "invalid reply id"; + return false; + } + } + + return true; +} + bool rcon_protocol_create_packet(char *buf, size_t len, size_t *rlen, int32_t reqid, enum rcon_packet_type type, const char *msg) diff --git a/shared/rcon-protocol.h b/shared/rcon-protocol.h index b3aea98..593a43f 100644 --- a/shared/rcon-protocol.h +++ b/shared/rcon-protocol.h @@ -4,14 +4,13 @@ #include #include -/* FIXME: FAIL is an id, not type, LOGIN_OK should be LOGIN_RESPONSE */ /* clang-format off */ +#define RCON_PACKET_LOGIN_FAIL_ID -1 enum rcon_packet_type { - RCON_PACKET_LOGIN = 3, - RCON_PACKET_LOGIN_OK = 2, - RCON_PACKET_LOGIN_FAIL = -1, - RCON_PACKET_COMMAND = 2, - RCON_PACKET_RESPONSE = 0, + RCON_PACKET_LOGIN = 3, + RCON_PACKET_LOGIN_RESPONSE = 2, + RCON_PACKET_COMMAND = 2, + RCON_PACKET_RESPONSE = 0, }; /* clang-format on */ @@ -30,6 +29,11 @@ static inline size_t rcon_protocol_packet_len(size_t msglen) return (RCON_PKT_MIN_LEN + msglen); } +bool rcon_protocol_verify_response(int32_t id_sent, int32_t id_recv, + enum rcon_packet_type t_sent, + enum rcon_packet_type t_recv, + const char **error); + bool rcon_protocol_create_packet(char *buf, size_t len, size_t *rlen, int32_t reqid, enum rcon_packet_type type, const char *msg); -- cgit v1.2.3