Example #1
0
        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");
            }
        }
Example #2
0
        // 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);
        }
Example #3
0
        // 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);
        }
Example #4
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);
        }