use phosg big-endian types

This commit is contained in:
Martin Michelsen
2022-03-07 22:05:43 -08:00
parent 627498dc8a
commit 3fc1013e1a
4 changed files with 15 additions and 19 deletions
+1 -1
View File
@@ -105,7 +105,7 @@ void DNSServer::on_receive_message(int fd, short) {
} else { } else {
input.resize(bytes); 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) uint32_t connect_address = is_local_address(remote_address)
? this->local_connect_address ? this->local_connect_address
: this->external_connect_address; : this->external_connect_address;
+4 -4
View File
@@ -41,7 +41,7 @@ uint32_t resolve_address(const char* address) {
} }
struct sockaddr_in* res_sin = (struct sockaddr_in*)res4->ai_addr; 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<string, uint32_t> get_local_addresses() { map<string, uint32_t> get_local_addresses() {
@@ -64,7 +64,7 @@ map<string, uint32_t> get_local_addresses() {
continue; 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; return ret;
@@ -83,7 +83,7 @@ bool is_local_address(const sockaddr_storage& daddr) {
return false; return false;
} }
const sockaddr_in* sin = reinterpret_cast<const sockaddr_in*>(&daddr); const sockaddr_in* sin = reinterpret_cast<const sockaddr_in*>(&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) { 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) { uint32_t address_for_string(const char* address) {
return bswap32(inet_addr(address)); return ntohl(inet_addr(address));
} }
+2 -8
View File
@@ -19,14 +19,9 @@ using namespace std;
struct PSODownloadQuestHeader { struct PSODownloadQuestHeader {
// When sending a DLQ to the client, this is the DECOMPRESSED size. When // When sending a DLQ to the client, this is the DECOMPRESSED size. When
// reading it from a GCI file, this is the COMPRESSED size. // 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. // Note: use PSO PC encryption, even for GC quests.
uint32_t encryption_seed; be_uint32_t encryption_seed;
void byteswap() {
this->size = bswap32(this->size);
this->encryption_seed = bswap32(this->encryption_seed);
}
}; };
@@ -367,7 +362,6 @@ string Quest::decode_gci(const string& filename) {
} }
PSODownloadQuestHeader* h = reinterpret_cast<PSODownloadQuestHeader*>( PSODownloadQuestHeader* h = reinterpret_cast<PSODownloadQuestHeader*>(
data.data() + 0x2080); data.data() + 0x2080);
h->byteswap();
string compressed_data_with_header = data.substr(0x2088, h->size); string compressed_data_with_header = data.substr(0x2088, h->size);
+8 -6
View File
@@ -251,10 +251,12 @@ void send_update_client_config(shared_ptr<Client> c) {
void send_reconnect(shared_ptr<Client> c, uint32_t address, uint16_t port) { void send_reconnect(shared_ptr<Client> c, uint32_t address, uint16_t port) {
struct { 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 port;
uint16_t unused; uint16_t unused;
} cmd = {bswap32(address), port, 0}; } cmd = {address, port, 0};
send_command(c, 0x19, 0x00, cmd); send_command(c, 0x19, 0x00, cmd);
} }
@@ -263,22 +265,22 @@ void send_reconnect(shared_ptr<Client> c, uint32_t address, uint16_t port) {
void send_pc_gc_split_reconnect(shared_ptr<Client> c, uint32_t address, void send_pc_gc_split_reconnect(shared_ptr<Client> c, uint32_t address,
uint16_t pc_port, uint16_t gc_port) { uint16_t pc_port, uint16_t gc_port) {
struct { struct {
uint32_t pc_address; be_uint32_t pc_address;
uint16_t pc_port; uint16_t pc_port;
uint8_t unused1[0x0F]; uint8_t unused1[0x0F];
uint8_t gc_command; uint8_t gc_command;
uint8_t gc_flag; uint8_t gc_flag;
uint16_t gc_size; uint16_t gc_size;
uint32_t gc_address; be_uint32_t gc_address;
uint16_t gc_port; uint16_t gc_port;
uint8_t unused2[0xB0 - 0x23]; uint8_t unused2[0xB0 - 0x23];
} cmd; } cmd;
memset(&cmd, 0, sizeof(cmd)); memset(&cmd, 0, sizeof(cmd));
cmd.pc_address = bswap32(address); cmd.pc_address = address;
cmd.pc_port = pc_port; cmd.pc_port = pc_port;
cmd.gc_command = 0x19; cmd.gc_command = 0x19;
cmd.gc_size = 0x97; cmd.gc_size = 0x97;
cmd.gc_address = bswap32(address); cmd.gc_address = address;
cmd.gc_port = gc_port; cmd.gc_port = gc_port;
send_command(c, 0x19, 0x00, cmd); send_command(c, 0x19, 0x00, cmd);
} }