Escape flight name in JSON in case it has odd characters.
This commit is contained in:
parent
ebae590653
commit
cae20a8060
30
net_io.c
30
net_io.c
|
@ -699,6 +699,34 @@ int decodeHexMessage(struct client *c, char *hex) {
|
||||||
//
|
//
|
||||||
// Return a description of planes in json. No metric conversion
|
// Return a description of planes in json. No metric conversion
|
||||||
//
|
//
|
||||||
|
|
||||||
|
// usual caveats about function-returning-pointer-to-static-buffer apply
|
||||||
|
static const char *jsonEscapeString(const char *str) {
|
||||||
|
static char buf[1024];
|
||||||
|
const char *in = str;
|
||||||
|
char *out = buf, *end = buf + sizeof(buf) - 10;
|
||||||
|
|
||||||
|
for (; *in && out < end; ++in) {
|
||||||
|
unsigned char ch = *in;
|
||||||
|
if (ch == '"' || ch == '\\') {
|
||||||
|
*out++ = '\\';
|
||||||
|
*out++ = ch;
|
||||||
|
} else if (ch < 32 || ch > 127) {
|
||||||
|
*out++ = '\\';
|
||||||
|
*out++ = 'u';
|
||||||
|
*out++ = '0';
|
||||||
|
*out++ = '0';
|
||||||
|
*out++ = (ch >> 4) & 0x0f;
|
||||||
|
*out++ = ch & 0x0f;
|
||||||
|
} else {
|
||||||
|
*out++ = ch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*out++ = 0;
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
char *generateAircraftJson(const char *url_path, int *len) {
|
char *generateAircraftJson(const char *url_path, int *len) {
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
struct aircraft *a = Modes.aircrafts;
|
struct aircraft *a = Modes.aircrafts;
|
||||||
|
@ -729,7 +757,7 @@ char *generateAircraftJson(const char *url_path, int *len) {
|
||||||
if (a->bFlags & MODES_ACFLAGS_SQUAWK_VALID)
|
if (a->bFlags & MODES_ACFLAGS_SQUAWK_VALID)
|
||||||
p += snprintf(p, end-p, ",\"squawk\":\"%04x\"", a->modeA);
|
p += snprintf(p, end-p, ",\"squawk\":\"%04x\"", a->modeA);
|
||||||
if (a->bFlags & MODES_ACFLAGS_CALLSIGN_VALID)
|
if (a->bFlags & MODES_ACFLAGS_CALLSIGN_VALID)
|
||||||
p += snprintf(p, end-p, ",\"flight\":\"%s\"", a->flight);
|
p += snprintf(p, end-p, ",\"flight\":\"%s\"", jsonEscapeString(a->flight));
|
||||||
if (a->bFlags & MODES_ACFLAGS_LATLON_VALID)
|
if (a->bFlags & MODES_ACFLAGS_LATLON_VALID)
|
||||||
p += snprintf(p, end-p, ",\"lat\":%f,\"lon\":%f,\"seen_pos\":%d", a->lat, a->lon, (int)(now - a->seenLatLon));
|
p += snprintf(p, end-p, ",\"lat\":%f,\"lon\":%f,\"seen_pos\":%d", a->lat, a->lon, (int)(now - a->seenLatLon));
|
||||||
if ((a->bFlags & MODES_ACFLAGS_AOG_VALID) && (a->bFlags & MODES_ACFLAGS_AOG))
|
if ((a->bFlags & MODES_ACFLAGS_AOG_VALID) && (a->bFlags & MODES_ACFLAGS_AOG))
|
||||||
|
|
Loading…
Reference in a new issue