rpms/qstat/devel qstat-2.11-20080912svn311.patch, NONE, 1.1 qstat.spec, 1.8, 1.9

Tom Callaway spot at fedoraproject.org
Fri Sep 12 19:09:39 UTC 2008


Author: spot

Update of /cvs/pkgs/rpms/qstat/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv32321

Modified Files:
	qstat.spec 
Added Files:
	qstat-2.11-20080912svn311.patch 
Log Message:
update to svn, relicensed to Artistic 2.0

qstat-2.11-20080912svn311.patch:

--- NEW FILE qstat-2.11-20080912svn311.patch ---
diff -urP qstat-2.11/a2s.c qstat-2.11-20080912svn311/a2s.c
--- qstat-2.11/a2s.c	2006-05-28 07:48:38.000000000 -0400
+++ qstat-2.11-20080912svn311/a2s.c	2008-09-12 14:52:23.000000000 -0400
@@ -44,12 +44,14 @@
 	unsigned char type;
 };
 
-void send_a2s_request_packet(struct qserver *server)
+int send_a2s_request_packet(struct qserver *server)
 {
 	struct a2s_status* status = (struct a2s_status*)server->master_query_tag;
 
 	if(qserver_send_initial(server, A2S_INFO, sizeof(A2S_INFO)) == -1)
-		goto error;
+	{
+		return DONE_FORCE;
+	}
 
 	status->sent_info = 1;
 	status->type = 0;
@@ -57,28 +59,27 @@
 	if(get_server_rules || get_player_info)
 		server->next_rule = ""; // trigger calling send_a2s_rule_request_packet
 
-	return;
-
-error:
-	cleanup_qserver(server, 1);
+	return 0;
 }
 
-void send_a2s_rule_request_packet(struct qserver *server)
+int send_a2s_rule_request_packet(struct qserver *server)
 {
 	struct a2s_status* status = (struct a2s_status*)server->master_query_tag;
 
 	if(!get_server_rules && !get_player_info)
 	{
-		goto error;
+		return DONE_FORCE;
 	}
 
-	do
+	while( 1 )
 	{
 		if(!status->have_challenge)
 		{
 			debug(3, "sending challenge");
-			if(qserver_send_initial(server, A2S_GETCHALLENGE, sizeof(A2S_GETCHALLENGE)-1) == -1)
-				goto error;
+			if( SOCKET_ERROR == qserver_send_initial(server, A2S_GETCHALLENGE, sizeof(A2S_GETCHALLENGE)-1) )
+			{
+				return SOCKET_ERROR;
+			}
 			status->sent_challenge = 1;
 			break;
 		}
@@ -87,8 +88,10 @@
 			char buf[sizeof(A2S_RULES)-1+4] = A2S_RULES;
 			memcpy(buf+sizeof(A2S_RULES)-1, &status->challenge, 4);
 			debug(3, "sending rule query");
-			if(qserver_send_initial(server, buf, sizeof(buf)) == -1)
-				goto error;
+			if( SOCKET_ERROR == qserver_send_initial(server, buf, sizeof(buf)) )
+			{
+				return SOCKET_ERROR;
+			}
 			status->sent_rules = 1;
 			break;
 		}
@@ -97,8 +100,10 @@
 			char buf[sizeof(A2S_PLAYER)-1+4] = A2S_PLAYER;
 			memcpy(buf+sizeof(A2S_PLAYER)-1, &status->challenge, 4);
 			debug(3, "sending player query");
-			if(qserver_send_initial(server, buf, sizeof(buf)) == -1)
-				goto error;
+			if( SOCKET_ERROR == qserver_send_initial(server, buf, sizeof(buf)) )
+			{
+				return SOCKET_ERROR;
+			}
 			status->sent_player = 1;
 			break;
 		}
@@ -109,15 +114,12 @@
 			status->have_challenge = 0;
 			status->have_rules = 0;
 		}
-	} while(1);
-
-	return;
+	}
 
-error:
-	cleanup_qserver(server, 1);
+	return INPROGRESS;
 }
 
