private string GetHostStringErrorFromErrorCode(NetDBError ErrorCode) { if (ErrorCode <= NetDBError.Internal) { return("Resolver internal error"); } switch (ErrorCode) { case NetDBError.Success: return("Resolver Error 0 (no error)"); case NetDBError.HostNotFound: return("Unknown host"); case NetDBError.TryAgain: return("Host name lookup failure"); case NetDBError.NoRecovery: return("Unknown server error"); case NetDBError.NoData: return("No address associated with name"); default: return("Unknown resolver error"); } }
// GetHostStringError(u32) -> buffer<unknown, 6, 0> public long GetHostStringError(ServiceCtx Context) { long ResultCode = MakeError(ErrorModule.Os, 1023); NetDBError ErrorCode = (NetDBError)Context.RequestData.ReadInt32(); string ErrorString = GetHostStringErrorFromErrorCode(ErrorCode); if (ErrorString.Length + 1 <= Context.Request.ReceiveBuff[0].Size) { ResultCode = 0; Context.Memory.WriteBytes(Context.Request.ReceiveBuff[0].Position, Encoding.ASCII.GetBytes(ErrorString + '\0')); } return(ResultCode); }
// GetHostByAddr(u32, u32, u32, u64, pid, buffer<unknown, 5, 0>) -> (u32, u32, u32, buffer<unknown, 6, 0>) public long GetHostByAddress(ServiceCtx Context) { byte[] RawIp = Context.Memory.ReadBytes(Context.Request.SendBuff[0].Position, Context.Request.SendBuff[0].Size); // TODO: use params uint SocketLength = Context.RequestData.ReadUInt32(); uint Type = Context.RequestData.ReadUInt32(); int TimeOut = Context.RequestData.ReadInt32(); ulong PidPlaceholder = Context.RequestData.ReadUInt64(); IPHostEntry HostEntry = null; NetDBError NetDBErrorCode = NetDBError.Success; GaiError Errno = GaiError.AddressFamily; long SerializedSize = 0; if (RawIp.Length == 4) { try { IPAddress Address = new IPAddress(RawIp); HostEntry = Dns.GetHostEntry(Address); } catch (SocketException Exception) { NetDBErrorCode = NetDBError.Internal; if (Exception.ErrorCode == 11001) { NetDBErrorCode = NetDBError.HostNotFound; Errno = GaiError.NoData; } else if (Exception.ErrorCode == 11002) { NetDBErrorCode = NetDBError.TryAgain; } else if (Exception.ErrorCode == 11003) { NetDBErrorCode = NetDBError.NoRecovery; } else if (Exception.ErrorCode == 11004) { NetDBErrorCode = NetDBError.NoData; } else if (Exception.ErrorCode == 10060) { Errno = GaiError.Again; } } } else { NetDBErrorCode = NetDBError.NoAddress; } if (HostEntry != null) { Errno = GaiError.Success; SerializedSize = SerializeHostEnt(Context, HostEntry, GetIPV4Addresses(HostEntry)); } Context.ResponseData.Write((int)NetDBErrorCode); Context.ResponseData.Write((int)Errno); Context.ResponseData.Write(SerializedSize); return(0); }
// GetHostByName(u8, u32, u64, pid, buffer<unknown, 5, 0>) -> (u32, u32, u32, buffer<unknown, 6, 0>) public long GetHostByName(ServiceCtx Context) { byte[] RawName = Context.Memory.ReadBytes(Context.Request.SendBuff[0].Position, Context.Request.SendBuff[0].Size); string Name = Encoding.ASCII.GetString(RawName).TrimEnd('\0'); // TODO: use params bool EnableNsdResolve = Context.RequestData.ReadInt32() == 1; int TimeOut = Context.RequestData.ReadInt32(); ulong PidPlaceholder = Context.RequestData.ReadUInt64(); IPHostEntry HostEntry = null; NetDBError NetDBErrorCode = NetDBError.Success; GaiError Errno = GaiError.Overflow; long SerializedSize = 0; if (Name.Length <= 255) { try { HostEntry = Dns.GetHostEntry(Name); } catch (SocketException Exception) { NetDBErrorCode = NetDBError.Internal; if (Exception.ErrorCode == 11001) { NetDBErrorCode = NetDBError.HostNotFound; Errno = GaiError.NoData; } else if (Exception.ErrorCode == 11002) { NetDBErrorCode = NetDBError.TryAgain; } else if (Exception.ErrorCode == 11003) { NetDBErrorCode = NetDBError.NoRecovery; } else if (Exception.ErrorCode == 11004) { NetDBErrorCode = NetDBError.NoData; } else if (Exception.ErrorCode == 10060) { Errno = GaiError.Again; } } } else { NetDBErrorCode = NetDBError.HostNotFound; } if (HostEntry != null) { Errno = GaiError.Success; List <IPAddress> Addresses = GetIPV4Addresses(HostEntry); if (Addresses.Count == 0) { Errno = GaiError.NoData; NetDBErrorCode = NetDBError.NoAddress; } else { SerializedSize = SerializeHostEnt(Context, HostEntry, Addresses); } } Context.ResponseData.Write((int)NetDBErrorCode); Context.ResponseData.Write((int)Errno); Context.ResponseData.Write(SerializedSize); return(0); }