Skip to content

Commit

Permalink
The following changes where made in order to fix a number key issues …
Browse files Browse the repository at this point in the history
…with how qstat processes packets.

This is just the initial step in moving the packet cleanup code out of the processing functions and into the core.

Moved all send_ and deal_with_ to returning int
Converted all cleanup_qserver calls to use explicit defines for clarity

Added support for electric fence for malloc debugging

Added support for disabling optimisation for better debugging

Bumped version number to identify the significance of these changes
  • Loading branch information
stevenh committed Apr 24, 2008
1 parent a00afb2 commit 2ee3c86
Show file tree
Hide file tree
Showing 31 changed files with 699 additions and 762 deletions.
52 changes: 25 additions & 27 deletions a2s.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,41 +44,42 @@ struct a2s_status
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 cleanup_qserver(server, FORCE );
}

status->sent_info = 1;
status->type = 0;

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 cleanup_qserver(server, 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;
{
return cleanup_qserver(server, FORCE );
}
status->sent_challenge = 1;
break;
}
Expand All @@ -88,7 +89,9 @@ void send_a2s_rule_request_packet(struct qserver *server)
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;
{
return cleanup_qserver(server, FORCE );
}
status->sent_rules = 1;
break;
}
Expand All @@ -98,7 +101,9 @@ void send_a2s_rule_request_packet(struct qserver *server)
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;
{
return cleanup_qserver( server, FORCE );
}
status->sent_player = 1;
break;
}
Expand All @@ -109,15 +114,12 @@ void send_a2s_rule_request_packet(struct qserver *server)
status->have_challenge = 0;
status->have_rules = 0;
}
} while(1);

return;
}

error:
cleanup_qserver(server, 1);
return 0;
}

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;
Expand Down Expand Up @@ -185,8 +187,7 @@ void deal_with_a2s_packet(struct qserver *server, char *rawpkt, int pktlen)
else
{
malformed_packet( server, "Unable to determine packet format" );
cleanup_qserver( server, 1 );
return;
return cleanup_qserver( server, FORCE );
}

// pkt_max is the total number of packets expected
Expand All @@ -211,14 +212,12 @@ void deal_with_a2s_packet(struct qserver *server, char *rawpkt, int pktlen)
if ( NULL == sdata->data )
{
malformed_packet(server, "Out of memory");
cleanup_qserver( server, 1 );
return;
return cleanup_qserver( server, FORCE );
}
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) )
{
Expand Down Expand Up @@ -598,14 +597,13 @@ void deal_with_a2s_packet(struct qserver *server, char *rawpkt, int pktlen)
server->next_rule = NULL;
}

cleanup_qserver(server, 0);
return;
return cleanup_qserver( server, NO_FORCE );

out_too_short:
malformed_packet(server, "packet too short");

out_error:
cleanup_qserver(server, 1);
return cleanup_qserver(server, FORCE );
}

// vim: sw=4 ts=8 noet
6 changes: 3 additions & 3 deletions a2s.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@

#include "qserver.h"

void send_a2s_request_packet(struct qserver *server);
void send_a2s_rule_request_packet(struct qserver *server);
void deal_with_a2s_packet(struct qserver *server, char *rawpkt, int pktlen);
int send_a2s_request_packet(struct qserver *server);
int send_a2s_rule_request_packet(struct qserver *server);
int deal_with_a2s_packet(struct qserver *server, char *rawpkt, int pktlen);

#endif
2 changes: 1 addition & 1 deletion autogen.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ ACLOCAL="aclocal"
# Please add higher versions first. The last version number is the minimum
# needed to compile KDE. Do not forget to include the name/version #
# separator if one is present, e.g. -1.2 where - is the separator.
AUTOCONF_VERS="-2.59 259 -2.58 258 -2.57 257 -2.54 254 -2.53 253"
AUTOCONF_VERS="-2.61 261 -2.59 259 -2.58 258 -2.57 257 -2.54 254 -2.53 253"
AUTOMAKE_VERS="-1.9 19 -1.8 18 -1.7 17 -1.6 16 -1.5 15"

# We don't use variable here for remembering the type ... strings. Local
Expand Down
21 changes: 20 additions & 1 deletion configure.ac
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
AC_INIT([qstat],[2.11],[qstat-users@yahoogroups.com])
AC_INIT([qstat],[2.12],[qstat-users@yahoogroups.com])
AC_CONFIG_SRCDIR([qstat.c])
AM_CONFIG_HEADER([gnuconfig.h])

Expand All @@ -21,6 +21,17 @@ case $host in
;;
esac

dnl check if user wants debug
AC_MSG_CHECKING([whether to enable optimization])
AC_ARG_ENABLE(optimize,[ --disable-optimize turn off optimization])
if test x$enable_optimize != xno; then
AC_MSG_RESULT([yes])
else
CPPFLAGS=""
CFLAGS="-ggdb"
AC_MSG_RESULT([no])
fi

dnl check if user wants debug
AC_MSG_CHECKING([whether to enable debug output])
AC_ARG_ENABLE(debug,[ --disable-debug turn off debugging code])
Expand All @@ -44,6 +55,14 @@ else
AC_MSG_RESULT([no])
fi

AC_ARG_WITH(efence,
[ --with-efence=<path> Use electric fence for malloc debugging.],
if test x$withval != xyes ; then
LDFLAGS="${LDFLAGS} -L$withval"
fi
AC_CHECK_LIB(efence,malloc)
)

dnl Use -Wall if we have gcc.
changequote(,)dnl
if test "x$GCC" = "xyes"; then
Expand Down
Loading

0 comments on commit 2ee3c86

Please sign in to comment.