-void deal_with_a2s_packet(struct qserver *server, char *rawpkt, int pktlen)
+int deal_with_a2s_packet(struct qserver *server, char *rawpkt, int pktlen)
 {
 	struct a2s_status* status = (struct a2s_status*)server->master_query_tag;
 	char* pkt = rawpkt;
@@ -159,12 +161,12 @@
 		// packetId
 		if ( 1 == status->type )
 		{
-			// HL2 format
+			// HL1 format
 			// The lower four bits represent the number of packets (2 to 15) and
 			// the upper four bits represent the current packet starting with 0
 			pkt_max = ((unsigned char)*pkt) & 15;
 			pkt_index = ((unsigned char)*pkt) >> 4;
-			debug( 3, "packetid: 0x%hhx => idx: %hhu, max: %hhu", *pkt, pkt_index, pkt_max );
+			debug( 3, "packetid[1]: 0x%hhx => idx: %hhu, max: %hhu", *pkt, pkt_index, pkt_max );
 			pkt++;
 			pktlen -= 9;
 		}
@@ -172,20 +174,20 @@
 		{
 			// HL2 format
 			// The next two bytes are:
-			// 1. the max packets sent
-			// 2. the index of this packet starting from 0
+			// 1. the max packets sent ( byte )
+			// 2. the index of this packet starting from 0 ( byte )
+			// 3. Size of the split ( short )
 			if(pktlen < 10) goto out_too_short;
 			pkt_max = ((unsigned char)*pkt);
 			pkt_index = ((unsigned char)*(pkt+1));
-			debug( 3, "packetid: 0x%hhx => idx: %hhu, max: %hhu", *pkt, pkt_index, pkt_max );
-			pkt+=2;
-			pktlen -= 10;
+			debug( 3, "packetid[2]: 0x%hhx => idx: %hhu, max: %hhu", *pkt, pkt_index, pkt_max );
+			pkt+=4;
+			pktlen -= 12;
 		}
 		else
 		{
 			malformed_packet( server, "Unable to determine packet format" );
-			cleanup_qserver( server, 1 );
-			return;
+			return PKT_ERROR;
 		}
 
 		// pkt_max is the total number of packets expected
@@ -210,25 +212,24 @@
 		if ( NULL == sdata->data )
 		{
 			malformed_packet(server, "Out of memory");
-			cleanup_qserver( server, 1 );
-			return;
+			return MEM_ERROR;
 		}
 		memcpy( sdata->data, pkt, sdata->datalen);
 
 		// combine_packets will call us recursively
-		combine_packets( server );
-		return;
+		return combine_packets( server );
 	}
 	else if( 0 != memcmp(pkt, "\xFF\xFF\xFF\xFF", 4) )
 	{
 		malformed_packet(server, "invalid packet header");
-		goto out_error;
+		return PKT_ERROR;
 	}
 
 	pkt += 4;
 	pktlen -= 4;
 
 	pktlen -= 1;
