File: src\libraries\Common\src\System\Net\SocketProtocolSupportPal.Unix.cs
Web Access
Project: src\src\libraries\System.Net.Sockets\src\System.Net.Sockets.csproj (System.Net.Sockets)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Net.Sockets;
using System.Runtime.InteropServices;
 
namespace System.Net
{
    internal static partial class SocketProtocolSupportPal
    {
        private const int DgramSocketType = 2;
 
        private static unsafe bool IsSupported(AddressFamily af)
        {
            // Check for AF_UNIX on iOS/tvOS. The OS claims to support this, but returns EPERM on bind.
            // We should explicitly set the return here to false, to avoid giving a false impression.
            if (af == AddressFamily.Unix && (OperatingSystem.IsTvOS() || OperatingSystem.IsWasi() || (OperatingSystem.IsIOS() && !OperatingSystem.IsMacCatalyst())))
            {
                return false;
            }
            IntPtr invalid = (IntPtr)(-1);
            IntPtr socket = invalid;
            try
            {
                Interop.Error result = Interop.Sys.Socket((int)af, DgramSocketType, 0, &socket);
                // we get EAFNOSUPPORT when family is not supported by Kernel, EPROTONOSUPPORT may come from policy enforcement like FreeBSD jail()
                return result != Interop.Error.EAFNOSUPPORT && result != Interop.Error.EPROTONOSUPPORT;
            }
            finally
            {
                if (socket != invalid)
                {
                    Interop.Sys.Close(socket);
                }
            }
        }
    }
}