From 3fc1013e1aee654a3c09b32b2c67f871bbaac288 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Mon, 7 Mar 2022 22:05:43 -0800 Subject: [PATCH] use phosg big-endian types --- src/DNSServer.cc | 2 +- src/NetworkAddresses.cc | 8 ++++---- src/Quest.cc | 10 ++-------- src/SendCommands.cc | 14 ++++++++------ 4 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/DNSServer.cc b/src/DNSServer.cc index f1008bd1..57081c88 100644 --- a/src/DNSServer.cc +++ b/src/DNSServer.cc @@ -105,7 +105,7 @@ void DNSServer::on_receive_message(int fd, short) { } else { input.resize(bytes); - uint32_t remote_address = bswap32(remote.sin_addr.s_addr); + uint32_t remote_address = ntohl(remote.sin_addr.s_addr); uint32_t connect_address = is_local_address(remote_address) ? this->local_connect_address : this->external_connect_address; diff --git a/src/NetworkAddresses.cc b/src/NetworkAddresses.cc index 8be1488e..73add1a2 100644 --- a/src/NetworkAddresses.cc +++ b/src/NetworkAddresses.cc @@ -41,7 +41,7 @@ uint32_t resolve_address(const char* address) { } struct sockaddr_in* res_sin = (struct sockaddr_in*)res4->ai_addr; - return bswap32(res_sin->sin_addr.s_addr); + return ntohl(res_sin->sin_addr.s_addr); } map get_local_addresses() { @@ -64,7 +64,7 @@ map get_local_addresses() { continue; } - ret.emplace(i->ifa_name, bswap32(sin->sin_addr.s_addr)); + ret.emplace(i->ifa_name, ntohl(sin->sin_addr.s_addr)); } return ret; @@ -83,7 +83,7 @@ bool is_local_address(const sockaddr_storage& daddr) { return false; } const sockaddr_in* sin = reinterpret_cast(&daddr); - return is_local_address(bswap32(sin->sin_addr.s_addr)); + return is_local_address(ntohl(sin->sin_addr.s_addr)); } string string_for_address(uint32_t address) { @@ -93,5 +93,5 @@ string string_for_address(uint32_t address) { } uint32_t address_for_string(const char* address) { - return bswap32(inet_addr(address)); + return ntohl(inet_addr(address)); } diff --git a/src/Quest.cc b/src/Quest.cc index 5a6f0a36..fa6c8ce6 100644 --- a/src/Quest.cc +++ b/src/Quest.cc @@ -19,14 +19,9 @@ using namespace std; struct PSODownloadQuestHeader { // When sending a DLQ to the client, this is the DECOMPRESSED size. When // reading it from a GCI file, this is the COMPRESSED size. - uint32_t size; + be_uint32_t size; // Note: use PSO PC encryption, even for GC quests. - uint32_t encryption_seed; - - void byteswap() { - this->size = bswap32(this->size); - this->encryption_seed = bswap32(this->encryption_seed); - } + be_uint32_t encryption_seed; }; @@ -367,7 +362,6 @@ string Quest::decode_gci(const string& filename) { } PSODownloadQuestHeader* h = reinterpret_cast( data.data() + 0x2080); - h->byteswap(); string compressed_data_with_header = data.substr(0x2088, h->size); diff --git a/src/SendCommands.cc b/src/SendCommands.cc index 8b426d8e..11ef049b 100644 --- a/src/SendCommands.cc +++ b/src/SendCommands.cc @@ -251,10 +251,12 @@ void send_update_client_config(shared_ptr c) { void send_reconnect(shared_ptr c, uint32_t address, uint16_t port) { struct { - uint32_t address; + // The address is big-endian, for some reason. Probably it was defined as a + // uint8_t[4] in the original PSO source rather than a uint32_t + be_uint32_t address; uint16_t port; uint16_t unused; - } cmd = {bswap32(address), port, 0}; + } cmd = {address, port, 0}; send_command(c, 0x19, 0x00, cmd); } @@ -263,22 +265,22 @@ void send_reconnect(shared_ptr c, uint32_t address, uint16_t port) { void send_pc_gc_split_reconnect(shared_ptr c, uint32_t address, uint16_t pc_port, uint16_t gc_port) { struct { - uint32_t pc_address; + be_uint32_t pc_address; uint16_t pc_port; uint8_t unused1[0x0F]; uint8_t gc_command; uint8_t gc_flag; uint16_t gc_size; - uint32_t gc_address; + be_uint32_t gc_address; uint16_t gc_port; uint8_t unused2[0xB0 - 0x23]; } cmd; memset(&cmd, 0, sizeof(cmd)); - cmd.pc_address = bswap32(address); + cmd.pc_address = address; cmd.pc_port = pc_port; cmd.gc_command = 0x19; cmd.gc_size = 0x97; - cmd.gc_address = bswap32(address); + cmd.gc_address = address; cmd.gc_port = gc_port; send_command(c, 0x19, 0x00, cmd); }