+	debug( 2, "A2S type = %hhd", *pkt );
 	switch(*pkt++)
 	{
 	case A2S_CHALLENGERESPONSE:
@@ -438,6 +439,9 @@
 		server->num_players = (unsigned char)pkt[2];
 		server->max_players = (unsigned char)pkt[3];
 		// pkt[4] number of bots
+		sprintf( buf, "%hhu", pkt[4] );
+		add_rule( server, "bots", buf, 0 );
+
 		add_rule(server, "dedicated", pkt[5]?"1":"0", 0);
 		if(pkt[6] == 'l')
 		{
@@ -582,7 +586,7 @@
 
 	default:
 		malformed_packet(server, "invalid packet id %hhx", *--pkt);
-		goto out_error;
+		return PKT_ERROR;
 	}
 
 	if(
@@ -593,14 +597,11 @@
 		server->next_rule = NULL;
 	}
 
-	cleanup_qserver(server, 0);
[...47066 lines suppressed...]
+ *
+ */
+
+#include <sys/types.h>
+#ifndef _WIN32
+#include <sys/socket.h>
+#endif
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+
+#include "debug.h"
+#include "qstat.h"
+#include "packet_manip.h"
+
+
+int send_wic_request_packet( struct qserver *server )
+{
+	char buf[256];
+
+	int serverport = get_param_i_value( server, "port", 0 );
+	char *password = get_param_value( server, "password", "N/A" );
+	change_server_port( server, serverport, 1 );
+
+	if ( get_player_info )
+	{
+		server->flags |= TF_PLAYER_QUERY|TF_RULES_QUERY;
+		sprintf( buf, "%s\x0d\x0a/listsettings\x0d\x0a/listplayers\x0d\x0a/exit\x0d\x0a", password );
+		server->saved_data.pkt_index = 2;
+	}
+	else
+	{
+		server->flags |= TF_STATUS_QUERY;
+		sprintf( buf, "%s\x0d\x0a/listsettings\x0d\x0a/exit\x0d\x0a", password );
+		server->saved_data.pkt_index = 1;
+	}
+
+	return send_packet( server, buf, strlen( buf ) );
+}
+
+
+int deal_with_wic_packet( struct qserver *server, char *rawpkt, int pktlen )
+{
+	char *s, *end, *team = NULL;
+	int mode = server->n_servers, slot, score;
+	char name[256], role[256];
+
+	debug( 2, "processing n_requests %d, retry1 %d, n_retries %d, delta %d", server->n_requests, server->retry1, n_retries, time_delta( &packet_recv_time, &server->packet_time1 ) );
+
+	server->ping_total += time_delta( &packet_recv_time, &server->packet_time1 );
+	server->n_requests++;
+	gettimeofday( &server->packet_time1, NULL);
+
+	rawpkt[pktlen]= '\0';
+	end = &rawpkt[pktlen];
+
+	s = rawpkt;
+
+	while ( NULL != s )
+	{
+		int len = strlen( s );
+		*(s + len - 2) = '\0'; // strip off \x0D\x0A
+		debug( 2, "Line[%d]: %s", mode, s );
+
+		if ( 0 == mode )
+		{
+			// Settings
+			// TODO: make parse safe
+			if ( 0 == strncmp( s, "Settings: ", 9 ) )
+			{
+				// Server Rule
+				char *key = s + 10;
+				char *value = strchr( key, ' ' );
+				*value = '\0';
+				value++;
+				debug( 2, "key: '%s' = '%s'", key, value );
+				if ( 0 == strcmp( "myGameName", key ) )
+				{
+					server->server_name = strdup( value );
+				}
+				else if ( 0 == strcmp( "myMapFilename", key ) )
+				{
+					server->map_name = strdup( value );
+				}
+				else if ( 0 == strcmp( "myMaxPlayers", key ) )
+				{
+					server->max_players = atoi( value );
+				}
+				else if ( 0 == strcmp( "myCurrentNumberOfPlayers", key ) )
+				{
+					server->num_players = atoi( value);
+				}
+				else
+				{
+					add_rule( server, key, value, NO_FLAGS );
+				}
+			}
+			else if ( 0 == strcmp( "Listing players", s ) )
+			{
+				// end of rules request
+				server->saved_data.pkt_index--;
+				mode++;
+			}
+			else if ( 0 == strcmp( "Exit confirmed.", s ) )
+			{
+				server->n_servers = mode;
+				return DONE_FORCE;
+			}
+		}
+		else if ( 1 == mode )
+		{
+			// Player info
+			if ( 0 == strncmp( s, "Team: ", 6 ) )
+			{
+				team = s + 6;
+				debug( 2, "Team: %s", team );
+			}
+			else if ( 4 == sscanf( s, "Slot: %d Role: %s Score: %d Name: %255[^\x0d\x0a]", &slot, role, &score, name ) )
+			{
+				// Player info
+				struct player *player = add_player( server, server->n_player_info );
+				if ( NULL != player )
+				{
+					player->flags |= PLAYER_FLAG_DO_NOT_FREE_TEAM;
+					player->name = strdup( name );
+					player->score = score;
+					player->team_name = team;
+					player->tribe_tag = strdup( role );
+					// Indicate if its a bot
+					player->type_flag = ( 0 == strcmp( name, "Computer: Balanced" ) ) ? 1 : 0;
+				}
+				debug( 2, "player %d, role %s, score %d, name %s", slot, role, score, name );
+			}
+			else if ( 3 == sscanf( s, "Slot: %d Role:  Score: %d Name: %255[^\x0d\x0a]", &slot, &score, name ) )
+			{
+				// Player info
+				struct player *player = add_player( server, server->n_player_info );
+				if ( NULL != player )
+				{
+					player->flags |= PLAYER_FLAG_DO_NOT_FREE_TEAM;
+					player->name = strdup( name );
+					player->score = score;
+					player->team_name = team;
+					// Indicate if its a bot
+					player->type_flag = ( 0 == strcmp( name, "Computer: Balanced" ) ) ? 1 : 0;
+				}
+				debug( 2, "player %d, score %d, name %s", slot, score, name );
+			}
+			else if ( 0 == strcmp( "Exit confirmed.", s ) )
+			{
+				server->n_servers = mode;
+				return DONE_FORCE;
+			}
+		}
+
+		s += len;
+		if ( s + 1 < end )
+		{
+			s++; // next line
+		}
+		else
+		{
+			s = NULL;
+		}
+	}
+
+	server->n_servers = mode;
+
+	if ( 0 == server->saved_data.pkt_index )
+	{
+		server->map_name = strdup( "N/A" );
+		return DONE_FORCE;
+	}
+
+	return INPROGRESS;
+}
diff -urP qstat-2.11/wic.h qstat-2.11-20080912svn311/wic.h
--- qstat-2.11/wic.h	1969-12-31 19:00:00.000000000 -0500
+++ qstat-2.11-20080912svn311/wic.h	2008-09-12 14:52:23.000000000 -0400
@@ -0,0 +1,20 @@
+/*
+ * qstat 2.8
+ * by Steve Jankowski
+ *
+ * World in Conflict Protocol
+ * Copyright 2007 Steven Hartland
+ *
+ * Licensed under the Artistic License, see LICENSE.txt for license terms
+ */
+#ifndef QSTAT_GPS_H
+#define QSTAT_GPS_H
+
+#include "qserver.h"
+
+// Packet processing methods
+int deal_with_wic_packet( struct qserver *server, char *pkt, int pktlen );
+int send_wic_request_packet( struct qserver *server );
+
+#endif
+


Index: qstat.spec
===================================================================
RCS file: /cvs/pkgs/rpms/qstat/devel/qstat.spec,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- qstat.spec	18 Feb 2008 19:24:45 -0000	1.8
+++ qstat.spec	12 Sep 2008 19:09:09 -0000	1.9
@@ -1,12 +1,13 @@
 Summary: Real-time Game Server Status for FPS game servers
 Name: qstat
 Version: 2.11
-Release: 5%{?dist}
-License: Artistic
+Release: 6.20080912svn311%{?dist}
+License: Artistic 2.0
 Group: Amusements/Games
 URL: http://sourceforge.net/projects/qstat/
 Source: http://downloads.sourceforge.net/qstat/qstat-%{version}.tar.gz
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+Patch0: qstat-2.11-20080912svn311.patch
 # The name "qstat" is actually a requirement in POSIX 1003.2d.
 # it has been implemented by many batch queueing systems over the decades.
 # In this case try to handle with the conflicting package(s).
@@ -19,6 +20,7 @@
 
 %prep
 %setup -q
+%patch0 -p1
 
 %build
 %configure
@@ -43,6 +45,10 @@
 %{_bindir}/qstat
 
 %changelog
+* Fri Sep 12 2008 Tom "spot" Callaway <tcallawa at redhat.com> - 2.11-6.20080912svn311
+- update to latest svn
+- upstream relicensed to Artistic 2.0
+
 * Mon Feb 18 2008 Fedora Release Engineering <rel-eng at fedoraproject.org> - 2.11-5
 - Autorebuild for GCC 4.3
 




More information about the fedora-extras-commits mailing list