diff options
| author | 2023-07-01 15:02:25 -0700 | |
|---|---|---|
| committer | 2023-07-01 17:27:35 -0700 | |
| commit | 0e191c271125321589dfdbb09731413550710c9a (patch) | |
| tree | e0d9e826197d2fd66cc9b7fd8d11cc8c7fd6e3ac /src/core/hle/service/sockets | |
| parent | Merge remote-tracking branch 'origin/master' into ssl (diff) | |
| download | yuzu-0e191c271125321589dfdbb09731413550710c9a.tar.gz yuzu-0e191c271125321589dfdbb09731413550710c9a.tar.xz yuzu-0e191c271125321589dfdbb09731413550710c9a.zip | |
Updates:
- Address PR feedback.
- Add SecureTransport backend for macOS.
Diffstat (limited to 'src/core/hle/service/sockets')
| -rw-r--r-- | src/core/hle/service/sockets/bsd.cpp | 23 | ||||
| -rw-r--r-- | src/core/hle/service/sockets/sfdnsres.cpp | 73 |
2 files changed, 74 insertions, 22 deletions
diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp index 6034cc0b5..e63b0a357 100644 --- a/src/core/hle/service/sockets/bsd.cpp +++ b/src/core/hle/service/sockets/bsd.cpp | |||
| @@ -443,15 +443,28 @@ void BSD::Close(HLERequestContext& ctx) { | |||
| 443 | } | 443 | } |
| 444 | 444 | ||
| 445 | void BSD::DuplicateSocket(HLERequestContext& ctx) { | 445 | void BSD::DuplicateSocket(HLERequestContext& ctx) { |
| 446 | struct InputParameters { | ||
| 447 | s32 fd; | ||
| 448 | u64 reserved; | ||
| 449 | }; | ||
| 450 | static_assert(sizeof(InputParameters) == 0x10); | ||
| 451 | |||
| 452 | struct OutputParameters { | ||
| 453 | s32 ret; | ||
| 454 | Errno bsd_errno; | ||
| 455 | }; | ||
| 456 | static_assert(sizeof(OutputParameters) == 0x8); | ||
| 457 | |||
| 446 | IPC::RequestParser rp{ctx}; | 458 | IPC::RequestParser rp{ctx}; |
| 447 | const s32 fd = rp.Pop<s32>(); | 459 | auto input = rp.PopRaw<InputParameters>(); |
| 448 | [[maybe_unused]] const u64 unused = rp.Pop<u64>(); | ||
| 449 | 460 | ||
| 450 | Expected<s32, Errno> res = DuplicateSocketImpl(fd); | 461 | Expected<s32, Errno> res = DuplicateSocketImpl(input.fd); |
| 451 | IPC::ResponseBuilder rb{ctx, 4}; | 462 | IPC::ResponseBuilder rb{ctx, 4}; |
| 452 | rb.Push(ResultSuccess); | 463 | rb.Push(ResultSuccess); |
| 453 | rb.Push(res.value_or(0)); // ret | 464 | rb.PushRaw(OutputParameters{ |
| 454 | rb.Push(res ? 0 : static_cast<s32>(res.error())); // bsd errno | 465 | .ret = res.value_or(0), |
| 466 | .bsd_errno = res ? Errno::SUCCESS : res.error(), | ||
| 467 | }); | ||
| 455 | } | 468 | } |
| 456 | 469 | ||
| 457 | void BSD::EventFd(HLERequestContext& ctx) { | 470 | void BSD::EventFd(HLERequestContext& ctx) { |
diff --git a/src/core/hle/service/sockets/sfdnsres.cpp b/src/core/hle/service/sockets/sfdnsres.cpp index 45f0f526a..84cc79de8 100644 --- a/src/core/hle/service/sockets/sfdnsres.cpp +++ b/src/core/hle/service/sockets/sfdnsres.cpp | |||
| @@ -131,14 +131,15 @@ static std::vector<u8> SerializeAddrInfoAsHostEnt(const std::vector<Network::Add | |||
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | static std::pair<u32, GetAddrInfoError> GetHostByNameRequestImpl(HLERequestContext& ctx) { | 133 | static std::pair<u32, GetAddrInfoError> GetHostByNameRequestImpl(HLERequestContext& ctx) { |
| 134 | struct Parameters { | 134 | struct InputParameters { |
| 135 | u8 use_nsd_resolve; | 135 | u8 use_nsd_resolve; |
| 136 | u32 cancel_handle; | 136 | u32 cancel_handle; |
| 137 | u64 process_id; | 137 | u64 process_id; |
| 138 | }; | 138 | }; |
| 139 | static_assert(sizeof(InputParameters) == 0x10); | ||
| 139 | 140 | ||
| 140 | IPC::RequestParser rp{ctx}; | 141 | IPC::RequestParser rp{ctx}; |
| 141 | const auto parameters = rp.PopRaw<Parameters>(); | 142 | const auto parameters = rp.PopRaw<InputParameters>(); |
| 142 | 143 | ||
| 143 | LOG_WARNING( | 144 | LOG_WARNING( |
| 144 | Service, | 145 | Service, |
| @@ -164,21 +165,39 @@ static std::pair<u32, GetAddrInfoError> GetHostByNameRequestImpl(HLERequestConte | |||
| 164 | void SFDNSRES::GetHostByNameRequest(HLERequestContext& ctx) { | 165 | void SFDNSRES::GetHostByNameRequest(HLERequestContext& ctx) { |
| 165 | auto [data_size, emu_gai_err] = GetHostByNameRequestImpl(ctx); | 166 | auto [data_size, emu_gai_err] = GetHostByNameRequestImpl(ctx); |
| 166 | 167 | ||
| 168 | struct OutputParameters { | ||
| 169 | NetDbError netdb_error; | ||
| 170 | Errno bsd_errno; | ||
| 171 | u32 data_size; | ||
| 172 | }; | ||
| 173 | static_assert(sizeof(OutputParameters) == 0xc); | ||
| 174 | |||
| 167 | IPC::ResponseBuilder rb{ctx, 5}; | 175 | IPC::ResponseBuilder rb{ctx, 5}; |
| 168 | rb.Push(ResultSuccess); | 176 | rb.Push(ResultSuccess); |
| 169 | rb.Push(static_cast<s32>(GetAddrInfoErrorToNetDbError(emu_gai_err))); // netdb error code | 177 | rb.PushRaw(OutputParameters{ |
| 170 | rb.Push(static_cast<s32>(GetAddrInfoErrorToErrno(emu_gai_err))); // errno | 178 | .netdb_error = GetAddrInfoErrorToNetDbError(emu_gai_err), |
| 171 | rb.Push(data_size); // serialized size | 179 | .bsd_errno = GetAddrInfoErrorToErrno(emu_gai_err), |
| 180 | .data_size = data_size, | ||
| 181 | }); | ||
| 172 | } | 182 | } |
| 173 | 183 | ||
| 174 | void SFDNSRES::GetHostByNameRequestWithOptions(HLERequestContext& ctx) { | 184 | void SFDNSRES::GetHostByNameRequestWithOptions(HLERequestContext& ctx) { |
| 175 | auto [data_size, emu_gai_err] = GetHostByNameRequestImpl(ctx); | 185 | auto [data_size, emu_gai_err] = GetHostByNameRequestImpl(ctx); |
| 176 | 186 | ||
| 187 | struct OutputParameters { | ||
| 188 | u32 data_size; | ||
| 189 | NetDbError netdb_error; | ||
| 190 | Errno bsd_errno; | ||
| 191 | }; | ||
| 192 | static_assert(sizeof(OutputParameters) == 0xc); | ||
| 193 | |||
| 177 | IPC::ResponseBuilder rb{ctx, 5}; | 194 | IPC::ResponseBuilder rb{ctx, 5}; |
| 178 | rb.Push(ResultSuccess); | 195 | rb.Push(ResultSuccess); |
| 179 | rb.Push(data_size); // serialized size | 196 | rb.PushRaw(OutputParameters{ |
| 180 | rb.Push(static_cast<s32>(GetAddrInfoErrorToNetDbError(emu_gai_err))); // netdb error code | 197 | .data_size = data_size, |
| 181 | rb.Push(static_cast<s32>(GetAddrInfoErrorToErrno(emu_gai_err))); // errno | 198 | .netdb_error = GetAddrInfoErrorToNetDbError(emu_gai_err), |
| 199 | .bsd_errno = GetAddrInfoErrorToErrno(emu_gai_err), | ||
| 200 | }); | ||
| 182 | } | 201 | } |
| 183 | 202 | ||
| 184 | static std::vector<u8> SerializeAddrInfo(const std::vector<Network::AddrInfo>& vec, | 203 | static std::vector<u8> SerializeAddrInfo(const std::vector<Network::AddrInfo>& vec, |
| @@ -221,14 +240,15 @@ static std::vector<u8> SerializeAddrInfo(const std::vector<Network::AddrInfo>& v | |||
| 221 | } | 240 | } |
| 222 | 241 | ||
| 223 | static std::pair<u32, GetAddrInfoError> GetAddrInfoRequestImpl(HLERequestContext& ctx) { | 242 | static std::pair<u32, GetAddrInfoError> GetAddrInfoRequestImpl(HLERequestContext& ctx) { |
| 224 | struct Parameters { | 243 | struct InputParameters { |
| 225 | u8 use_nsd_resolve; | 244 | u8 use_nsd_resolve; |
| 226 | u32 cancel_handle; | 245 | u32 cancel_handle; |
| 227 | u64 process_id; | 246 | u64 process_id; |
| 228 | }; | 247 | }; |
| 248 | static_assert(sizeof(InputParameters) == 0x10); | ||
| 229 | 249 | ||
| 230 | IPC::RequestParser rp{ctx}; | 250 | IPC::RequestParser rp{ctx}; |
| 231 | const auto parameters = rp.PopRaw<Parameters>(); | 251 | const auto parameters = rp.PopRaw<InputParameters>(); |
| 232 | 252 | ||
| 233 | LOG_WARNING( | 253 | LOG_WARNING( |
| 234 | Service, | 254 | Service, |
| @@ -264,23 +284,42 @@ static std::pair<u32, GetAddrInfoError> GetAddrInfoRequestImpl(HLERequestContext | |||
| 264 | void SFDNSRES::GetAddrInfoRequest(HLERequestContext& ctx) { | 284 | void SFDNSRES::GetAddrInfoRequest(HLERequestContext& ctx) { |
| 265 | auto [data_size, emu_gai_err] = GetAddrInfoRequestImpl(ctx); | 285 | auto [data_size, emu_gai_err] = GetAddrInfoRequestImpl(ctx); |
| 266 | 286 | ||
| 287 | struct OutputParameters { | ||
| 288 | Errno bsd_errno; | ||
| 289 | GetAddrInfoError gai_error; | ||
| 290 | u32 data_size; | ||
| 291 | }; | ||
| 292 | static_assert(sizeof(OutputParameters) == 0xc); | ||
| 293 | |||
| 267 | IPC::ResponseBuilder rb{ctx, 5}; | 294 | IPC::ResponseBuilder rb{ctx, 5}; |
| 268 | rb.Push(ResultSuccess); | 295 | rb.Push(ResultSuccess); |
| 269 | rb.Push(static_cast<s32>(GetAddrInfoErrorToErrno(emu_gai_err))); // errno | 296 | rb.PushRaw(OutputParameters{ |
| 270 | rb.Push(static_cast<s32>(emu_gai_err)); // getaddrinfo error code | 297 | .bsd_errno = GetAddrInfoErrorToErrno(emu_gai_err), |
| 271 | rb.Push(data_size); // serialized size | 298 | .gai_error = emu_gai_err, |
| 299 | .data_size = data_size, | ||
| 300 | }); | ||
| 272 | } | 301 | } |
| 273 | 302 | ||
| 274 | void SFDNSRES::GetAddrInfoRequestWithOptions(HLERequestContext& ctx) { | 303 | void SFDNSRES::GetAddrInfoRequestWithOptions(HLERequestContext& ctx) { |
| 275 | // Additional options are ignored | 304 | // Additional options are ignored |
| 276 | auto [data_size, emu_gai_err] = GetAddrInfoRequestImpl(ctx); | 305 | auto [data_size, emu_gai_err] = GetAddrInfoRequestImpl(ctx); |
| 277 | 306 | ||
| 307 | struct OutputParameters { | ||
| 308 | u32 data_size; | ||
| 309 | GetAddrInfoError gai_error; | ||
| 310 | NetDbError netdb_error; | ||
| 311 | Errno bsd_errno; | ||
| 312 | }; | ||
| 313 | static_assert(sizeof(OutputParameters) == 0x10); | ||
| 314 | |||
| 278 | IPC::ResponseBuilder rb{ctx, 6}; | 315 | IPC::ResponseBuilder rb{ctx, 6}; |
| 279 | rb.Push(ResultSuccess); | 316 | rb.Push(ResultSuccess); |
| 280 | rb.Push(data_size); // serialized size | 317 | rb.PushRaw(OutputParameters{ |
| 281 | rb.Push(static_cast<s32>(emu_gai_err)); // getaddrinfo error code | 318 | .data_size = data_size, |
| 282 | rb.Push(static_cast<s32>(GetAddrInfoErrorToNetDbError(emu_gai_err))); // netdb error code | 319 | .gai_error = emu_gai_err, |
| 283 | rb.Push(static_cast<s32>(GetAddrInfoErrorToErrno(emu_gai_err))); // errno | 320 | .netdb_error = GetAddrInfoErrorToNetDbError(emu_gai_err), |
| 321 | .bsd_errno = GetAddrInfoErrorToErrno(emu_gai_err), | ||
| 322 | }); | ||
| 284 | } | 323 | } |
| 285 | 324 | ||
| 286 | void SFDNSRES::ResolverSetOptionRequest(HLERequestContext& ctx) { | 325 | void SFDNSRES::ResolverSetOptionRequest(HLERequestContext& ctx) { |