Ejemplo n.º 1
0
        internal static AGDnsApi.ag_upstream_options ToNativeObject(
            UpstreamOptions upstreamOptions,
            Queue <IntPtr> allocatedPointers)
        {
            AGDnsApi.ag_list bootstrapC = MarshalUtils.ListToAgList(
                upstreamOptions.Bootstrap,
                MarshalUtils.StringToPtr,
                allocatedPointers);

            byte[] addressBytes = null;
            if (upstreamOptions.ResolvedIpAddress != null)
            {
                addressBytes = upstreamOptions.ResolvedIpAddress.GetAddressBytes();
            }

            AGDnsApi.ag_buffer           addressC         = MarshalUtils.BytesToAgBuffer(addressBytes, allocatedPointers);
            AGDnsApi.ag_upstream_options upstreamOptionsC = new AGDnsApi.ag_upstream_options
            {
                bootstrap           = bootstrapC,
                resolved_ip_address = addressC
            };

            MarshalUtils.CopyPropertiesToFields(upstreamOptions, ref upstreamOptionsC);
            MarshalUtils.AllStringsToPtrs(upstreamOptions, ref upstreamOptionsC, allocatedPointers);
            return(upstreamOptionsC);
        }
Ejemplo n.º 2
0
        private static UpstreamOptions FromNativeObject(AGDnsApi.ag_upstream_options upstreamOptionsC)
        {
            List <string> bootstrap = MarshalUtils.AgListToList <IntPtr, string>(
                upstreamOptionsC.bootstrap,
                MarshalUtils.PtrToString);

            IPAddress       serverAddress   = CreateIpAddress(upstreamOptionsC.resolved_ip_address);
            UpstreamOptions upstreamOptions = new UpstreamOptions
            {
                Bootstrap         = bootstrap,
                ResolvedIpAddress = serverAddress
            };

            MarshalUtils.CopyFieldsToProperties(upstreamOptionsC, upstreamOptions);
            MarshalUtils.AllPtrsToStrings(upstreamOptionsC, upstreamOptions);
            return(upstreamOptions);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Checks if upstream is valid and available
        /// </summary>
        /// <param name="upstreamOptions">Upstream options
        /// (<seealso cref="UpstreamOptions"/>)</param>
        /// <param name="ipv6Available">Whether IPv6 is available (i.e., bootstrapper is allowed to make AAAA queries)</param>
        /// <param name="offline">Don't perform online upstream check</param>
        public static bool TestUpstream(UpstreamOptions upstreamOptions, bool ipv6Available, bool offline)
        {
            IntPtr         pUpstreamOptionsC = IntPtr.Zero;
            Queue <IntPtr> allocatedPointers = new Queue <IntPtr>();
            IntPtr         pError            = IntPtr.Zero;

            try
            {
                Logger.Info("Start testing upstream {0}", upstreamOptions);
                CertificateVerificationCallback certificateVerificationCallback = new CertificateVerificationCallback();
                AGDnsApi.ag_upstream_options    upstreamOptionsC =
                    DnsApiConverter.ToNativeObject(upstreamOptions, allocatedPointers);
                AGDnsApi.cbd_onCertificateVerification testUpstreamCallbackC =
                    DnsApiConverter.ToNativeObject(certificateVerificationCallback);
                pUpstreamOptionsC = MarshalUtils.StructureToPtr(upstreamOptionsC);
                pError            = AGDnsApi.ag_test_upstream(pUpstreamOptionsC, ipv6Available, testUpstreamCallbackC, offline);
                string error = MarshalUtils.PtrToString(pError);
                if (string.IsNullOrEmpty(error))
                {
                    Logger.Info("Testing upstream has been completed successfully");
                    return(true);
                }

                Logger.Info("Testing upstream failed with an error {0}", error);
                return(false);
            }
            catch (Exception ex)
            {
                Logger.Info("Testing upstream failed with an error {0}", ex);
                return(false);
            }
            finally
            {
                AGDnsApi.ag_str_free(pError);
                MarshalUtils.SafeFreeHGlobal(allocatedPointers);
                MarshalUtils.SafeFreeHGlobal(pUpstreamOptionsC);
            }
        }