File: tee.c

package info (click to toggle)
qstat 2.15-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 2,652 kB
  • ctags: 3,017
  • sloc: ansic: 24,995; sh: 4,109; makefile: 60
file content (92 lines) | stat: -rw-r--r-- 2,406 bytes parent folder | download | duplicates (3)
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*
 * qstat
 * by Steve Jankowski
 *
 * Teeworlds protocol
 * Copyright 2008 ? Emiliano Leporati
 *
 * Licensed under the Artistic License, see LICENSE.txt for license terms
 *
 */

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

#include "debug.h"
#include "qstat.h"
#include "packet_manip.h"

char tee_serverinfo[8] = { '\xFF', '\xFF', '\xFF', '\xFF', 'i', 'n', 'f', 'o' };

query_status_t send_tee_request_packet( struct qserver *server )
{
	return send_packet( server, server->type->status_packet, server->type->status_len );
}

query_status_t deal_with_tee_packet( struct qserver *server, char *rawpkt, int pktlen )
{
	// skip unimplemented ack, crc, etc
	char *pkt = rawpkt + 6;
	char *tok = NULL, *version = NULL;
	int i;
	struct player* player;

	server->ping_total += time_delta(&packet_recv_time, &server->packet_time1);

	if (0 == memcmp( pkt, tee_serverinfo, 8)) 
	{
		pkt += 8;
		// version
		version = strdup(pkt); pkt += strlen(pkt) + 1;
		// server name
		server->server_name = strdup(pkt); pkt += strlen(pkt) + 1;
		// map name
		server->map_name = strdup(pkt); pkt += strlen(pkt) + 1;
		// game type
		switch(atoi(pkt)) {
		case 0:
			add_rule( server, server->type->game_rule, "dm", NO_FLAGS);
			break;
		case 1:
			add_rule( server, server->type->game_rule, "tdm", NO_FLAGS);
			break;
		case 2:
			add_rule( server, server->type->game_rule, "ctf", NO_FLAGS);
			break;
		default:
			add_rule( server, server->type->game_rule, "unknown", NO_FLAGS);
			break;
		}
		pkt += strlen(pkt) + 1; 
		pkt += strlen(pkt) + 1;
		pkt += strlen(pkt) + 1;
		// num players
		server->num_players = atoi(pkt); pkt += strlen(pkt) + 1;
		// max players
		server->max_players = atoi(pkt); pkt += strlen(pkt) + 1;
		// players
		for(i = 0; i < server->num_players; i++)
		{
			player = add_player( server, i );
			player->name = strdup(pkt); pkt += strlen(pkt) + 1;
			player->score = atoi(pkt); pkt += strlen(pkt) + 1;
		}
		// version reprise
		server->protocol_version = 0;

		if (NULL == (tok = strtok(version, "."))) return -1;
		server->protocol_version |= (atoi(tok) & 0x000F) << 12;
		if (NULL == (tok = strtok(NULL, "."))) return -1;
		server->protocol_version |= (atoi(tok) & 0x000F) << 8;
		if (NULL == (tok = strtok(NULL, "."))) return -1;
		server->protocol_version |= (atoi(tok) & 0x00FF);

		free(version);

		return DONE_FORCE;
	}

	// unknown packet type
	return PKT_ERROR;
}