using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
namespace MailSharp.DNS;
public partial class Resolver
{
public static string GetArpaFromIp(IPAddress ip)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
var sb = new StringBuilder("in-addr.arpa.");
foreach (var b in ip.GetAddressBytes())
sb.Insert(0, $"{b}.");
return sb.ToString();
}
if (ip.AddressFamily == AddressFamily.InterNetworkV6)
{
var sb = new StringBuilder("ip6.arpa.");
foreach (var b in ip.GetAddressBytes())
{
sb.Insert(0, $"{(b & 0xF):x}.{(b >> 4):x}.");
return sb.ToString();
}
}
return "?";
}
///
/// Converts an E.164 phone number to an arpa domain name (RFC 3761)
/// Example: +31161234567 → 7.6.5.4.3.2.1.6.1.1.3.e164.arpa.
///
/// The E.164 number (with or without + and non-digits)
/// The ENUM arpa name
public static string GetArpaFromEnum(string strEnum)
{
if (string.IsNullOrEmpty(strEnum))
return "e164.arpa.";
// Remove everything that is not a digit
string digitsOnly = NonDigitRegex().Replace(strEnum, "");
StringBuilder sb = new StringBuilder();
sb.Append("e164.arpa.");
// Insert dots from right to left
foreach (char c in digitsOnly)
{
sb.Insert(0, c);
sb.Insert(0, '.');
}
return sb.ToString();
}
[GeneratedRegex("[^0-9]")]
private static partial Regex NonDigitRegex();
}