private static ResultCode GetAddrInfoRequestImpl( ServiceCtx context, ulong responseBufferPosition, ulong responseBufferSize, bool withOptions, ulong optionsBufferPosition, ulong optionsBufferSize) { bool enableNsdResolve = (context.RequestData.ReadInt32() & 1) != 0; uint cancelHandle = context.RequestData.ReadUInt32(); string host = MemoryHelper.ReadAsciiString(context.Memory, context.Request.SendBuff[0].Position, (long)context.Request.SendBuff[0].Size); string service = MemoryHelper.ReadAsciiString(context.Memory, context.Request.SendBuff[1].Position, (long)context.Request.SendBuff[1].Size); if (!context.Device.Configuration.EnableInternetAccess) { Logger.Info?.Print(LogClass.ServiceSfdnsres, $"Guest network access disabled, DNS Blocked: {host}"); WriteResponse(context, withOptions, 0, GaiError.NoData, NetDbError.HostNotFound); return(ResultCode.Success); } // NOTE: We ignore hints for now. DeserializeAddrInfos(context.Memory, (ulong)context.Request.SendBuff[2].Position, (ulong)context.Request.SendBuff[2].Size); if (withOptions) { // TODO: Find unknown, Parse and use options. uint unknown = context.RequestData.ReadUInt32(); } ulong pidPlaceHolder = context.RequestData.ReadUInt64(); IPHostEntry hostEntry = null; NetDbError netDbErrorCode = NetDbError.Success; GaiError errno = GaiError.AddressFamily; ulong serializedSize = 0; if (host.Length <= byte.MaxValue) { if (enableNsdResolve) { if (FqdnResolver.Resolve(host, out string newAddress) == Nsd.ResultCode.Success) { host = newAddress; } } string targetHost = host; if (DnsBlacklist.IsHostBlocked(host)) { Logger.Info?.Print(LogClass.ServiceSfdnsres, $"DNS Blocked: {host}"); netDbErrorCode = NetDbError.HostNotFound; errno = GaiError.NoData; } else { Logger.Info?.Print(LogClass.ServiceSfdnsres, $"Trying to resolve: {host}"); try { hostEntry = Dns.GetHostEntry(targetHost); } catch (SocketException exception) { netDbErrorCode = ConvertSocketErrorCodeToNetDbError(exception.ErrorCode); errno = ConvertSocketErrorCodeToGaiError(exception.ErrorCode, errno); } } } else { netDbErrorCode = NetDbError.NoAddress; } if (hostEntry != null) { int.TryParse(service, out int port); errno = GaiError.Success; serializedSize = SerializeAddrInfos(context, responseBufferPosition, responseBufferSize, hostEntry, port); } WriteResponse(context, withOptions, serializedSize, errno, netDbErrorCode); return(ResultCode.Success); }
private static ResultCode GetHostByNameRequestImpl( ServiceCtx context, ulong inputBufferPosition, ulong inputBufferSize, ulong outputBufferPosition, ulong outputBufferSize, bool withOptions, ulong optionsBufferPosition, ulong optionsBufferSize) { string host = MemoryHelper.ReadAsciiString(context.Memory, inputBufferPosition, (int)inputBufferSize); if (!context.Device.Configuration.EnableInternetAccess) { Logger.Info?.Print(LogClass.ServiceSfdnsres, $"Guest network access disabled, DNS Blocked: {host}"); WriteResponse(context, withOptions, 0, GaiError.NoData, NetDbError.HostNotFound); return(ResultCode.Success); } // TODO: Use params. bool enableNsdResolve = (context.RequestData.ReadInt32() & 1) != 0; int timeOut = context.RequestData.ReadInt32(); ulong pidPlaceholder = context.RequestData.ReadUInt64(); if (withOptions) { // TODO: Parse and use options. } IPHostEntry hostEntry = null; NetDbError netDbErrorCode = NetDbError.Success; GaiError errno = GaiError.Overflow; ulong serializedSize = 0; if (host.Length <= byte.MaxValue) { if (enableNsdResolve) { if (FqdnResolver.Resolve(host, out string newAddress) == Nsd.ResultCode.Success) { host = newAddress; } } string targetHost = host; if (DnsBlacklist.IsHostBlocked(host)) { Logger.Info?.Print(LogClass.ServiceSfdnsres, $"DNS Blocked: {host}"); netDbErrorCode = NetDbError.HostNotFound; errno = GaiError.NoData; } else { Logger.Info?.Print(LogClass.ServiceSfdnsres, $"Trying to resolve: {host}"); try { hostEntry = Dns.GetHostEntry(targetHost); } catch (SocketException exception) { netDbErrorCode = ConvertSocketErrorCodeToNetDbError(exception.ErrorCode); errno = ConvertSocketErrorCodeToGaiError(exception.ErrorCode, errno); } } } else { netDbErrorCode = NetDbError.HostNotFound; } if (hostEntry != null) { IEnumerable <IPAddress> addresses = GetIpv4Addresses(hostEntry); if (!addresses.Any()) { errno = GaiError.NoData; netDbErrorCode = NetDbError.NoAddress; } else { errno = GaiError.Success; serializedSize = SerializeHostEntries(context, outputBufferPosition, outputBufferSize, hostEntry, addresses); } } WriteResponse(context, withOptions, serializedSize, errno, netDbErrorCode); return(ResultCode.Success); }