mirror of
https://github.com/llvm-mirror/libcxx.git
synced 2025-10-24 03:32:35 +08:00
[libc++] Lift std::errc into a separated header
Summary: This is needed to implement `<charconv>`, otherwise `<charconv>` would need to include `<system_error>`, which pulls in `<string>` -- a header which the `<charconv>` proposal intends to keep away from. Reviewers: mclow.lists, EricWF Reviewed By: mclow.lists Subscribers: christof, cfe-commits Differential Revision: https://reviews.llvm.org/D41347 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@336164 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
218
include/__errc
Normal file
218
include/__errc
Normal file
@@ -0,0 +1,218 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===---------------------------- __errc ----------------------------------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||||
|
// Source Licenses. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef _LIBCPP___ERRC
|
||||||
|
#define _LIBCPP___ERRC
|
||||||
|
|
||||||
|
/*
|
||||||
|
system_error synopsis
|
||||||
|
|
||||||
|
namespace std
|
||||||
|
{
|
||||||
|
|
||||||
|
enum class errc
|
||||||
|
{
|
||||||
|
address_family_not_supported, // EAFNOSUPPORT
|
||||||
|
address_in_use, // EADDRINUSE
|
||||||
|
address_not_available, // EADDRNOTAVAIL
|
||||||
|
already_connected, // EISCONN
|
||||||
|
argument_list_too_long, // E2BIG
|
||||||
|
argument_out_of_domain, // EDOM
|
||||||
|
bad_address, // EFAULT
|
||||||
|
bad_file_descriptor, // EBADF
|
||||||
|
bad_message, // EBADMSG
|
||||||
|
broken_pipe, // EPIPE
|
||||||
|
connection_aborted, // ECONNABORTED
|
||||||
|
connection_already_in_progress, // EALREADY
|
||||||
|
connection_refused, // ECONNREFUSED
|
||||||
|
connection_reset, // ECONNRESET
|
||||||
|
cross_device_link, // EXDEV
|
||||||
|
destination_address_required, // EDESTADDRREQ
|
||||||
|
device_or_resource_busy, // EBUSY
|
||||||
|
directory_not_empty, // ENOTEMPTY
|
||||||
|
executable_format_error, // ENOEXEC
|
||||||
|
file_exists, // EEXIST
|
||||||
|
file_too_large, // EFBIG
|
||||||
|
filename_too_long, // ENAMETOOLONG
|
||||||
|
function_not_supported, // ENOSYS
|
||||||
|
host_unreachable, // EHOSTUNREACH
|
||||||
|
identifier_removed, // EIDRM
|
||||||
|
illegal_byte_sequence, // EILSEQ
|
||||||
|
inappropriate_io_control_operation, // ENOTTY
|
||||||
|
interrupted, // EINTR
|
||||||
|
invalid_argument, // EINVAL
|
||||||
|
invalid_seek, // ESPIPE
|
||||||
|
io_error, // EIO
|
||||||
|
is_a_directory, // EISDIR
|
||||||
|
message_size, // EMSGSIZE
|
||||||
|
network_down, // ENETDOWN
|
||||||
|
network_reset, // ENETRESET
|
||||||
|
network_unreachable, // ENETUNREACH
|
||||||
|
no_buffer_space, // ENOBUFS
|
||||||
|
no_child_process, // ECHILD
|
||||||
|
no_link, // ENOLINK
|
||||||
|
no_lock_available, // ENOLCK
|
||||||
|
no_message_available, // ENODATA
|
||||||
|
no_message, // ENOMSG
|
||||||
|
no_protocol_option, // ENOPROTOOPT
|
||||||
|
no_space_on_device, // ENOSPC
|
||||||
|
no_stream_resources, // ENOSR
|
||||||
|
no_such_device_or_address, // ENXIO
|
||||||
|
no_such_device, // ENODEV
|
||||||
|
no_such_file_or_directory, // ENOENT
|
||||||
|
no_such_process, // ESRCH
|
||||||
|
not_a_directory, // ENOTDIR
|
||||||
|
not_a_socket, // ENOTSOCK
|
||||||
|
not_a_stream, // ENOSTR
|
||||||
|
not_connected, // ENOTCONN
|
||||||
|
not_enough_memory, // ENOMEM
|
||||||
|
not_supported, // ENOTSUP
|
||||||
|
operation_canceled, // ECANCELED
|
||||||
|
operation_in_progress, // EINPROGRESS
|
||||||
|
operation_not_permitted, // EPERM
|
||||||
|
operation_not_supported, // EOPNOTSUPP
|
||||||
|
operation_would_block, // EWOULDBLOCK
|
||||||
|
owner_dead, // EOWNERDEAD
|
||||||
|
permission_denied, // EACCES
|
||||||
|
protocol_error, // EPROTO
|
||||||
|
protocol_not_supported, // EPROTONOSUPPORT
|
||||||
|
read_only_file_system, // EROFS
|
||||||
|
resource_deadlock_would_occur, // EDEADLK
|
||||||
|
resource_unavailable_try_again, // EAGAIN
|
||||||
|
result_out_of_range, // ERANGE
|
||||||
|
state_not_recoverable, // ENOTRECOVERABLE
|
||||||
|
stream_timeout, // ETIME
|
||||||
|
text_file_busy, // ETXTBSY
|
||||||
|
timed_out, // ETIMEDOUT
|
||||||
|
too_many_files_open_in_system, // ENFILE
|
||||||
|
too_many_files_open, // EMFILE
|
||||||
|
too_many_links, // EMLINK
|
||||||
|
too_many_symbolic_link_levels, // ELOOP
|
||||||
|
value_too_large, // EOVERFLOW
|
||||||
|
wrong_protocol_type // EPROTOTYPE
|
||||||
|
};
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <__config>
|
||||||
|
#include <cerrno>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
|
||||||
|
// Some error codes are not present on all platforms, so we provide equivalents
|
||||||
|
// for them:
|
||||||
|
|
||||||
|
//enum class errc
|
||||||
|
_LIBCPP_DECLARE_STRONG_ENUM(errc)
|
||||||
|
{
|
||||||
|
address_family_not_supported = EAFNOSUPPORT,
|
||||||
|
address_in_use = EADDRINUSE,
|
||||||
|
address_not_available = EADDRNOTAVAIL,
|
||||||
|
already_connected = EISCONN,
|
||||||
|
argument_list_too_long = E2BIG,
|
||||||
|
argument_out_of_domain = EDOM,
|
||||||
|
bad_address = EFAULT,
|
||||||
|
bad_file_descriptor = EBADF,
|
||||||
|
bad_message = EBADMSG,
|
||||||
|
broken_pipe = EPIPE,
|
||||||
|
connection_aborted = ECONNABORTED,
|
||||||
|
connection_already_in_progress = EALREADY,
|
||||||
|
connection_refused = ECONNREFUSED,
|
||||||
|
connection_reset = ECONNRESET,
|
||||||
|
cross_device_link = EXDEV,
|
||||||
|
destination_address_required = EDESTADDRREQ,
|
||||||
|
device_or_resource_busy = EBUSY,
|
||||||
|
directory_not_empty = ENOTEMPTY,
|
||||||
|
executable_format_error = ENOEXEC,
|
||||||
|
file_exists = EEXIST,
|
||||||
|
file_too_large = EFBIG,
|
||||||
|
filename_too_long = ENAMETOOLONG,
|
||||||
|
function_not_supported = ENOSYS,
|
||||||
|
host_unreachable = EHOSTUNREACH,
|
||||||
|
identifier_removed = EIDRM,
|
||||||
|
illegal_byte_sequence = EILSEQ,
|
||||||
|
inappropriate_io_control_operation = ENOTTY,
|
||||||
|
interrupted = EINTR,
|
||||||
|
invalid_argument = EINVAL,
|
||||||
|
invalid_seek = ESPIPE,
|
||||||
|
io_error = EIO,
|
||||||
|
is_a_directory = EISDIR,
|
||||||
|
message_size = EMSGSIZE,
|
||||||
|
network_down = ENETDOWN,
|
||||||
|
network_reset = ENETRESET,
|
||||||
|
network_unreachable = ENETUNREACH,
|
||||||
|
no_buffer_space = ENOBUFS,
|
||||||
|
no_child_process = ECHILD,
|
||||||
|
no_link = ENOLINK,
|
||||||
|
no_lock_available = ENOLCK,
|
||||||
|
#ifdef ENODATA
|
||||||
|
no_message_available = ENODATA,
|
||||||
|
#else
|
||||||
|
no_message_available = ENOMSG,
|
||||||
|
#endif
|
||||||
|
no_message = ENOMSG,
|
||||||
|
no_protocol_option = ENOPROTOOPT,
|
||||||
|
no_space_on_device = ENOSPC,
|
||||||
|
#ifdef ENOSR
|
||||||
|
no_stream_resources = ENOSR,
|
||||||
|
#else
|
||||||
|
no_stream_resources = ENOMEM,
|
||||||
|
#endif
|
||||||
|
no_such_device_or_address = ENXIO,
|
||||||
|
no_such_device = ENODEV,
|
||||||
|
no_such_file_or_directory = ENOENT,
|
||||||
|
no_such_process = ESRCH,
|
||||||
|
not_a_directory = ENOTDIR,
|
||||||
|
not_a_socket = ENOTSOCK,
|
||||||
|
#ifdef ENOSTR
|
||||||
|
not_a_stream = ENOSTR,
|
||||||
|
#else
|
||||||
|
not_a_stream = EINVAL,
|
||||||
|
#endif
|
||||||
|
not_connected = ENOTCONN,
|
||||||
|
not_enough_memory = ENOMEM,
|
||||||
|
not_supported = ENOTSUP,
|
||||||
|
operation_canceled = ECANCELED,
|
||||||
|
operation_in_progress = EINPROGRESS,
|
||||||
|
operation_not_permitted = EPERM,
|
||||||
|
operation_not_supported = EOPNOTSUPP,
|
||||||
|
operation_would_block = EWOULDBLOCK,
|
||||||
|
owner_dead = EOWNERDEAD,
|
||||||
|
permission_denied = EACCES,
|
||||||
|
protocol_error = EPROTO,
|
||||||
|
protocol_not_supported = EPROTONOSUPPORT,
|
||||||
|
read_only_file_system = EROFS,
|
||||||
|
resource_deadlock_would_occur = EDEADLK,
|
||||||
|
resource_unavailable_try_again = EAGAIN,
|
||||||
|
result_out_of_range = ERANGE,
|
||||||
|
state_not_recoverable = ENOTRECOVERABLE,
|
||||||
|
#ifdef ETIME
|
||||||
|
stream_timeout = ETIME,
|
||||||
|
#else
|
||||||
|
stream_timeout = ETIMEDOUT,
|
||||||
|
#endif
|
||||||
|
text_file_busy = ETXTBSY,
|
||||||
|
timed_out = ETIMEDOUT,
|
||||||
|
too_many_files_open_in_system = ENFILE,
|
||||||
|
too_many_files_open = EMFILE,
|
||||||
|
too_many_links = EMLINK,
|
||||||
|
too_many_symbolic_link_levels = ELOOP,
|
||||||
|
value_too_large = EOVERFLOW,
|
||||||
|
wrong_protocol_type = EPROTOTYPE
|
||||||
|
};
|
||||||
|
_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(errc)
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|
||||||
|
#endif // _LIBCPP___ERRC
|
@@ -482,6 +482,7 @@ module std [system] {
|
|||||||
// FIXME: These should be private.
|
// FIXME: These should be private.
|
||||||
module __bit_reference { header "__bit_reference" export * }
|
module __bit_reference { header "__bit_reference" export * }
|
||||||
module __debug { header "__debug" export * }
|
module __debug { header "__debug" export * }
|
||||||
|
module __errc { header "__errc" export * }
|
||||||
module __functional_base { header "__functional_base" export * }
|
module __functional_base { header "__functional_base" export * }
|
||||||
module __hash_table { header "__hash_table" export * }
|
module __hash_table { header "__hash_table" export * }
|
||||||
module __locale { header "__locale" export * }
|
module __locale { header "__locale" export * }
|
||||||
|
@@ -120,88 +120,6 @@ public:
|
|||||||
const char* what() const noexcept;
|
const char* what() const noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class errc
|
|
||||||
{
|
|
||||||
address_family_not_supported, // EAFNOSUPPORT
|
|
||||||
address_in_use, // EADDRINUSE
|
|
||||||
address_not_available, // EADDRNOTAVAIL
|
|
||||||
already_connected, // EISCONN
|
|
||||||
argument_list_too_long, // E2BIG
|
|
||||||
argument_out_of_domain, // EDOM
|
|
||||||
bad_address, // EFAULT
|
|
||||||
bad_file_descriptor, // EBADF
|
|
||||||
bad_message, // EBADMSG
|
|
||||||
broken_pipe, // EPIPE
|
|
||||||
connection_aborted, // ECONNABORTED
|
|
||||||
connection_already_in_progress, // EALREADY
|
|
||||||
connection_refused, // ECONNREFUSED
|
|
||||||
connection_reset, // ECONNRESET
|
|
||||||
cross_device_link, // EXDEV
|
|
||||||
destination_address_required, // EDESTADDRREQ
|
|
||||||
device_or_resource_busy, // EBUSY
|
|
||||||
directory_not_empty, // ENOTEMPTY
|
|
||||||
executable_format_error, // ENOEXEC
|
|
||||||
file_exists, // EEXIST
|
|
||||||
file_too_large, // EFBIG
|
|
||||||
filename_too_long, // ENAMETOOLONG
|
|
||||||
function_not_supported, // ENOSYS
|
|
||||||
host_unreachable, // EHOSTUNREACH
|
|
||||||
identifier_removed, // EIDRM
|
|
||||||
illegal_byte_sequence, // EILSEQ
|
|
||||||
inappropriate_io_control_operation, // ENOTTY
|
|
||||||
interrupted, // EINTR
|
|
||||||
invalid_argument, // EINVAL
|
|
||||||
invalid_seek, // ESPIPE
|
|
||||||
io_error, // EIO
|
|
||||||
is_a_directory, // EISDIR
|
|
||||||
message_size, // EMSGSIZE
|
|
||||||
network_down, // ENETDOWN
|
|
||||||
network_reset, // ENETRESET
|
|
||||||
network_unreachable, // ENETUNREACH
|
|
||||||
no_buffer_space, // ENOBUFS
|
|
||||||
no_child_process, // ECHILD
|
|
||||||
no_link, // ENOLINK
|
|
||||||
no_lock_available, // ENOLCK
|
|
||||||
no_message_available, // ENODATA
|
|
||||||
no_message, // ENOMSG
|
|
||||||
no_protocol_option, // ENOPROTOOPT
|
|
||||||
no_space_on_device, // ENOSPC
|
|
||||||
no_stream_resources, // ENOSR
|
|
||||||
no_such_device_or_address, // ENXIO
|
|
||||||
no_such_device, // ENODEV
|
|
||||||
no_such_file_or_directory, // ENOENT
|
|
||||||
no_such_process, // ESRCH
|
|
||||||
not_a_directory, // ENOTDIR
|
|
||||||
not_a_socket, // ENOTSOCK
|
|
||||||
not_a_stream, // ENOSTR
|
|
||||||
not_connected, // ENOTCONN
|
|
||||||
not_enough_memory, // ENOMEM
|
|
||||||
not_supported, // ENOTSUP
|
|
||||||
operation_canceled, // ECANCELED
|
|
||||||
operation_in_progress, // EINPROGRESS
|
|
||||||
operation_not_permitted, // EPERM
|
|
||||||
operation_not_supported, // EOPNOTSUPP
|
|
||||||
operation_would_block, // EWOULDBLOCK
|
|
||||||
owner_dead, // EOWNERDEAD
|
|
||||||
permission_denied, // EACCES
|
|
||||||
protocol_error, // EPROTO
|
|
||||||
protocol_not_supported, // EPROTONOSUPPORT
|
|
||||||
read_only_file_system, // EROFS
|
|
||||||
resource_deadlock_would_occur, // EDEADLK
|
|
||||||
resource_unavailable_try_again, // EAGAIN
|
|
||||||
result_out_of_range, // ERANGE
|
|
||||||
state_not_recoverable, // ENOTRECOVERABLE
|
|
||||||
stream_timeout, // ETIME
|
|
||||||
text_file_busy, // ETXTBSY
|
|
||||||
timed_out, // ETIMEDOUT
|
|
||||||
too_many_files_open_in_system, // ENFILE
|
|
||||||
too_many_files_open, // EMFILE
|
|
||||||
too_many_links, // EMLINK
|
|
||||||
too_many_symbolic_link_levels, // ELOOP
|
|
||||||
value_too_large, // EOVERFLOW
|
|
||||||
wrong_protocol_type // EPROTOTYPE
|
|
||||||
};
|
|
||||||
|
|
||||||
template <> struct is_error_condition_enum<errc>
|
template <> struct is_error_condition_enum<errc>
|
||||||
: true_type { }
|
: true_type { }
|
||||||
|
|
||||||
@@ -225,8 +143,7 @@ template <> struct hash<std::error_condition>;
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <__config>
|
#include <__errc>
|
||||||
#include <cerrno>
|
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <__functional_base>
|
#include <__functional_base>
|
||||||
@@ -260,109 +177,6 @@ template <class _Tp>
|
|||||||
_LIBCPP_INLINE_VAR constexpr size_t is_error_condition_enum_v = is_error_condition_enum<_Tp>::value;
|
_LIBCPP_INLINE_VAR constexpr size_t is_error_condition_enum_v = is_error_condition_enum<_Tp>::value;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Some error codes are not present on all platforms, so we provide equivalents
|
|
||||||
// for them:
|
|
||||||
|
|
||||||
//enum class errc
|
|
||||||
_LIBCPP_DECLARE_STRONG_ENUM(errc)
|
|
||||||
{
|
|
||||||
address_family_not_supported = EAFNOSUPPORT,
|
|
||||||
address_in_use = EADDRINUSE,
|
|
||||||
address_not_available = EADDRNOTAVAIL,
|
|
||||||
already_connected = EISCONN,
|
|
||||||
argument_list_too_long = E2BIG,
|
|
||||||
argument_out_of_domain = EDOM,
|
|
||||||
bad_address = EFAULT,
|
|
||||||
bad_file_descriptor = EBADF,
|
|
||||||
bad_message = EBADMSG,
|
|
||||||
broken_pipe = EPIPE,
|
|
||||||
connection_aborted = ECONNABORTED,
|
|
||||||
connection_already_in_progress = EALREADY,
|
|
||||||
connection_refused = ECONNREFUSED,
|
|
||||||
connection_reset = ECONNRESET,
|
|
||||||
cross_device_link = EXDEV,
|
|
||||||
destination_address_required = EDESTADDRREQ,
|
|
||||||
device_or_resource_busy = EBUSY,
|
|
||||||
directory_not_empty = ENOTEMPTY,
|
|
||||||
executable_format_error = ENOEXEC,
|
|
||||||
file_exists = EEXIST,
|
|
||||||
file_too_large = EFBIG,
|
|
||||||
filename_too_long = ENAMETOOLONG,
|
|
||||||
function_not_supported = ENOSYS,
|
|
||||||
host_unreachable = EHOSTUNREACH,
|
|
||||||
identifier_removed = EIDRM,
|
|
||||||
illegal_byte_sequence = EILSEQ,
|
|
||||||
inappropriate_io_control_operation = ENOTTY,
|
|
||||||
interrupted = EINTR,
|
|
||||||
invalid_argument = EINVAL,
|
|
||||||
invalid_seek = ESPIPE,
|
|
||||||
io_error = EIO,
|
|
||||||
is_a_directory = EISDIR,
|
|
||||||
message_size = EMSGSIZE,
|
|
||||||
network_down = ENETDOWN,
|
|
||||||
network_reset = ENETRESET,
|
|
||||||
network_unreachable = ENETUNREACH,
|
|
||||||
no_buffer_space = ENOBUFS,
|
|
||||||
no_child_process = ECHILD,
|
|
||||||
no_link = ENOLINK,
|
|
||||||
no_lock_available = ENOLCK,
|
|
||||||
#ifdef ENODATA
|
|
||||||
no_message_available = ENODATA,
|
|
||||||
#else
|
|
||||||
no_message_available = ENOMSG,
|
|
||||||
#endif
|
|
||||||
no_message = ENOMSG,
|
|
||||||
no_protocol_option = ENOPROTOOPT,
|
|
||||||
no_space_on_device = ENOSPC,
|
|
||||||
#ifdef ENOSR
|
|
||||||
no_stream_resources = ENOSR,
|
|
||||||
#else
|
|
||||||
no_stream_resources = ENOMEM,
|
|
||||||
#endif
|
|
||||||
no_such_device_or_address = ENXIO,
|
|
||||||
no_such_device = ENODEV,
|
|
||||||
no_such_file_or_directory = ENOENT,
|
|
||||||
no_such_process = ESRCH,
|
|
||||||
not_a_directory = ENOTDIR,
|
|
||||||
not_a_socket = ENOTSOCK,
|
|
||||||
#ifdef ENOSTR
|
|
||||||
not_a_stream = ENOSTR,
|
|
||||||
#else
|
|
||||||
not_a_stream = EINVAL,
|
|
||||||
#endif
|
|
||||||
not_connected = ENOTCONN,
|
|
||||||
not_enough_memory = ENOMEM,
|
|
||||||
not_supported = ENOTSUP,
|
|
||||||
operation_canceled = ECANCELED,
|
|
||||||
operation_in_progress = EINPROGRESS,
|
|
||||||
operation_not_permitted = EPERM,
|
|
||||||
operation_not_supported = EOPNOTSUPP,
|
|
||||||
operation_would_block = EWOULDBLOCK,
|
|
||||||
owner_dead = EOWNERDEAD,
|
|
||||||
permission_denied = EACCES,
|
|
||||||
protocol_error = EPROTO,
|
|
||||||
protocol_not_supported = EPROTONOSUPPORT,
|
|
||||||
read_only_file_system = EROFS,
|
|
||||||
resource_deadlock_would_occur = EDEADLK,
|
|
||||||
resource_unavailable_try_again = EAGAIN,
|
|
||||||
result_out_of_range = ERANGE,
|
|
||||||
state_not_recoverable = ENOTRECOVERABLE,
|
|
||||||
#ifdef ETIME
|
|
||||||
stream_timeout = ETIME,
|
|
||||||
#else
|
|
||||||
stream_timeout = ETIMEDOUT,
|
|
||||||
#endif
|
|
||||||
text_file_busy = ETXTBSY,
|
|
||||||
timed_out = ETIMEDOUT,
|
|
||||||
too_many_files_open_in_system = ENFILE,
|
|
||||||
too_many_files_open = EMFILE,
|
|
||||||
too_many_links = EMLINK,
|
|
||||||
too_many_symbolic_link_levels = ELOOP,
|
|
||||||
value_too_large = EOVERFLOW,
|
|
||||||
wrong_protocol_type = EPROTOTYPE
|
|
||||||
};
|
|
||||||
_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(errc)
|
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct _LIBCPP_TEMPLATE_VIS is_error_condition_enum<errc>
|
struct _LIBCPP_TEMPLATE_VIS is_error_condition_enum<errc>
|
||||||
: true_type { };
|
: true_type { };
|
||||||
|
Reference in New Issue
Block a user