aboutsummaryrefslogtreecommitdiff
path: root/src/rcon.h
blob: 1c1e23273cbdb5eb6aaf1238b72c948d4ba58e98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/*
 * src/rcon.h
 * (c) 2020 Jonas Gunz <himself@jonasgunz.de>
 * License: MIT
*/

/*
 * Length 	int 	Length of remainder of packet
 * Request ID 	int 	Client-generated ID
 * Type 	int 	3 for login, 2 to run a command, 0 for a multi-packet response
 * Payload 	byte[] 	ASCII text
 * 2-byte pad 	byte^2 	Two null bytes
 *
 * sizeof int: 4B
 * */

#include <stdint.h>
#include <stdlib.h>
#include <string.h>

#include <poll.h>
#include <sys/socket.h>

#define RCON_LOGIN	3
#define RCON_COMMAND	2
#define RCON_RESPONSE	0

#define RCON_RECV_PKGSIZE 4110
#define RCON_SEND_PKGSIZE 1460

#define RCON_ERR_OK		0
#define RCON_ERR_GENERIC	1
#define RCON_ERR_AUTH		2
#define RCON_ERR_BUFFER		3
#define RCON_ERR_PACKET		4
#define RCON_ERR_TIMEOUT	5

typedef struct rcon_packet_s {
	int32_t		length;
	int32_t		id;
	int32_t		type;
	char*		payload;
	uint32_t	payload_len;
} rcon_packet_t;

int rcon_parse_packet ( rcon_packet_t* _packet, char* _buffer, uint32_t _len );

int rcon_construct_packet ( char* _buffer, uint32_t _len, rcon_packet_t* _packet );

int rcon_login ( int _socket, const char* _password );

int rcon_command ( char** _output, int _socket, const char* _command );

int rcon_recv_packet ( int _socket, rcon_packet_t* _packet, int _timeout_msecs );

int rcon_send_packet ( int _socket, rcon_packet_t* _packet );

const char* rcon_strerror ( int _errno );