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