Skip to content

Commit 09e2871

Browse files
committed
Merge branch 'master' of https://github.com/multiplay/qstat
syncing upstream to fork
2 parents cdee52c + d1469ab commit 09e2871

File tree

5 files changed

+84
-61
lines changed

5 files changed

+84
-61
lines changed

config.c

Lines changed: 40 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313
#include <string.h>
1414
#include <stdlib.h>
1515
#include <ctype.h>
16+
#ifndef _WIN32
17+
#include <unistd.h>
18+
#include <sys/param.h>
19+
#endif
20+
1621

1722
#include "config.h"
1823

@@ -26,10 +31,14 @@
2631
#define strcasecmp stricmp
2732
#endif
2833

34+
#define CONFIG_FILE "qstat.cfg"
35+
2936
#ifdef _WIN32
30-
#define HOME_CONFIG_FILE "qstat.cfg"
37+
#define HOME_CONFIG_FILE CONFIG_FILE
38+
#define SEP "\\"
3139
#else
3240
#define HOME_CONFIG_FILE ".qstatrc"
41+
#define SEP "/"
3342
#endif
3443

3544
static server_type **config_types;
@@ -177,12 +186,17 @@ print_location()
177186
}
178187

179188

189+
/*
190+
* 1. $QSTAT_CONFIG
191+
* 2. UNIX: $HOME/.qstatrc WIN: $HOME/qstat.cfg
192+
* 3. UNIX: sysconfdir/qstat.cfg WIN: qstat.exe-dir/qstat.cfg
193+
*/
180194
int
181195
qsc_load_default_config_files()
182196
{
183197
int rc = 0;
184198
char *filename = NULL, *var;
185-
char path[1024];
199+
char path[PATH_MAX];
186200

187201
var = getenv("QSTAT_CONFIG");
188202
if ((var != NULL) && (var[0] != '\0')) {
@@ -195,70 +209,47 @@ qsc_load_default_config_files()
195209
var = getenv("HOME");
196210
if ((var != NULL) && (var[0] != '\0')) {
197211
int len = strlen(var);
198-
if (len > 900) {
199-
len = 900;
212+
if (len > PATH_MAX - strlen(HOME_CONFIG_FILE) + 2) {
213+
fprintf(stderr, "Path for HOME \"%s\" too long\n", var);
214+
return (-1);
200215
}
201216
strncpy(path, var, len);
202217
path[len] = '\0';
203-
strcat(path, "/");
204-
strcat(path, HOME_CONFIG_FILE);
205-
/* sprintf( path, "%s/%s", var, HOME_CONFIG_FILE); */
218+
strcat(path, SEP HOME_CONFIG_FILE);
206219
rc = try_load_config_file(path, 0);
207220
if ((rc == 0) || (rc == -1)) {
208221
return (rc);
209222
}
210223
}
211224

212225
#ifdef sysconfdir
213-
strcpy(path, sysconfdir "/qstat.cfg");
214-
filename = path;
226+
strcpy(path, sysconfdir SEP CONFIG_FILE);
227+
filename = path;
215228
#elif defined(_WIN32)
216-
if ((filename == NULL) && _pgmptr && strchr(_pgmptr, '\\')) {
217-
char *slash = strrchr(_pgmptr, '\\');
218-
strncpy(path, _pgmptr, slash - _pgmptr);
219-
path[slash - _pgmptr] = '\0';
220-
strcat(path, "\\qstat.cfg");
221-
filename = path;
222-
}
229+
// Look in the binaries directory
230+
rc = GetModuleFileName(NULL, path, PATH_MAX);
231+
if (rc == PATH_MAX) {
232+
fprintf(stderr, "Module path too long\n");
233+
return (1);
234+
}
235+
var = strrchr(path, '\\');
236+
if (var == NULL) {
237+
fprintf(stderr, "Unexpected module path \"%s\" (no seperator %s)\n", path, SEP);
238+
return (-1);
239+
}
240+
*var = '\0';
241+
if (strlen(path) >= PATH_MAX - 11) {
242+
fprintf(stderr, "Module path \"%s\" too long\n", path);
243+
return (-1);
244+
}
245+
strcat(path, SEP CONFIG_FILE);
246+
filename = path;
223247
#endif
224248

225249
if (filename != NULL) {
226250
rc = try_load_config_file(filename, 0);
227-
if ((rc == 0) || (rc == -1)) {
228-
return (rc);
229-
}
230251
}
231252
return (rc);
232-
233-
/*
234-
* if ( rc == -2 && show_error) {
235-
* perror( filename);
236-
* fprintf( stderr, "Error: Could not open config file \"%s\"\n",
237-
* filename);
238-
* }
239-
* else if ( rc == -1 && show_error)
240-
* fprintf( stderr, "Error: Error loading $QSTAT_CONFIG file\n");
241-
* return rc;
242-
*/
243-
244-
#ifdef foo
245-
filename = getenv("HOME");
246-
if ((filename != NULL) && (filename[0] != '\0')) {
247-
char path[1024];
248-
snprintf(path, (sizeof(path) - 1), "%s/%s", var, HOME_CONFIG_FILE);
249-
}
250-
251-
/* 1. $QSTAT_CONFIG
252-
* 2. UNIX: $HOME/.qstatrc WIN: $HOME/qstat.cfg
253-
* 3. UNIX: sysconfdir/qstat.cfg WIN: qstat.exe-dir/qstat.cfg
254-
*/
255-
256-
rc = load_config_file("qstat.cfg");
257-
if (rc == -1) {
258-
fprintf(stderr, "Warning: Error loading default qstat.cfg\n");
259-
}
260-
return (0);
261-
#endif
262253
}
263254

264255

debug.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ malformed_packet(const struct qserver *server, const char *fmt, ...)
127127
close(fd);
128128
}
129129

130-
130+
int do_dump;
131131
ssize_t
132132
send_dump(int s, const void *buf, size_t len, int flags)
133133
{

debug.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ void dump_packet(const char *buf, int buflen);
4848
#endif
4949
#include <sys/types.h>
5050
#include <sys/stat.h>
51-
int do_dump;
51+
extern int do_dump;
5252
ssize_t send_dump(int s, const void *buf, size_t len, int flags);
5353

5454
#ifndef QSTAT_DEBUG_C

display_json.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
#include "qstat.h"
2020
#include "qserver.h"
2121

22-
int json_display;
23-
int json_encoding;
24-
int json_printed;
22+
extern int json_display;
23+
extern int json_encoding;
24+
extern int json_printed;
2525

2626
void json_footer();
2727
void json_header();

tf.c

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
#define SERVERINFO_REQUEST 79
2626
#define SERVERINFO_RESPONSE 80
2727
#define SERVERINFO_VERSION 1
28-
#define SERVERINFO_VERSION_KEYED 4
28+
#define SERVERINFO_VERSION_KEYED 5
2929
#define TEAM_IMC "imc"
3030
#define TEAM_MILITIA "militia"
3131
#define TEAM_UNKNOWN "unknown"
@@ -79,7 +79,7 @@ pkt_rule(struct qserver *server, char **pkt, int *rem, char *rule)
7979

8080

8181
static query_status_t
82-
pkt_data(struct qserver *server, char **pkt, int *rem, void *data, char *rule, int size)
82+
pkt_data(struct qserver *server, char **pkt, int *rem, void *data, char *rule, int size, int isfloat)
8383
{
8484
if (*rem - size < 0) {
8585
malformed_packet(server, "short packet data");
@@ -102,7 +102,11 @@ pkt_data(struct qserver *server, char **pkt, int *rem, void *data, char *rule, i
102102
break;
103103

104104
case 4:
105-
sprintf(buf, "%" PRIu32, *(uint32_t*)data);
105+
if (isfloat) {
106+
sprintf(buf, "%f", *(float*)data);
107+
} else {
108+
sprintf(buf, "%" PRIu32, *(uint32_t*)data);
109+
}
106110
break;
107111

108112
case 8:
@@ -119,30 +123,35 @@ pkt_data(struct qserver *server, char **pkt, int *rem, void *data, char *rule, i
119123
static query_status_t
120124
pkt_byte(struct qserver *server, char **pkt, int *rem, uint8_t *data, char *rule)
121125
{
122-
return (pkt_data(server, pkt, rem, (void *)data, rule, sizeof(*data)));
126+
return (pkt_data(server, pkt, rem, (void *)data, rule, sizeof(*data), 0));
123127
}
124128

125129

126130
static query_status_t
127131
pkt_short(struct qserver *server, char **pkt, int *rem, uint16_t *data, char *rule)
128132
{
129-
return (pkt_data(server, pkt, rem, (void *)data, rule, sizeof(*data)));
133+
return (pkt_data(server, pkt, rem, (void *)data, rule, sizeof(*data), 0));
130134
}
131135

132136

133137
static query_status_t
134138
pkt_long(struct qserver *server, char **pkt, int *rem, uint32_t *data, char *rule)
135139
{
136-
return (pkt_data(server, pkt, rem, (void *)data, rule, sizeof(*data)));
140+
return (pkt_data(server, pkt, rem, (void *)data, rule, sizeof(*data), 0));
137141
}
138142

139143

140144
static query_status_t
141145
pkt_longlong(struct qserver *server, char **pkt, int *rem, uint64_t *data, char *rule)
142146
{
143-
return (pkt_data(server, pkt, rem, (void *)data, rule, sizeof(*data)));
147+
return (pkt_data(server, pkt, rem, (void *)data, rule, sizeof(*data), 0));
144148
}
145149

150+
static query_status_t
151+
pkt_float(struct qserver *server, char **pkt, int *rem, float *data, char *rule)
152+
{
153+
return (pkt_data(server, pkt, rem, (void *)data, rule, sizeof(*data), 1));
154+
}
146155

147156
query_status_t
148157
send_tf_request_packet(struct qserver *server)
@@ -186,6 +195,7 @@ deal_with_tf_packet(struct qserver *server, char *rawpkt, int pktlen)
186195
uint16_t port, tmpu16;
187196
uint32_t tmpu32;
188197
uint64_t tmpu64;
198+
float tmpf;
189199

190200
rem = pktlen;
191201
pkt = rawpkt;
@@ -326,6 +336,28 @@ deal_with_tf_packet(struct qserver *server, char *rawpkt, int pktlen)
326336
return (ret);
327337
}
328338

339+
if (ver > 4) {
340+
ret = pkt_float(server, &pkt, &rem, &tmpf, "avg_frame_time");
341+
if (ret < 0) {
342+
return (ret);
343+
}
344+
345+
ret = pkt_float(server, &pkt, &rem, &tmpf, "max_frame_time");
346+
if (ret < 0) {
347+
return (ret);
348+
}
349+
350+
ret = pkt_float(server, &pkt, &rem, &tmpf, "avg_user_cmd_time");
351+
if (ret < 0) {
352+
return (ret);
353+
}
354+
355+
ret = pkt_float(server, &pkt, &rem, &tmpf, "max_user_cmd_time");
356+
if (ret < 0) {
357+
return (ret);
358+
}
359+
}
360+
329361
if (ver > 2) {
330362
// Phase (byte)
331363
ret = pkt_byte(server, &pkt, &rem, &tmpu8, "phase");

0 commit comments

Comments
 (0)