diff options
author | truelight <truelight@openttd.org> | 2004-12-08 18:16:43 +0000 |
---|---|---|
committer | truelight <truelight@openttd.org> | 2004-12-08 18:16:43 +0000 |
commit | 2bb5145a20aabf19c90e0af75f0105ad40bb2e2b (patch) | |
tree | c433196654ac3e83b0c0caf3c34310d6b52b2f56 | |
parent | ecf7e8e9a7107f709f686b7d60e155d4b3cead20 (diff) | |
download | openttd-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.c | 21 | ||||
-rw-r--r-- | network_server.c | 21 |
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); |