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); }
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); }
/// <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); } }