summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortruelight <truelight@openttd.org>2004-12-08 18:16:43 +0000
committertruelight <truelight@openttd.org>2004-12-08 18:16:43 +0000
commit2bb5145a20aabf19c90e0af75f0105ad40bb2e2b (patch)
treec433196654ac3e83b0c0caf3c34310d6b52b2f56
parentecf7e8e9a7107f709f686b7d60e155d4b3cead20 (diff)
downloadopenttd-2bb5145a20aabf19c90e0af75f0105ad40bb2e2b.tar.xz
(svn r982) -Fix: [Network] Because dparams are misused as a char, we had some
endian-problems. To fix this, we are sending dparams byte by byte (instead of an uint32). Because of this dparam is sent not-uint32-endian-safe, but char-endian-safe. Too bad dparam can no longer be used for normal stuff (which is currently not the case) (tnx to Tron and Bjarni)
-rw-r--r--network_client.c21
-rw-r--r--network_server.c21
2 files changed, 34 insertions, 8 deletions
diff --git a/network_client.c b/network_client.c
index 1c70e0a2a..439942369 100644
--- a/network_client.c
+++ b/network_client.c
@@ -146,6 +146,7 @@ DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_COMMAND)(CommandPacket *cp)
//
int i;
+ char *dparam_char;
Packet *p = NetworkSend_Init(PACKET_CLIENT_COMMAND);
NetworkSend_uint8(p, cp->player);
@@ -153,8 +154,13 @@ DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_COMMAND)(CommandPacket *cp)
NetworkSend_uint32(p, cp->p1);
NetworkSend_uint32(p, cp->p2);
NetworkSend_uint32(p, (uint32)cp->tile);
- for (i = 0; i < lengthof(cp->dp); i++) {
- NetworkSend_uint32(p, cp->dp[i]);
+ /* We are going to send them byte by byte, because dparam is misused
+ for chars (if it is used), and else we have a BigEndian / LittleEndian
+ problem.. we should fix the misuse of dparam... -- TrueLight */
+ dparam_char = (char *)&cp->dp[0];
+ for (i = 0; i < lengthof(cp->dp) * 4; i++) {
+ NetworkSend_uint8(p, *dparam_char);
+ dparam_char++;
}
NetworkSend_uint8(p, cp->callback);
@@ -548,14 +554,21 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_SYNC)
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_COMMAND)
{
int i;
+ char *dparam_char;
CommandPacket *cp = malloc(sizeof(CommandPacket));
cp->player = NetworkRecv_uint8(p);
cp->cmd = NetworkRecv_uint32(p);
cp->p1 = NetworkRecv_uint32(p);
cp->p2 = NetworkRecv_uint32(p);
cp->tile = NetworkRecv_uint32(p);
- for (i = 0; i < lengthof(cp->dp); i++)
- cp->dp[i] = NetworkRecv_uint32(p);
+ /* We are going to send them byte by byte, because dparam is misused
+ for chars (if it is used), and else we have a BigEndian / LittleEndian
+ problem.. we should fix the misuse of dparam... -- TrueLight */
+ dparam_char = (char *)&cp->dp[0];
+ for (i = 0; i < lengthof(cp->dp) * 4; i++) {
+ *dparam_char = NetworkRecv_uint8(p);
+ dparam_char++;
+ }
cp->callback = NetworkRecv_uint8(p);
cp->frame = NetworkRecv_uint32(p);
cp->next = NULL;
diff --git a/network_server.c b/network_server.c
index 8cc0b30b3..6ce107d73 100644
--- a/network_server.c
+++ b/network_server.c
@@ -445,6 +445,7 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_COMMAND)(ClientState *cs, CommandPac
//
int i;
+ char *dparam_char;
Packet *p = NetworkSend_Init(PACKET_SERVER_COMMAND);
NetworkSend_uint8(p, cp->player);
@@ -452,8 +453,13 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_COMMAND)(ClientState *cs, CommandPac
NetworkSend_uint32(p, cp->p1);
NetworkSend_uint32(p, cp->p2);
NetworkSend_uint32(p, cp->tile);
- for (i = 0; i < lengthof(cp->dp); i++) {
- NetworkSend_uint32(p, cp->dp[i]);
+ /* We are going to send them byte by byte, because dparam is misused
+ for chars (if it is used), and else we have a BigEndian / LittleEndian
+ problem.. we should fix the misuse of dparam... -- TrueLight */
+ dparam_char = (char *)&cp->dp[0];
+ for (i = 0; i < lengthof(cp->dp) * 4; i++) {
+ NetworkSend_uint8(p, *dparam_char);
+ dparam_char++;
}
NetworkSend_uint8(p, cp->callback);
NetworkSend_uint32(p, cp->frame);
@@ -732,6 +738,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND)
byte callback;
ClientState *new_cs;
NetworkClientInfo *ci;
+ char *dparam_char;
CommandPacket *cp = malloc(sizeof(CommandPacket));
@@ -747,8 +754,14 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND)
cp->p1 = NetworkRecv_uint32(p);
cp->p2 = NetworkRecv_uint32(p);
cp->tile = NetworkRecv_uint32(p);
- for (i = 0; i < lengthof(cp->dp); i++)
- cp->dp[i] = NetworkRecv_uint32(p);
+ /* We are going to send them byte by byte, because dparam is misused
+ for chars (if it is used), and else we have a BigEndian / LittleEndian
+ problem.. we should fix the misuse of dparam... -- TrueLight */
+ dparam_char = (char *)&cp->dp[0];
+ for (i = 0; i < lengthof(cp->dp) * 4; i++) {
+ *dparam_char = NetworkRecv_uint8(p);
+ dparam_char++;
+ }
callback = NetworkRecv_uint8(p);