mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Update.
1999-05-11 Ulrich Drepper <drepper@cygnus.com> * elf/Versions (ld.so) [GLIBC_2.1.1]: Add _dl_lazy. * elf/dl-open.c (_dl_open_worker): Only relocate newly loaded objects lazily if LD_BIND_NOW is not set. * elf/dl-support.c (_dl_lazy): New variable. (non_dynamic_init): Set _dl_lazy according to LD_BIND_NOW envvar. * elf/rtld.c (_dl_lazy): new global variable. ( dl_main): Remove lazy, replace it by _dl_lazy. 1999-05-06 Andreas Schwab <schwab@issan.cs.uni-dortmund.de> * locale/setlocale.c (new_composite_name): Check also whether the first category name differs. 1999-05-11 Andreas Schwab <schwab@issan.cs.uni-dortmund.de> * sysdeps/unix/sysv/linux/ftime.c: Use the bsd implementation, not the generic one. 1999-05-11 Philip Blundell <pb@nexus.co.uk> * sysdeps/generic/bits/socket.h (struct sockaddr_storage): New structure; storage suitable for any socket address. * sysdeps/unix/sysv/linux/bits/socket.h (struct sockaddr_storage): Likewise. * sysdeps/unix/sysv/linux/mips/bits/socket.h (struct sockaddr_storage): Likewise. * inet/netinet/in.h: Use ULONG_MAX not ~0 to test for a 64-bit platform.
This commit is contained in:
32
ChangeLog
32
ChangeLog
@ -1,3 +1,35 @@
|
|||||||
|
1999-05-11 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* elf/Versions (ld.so) [GLIBC_2.1.1]: Add _dl_lazy.
|
||||||
|
* elf/dl-open.c (_dl_open_worker): Only relocate newly loaded objects
|
||||||
|
lazily if LD_BIND_NOW is not set.
|
||||||
|
* elf/dl-support.c (_dl_lazy): New variable.
|
||||||
|
(non_dynamic_init): Set _dl_lazy according to LD_BIND_NOW envvar.
|
||||||
|
* elf/rtld.c (_dl_lazy): new global variable.
|
||||||
|
( dl_main): Remove lazy, replace it by _dl_lazy.
|
||||||
|
|
||||||
|
1999-05-06 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
|
||||||
|
|
||||||
|
* locale/setlocale.c (new_composite_name): Check also whether the
|
||||||
|
first category name differs.
|
||||||
|
|
||||||
|
1999-05-11 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/ftime.c: Use the bsd implementation, not
|
||||||
|
the generic one.
|
||||||
|
|
||||||
|
1999-05-11 Philip Blundell <pb@nexus.co.uk>
|
||||||
|
|
||||||
|
* sysdeps/generic/bits/socket.h (struct sockaddr_storage): New
|
||||||
|
structure; storage suitable for any socket address.
|
||||||
|
* sysdeps/unix/sysv/linux/bits/socket.h (struct sockaddr_storage):
|
||||||
|
Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/mips/bits/socket.h (struct
|
||||||
|
sockaddr_storage): Likewise.
|
||||||
|
|
||||||
|
* inet/netinet/in.h: Use ULONG_MAX not ~0 to test for a 64-bit
|
||||||
|
platform.
|
||||||
|
|
||||||
1999-05-10 Ulrich Drepper <drepper@cygnus.com>
|
1999-05-10 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
* hesiod/Versions: Change _nss_hesiod_getpwuid and
|
* hesiod/Versions: Change _nss_hesiod_getpwuid and
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* System-specific socket constants and types. Generic/4.3 BSD version.
|
/* System-specific socket constants and types. Generic/4.3 BSD version.
|
||||||
Copyright (C) 1991, 92, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
|
Copyright (C) 1991,92,94,95,96,97,98,99 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -24,6 +24,9 @@
|
|||||||
# error "Never include <bits/socket.h> directly; use <sys/socket.h> instead."
|
# error "Never include <bits/socket.h> directly; use <sys/socket.h> instead."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#include <bits/types.h>
|
||||||
|
|
||||||
#define __need_size_t
|
#define __need_size_t
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
@ -127,6 +130,24 @@ struct sockaddr
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Structure large enough to hold any socket address (with the historical
|
||||||
|
exception of AF_UNIX). We reserve 128 bytes. */
|
||||||
|
#if ULONG_MAX > 0xffffffff
|
||||||
|
# define __ss_align __uint64_t
|
||||||
|
#else
|
||||||
|
# define __ss_align __uint32_t
|
||||||
|
#endif
|
||||||
|
#define _SS_SIZE 128
|
||||||
|
#define _SS_PADSIZE (_SS_SIZE - (2 * sizeof (__ss_align)))
|
||||||
|
|
||||||
|
struct sockaddr_storage
|
||||||
|
{
|
||||||
|
__SOCKADDR_COMMON (__ss_); /* Address family, etc. */
|
||||||
|
__ss_align __ss_align; /* Force desired alignment. */
|
||||||
|
char __ss_padding[_SS_PADSIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Bits in the FLAGS argument to `send', `recv', et al. */
|
/* Bits in the FLAGS argument to `send', `recv', et al. */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -39,7 +39,7 @@ ld.so {
|
|||||||
}
|
}
|
||||||
GLIBC_2.1.1 {
|
GLIBC_2.1.1 {
|
||||||
# global variables
|
# global variables
|
||||||
_dl_origin_path; _dl_platformlen;
|
_dl_lazy; _dl_origin_path; _dl_platformlen;
|
||||||
|
|
||||||
# functions used in other libraries
|
# functions used in other libraries
|
||||||
_dl_dst_count; _dl_dst_substitute;
|
_dl_dst_count; _dl_dst_substitute;
|
||||||
|
@ -46,6 +46,8 @@ extern char **__libc_argv;
|
|||||||
|
|
||||||
extern char **__environ;
|
extern char **__environ;
|
||||||
|
|
||||||
|
extern int _dl_lazy; /* Do we do lazy relocations? */
|
||||||
|
|
||||||
/* Undefine the following for debugging. */
|
/* Undefine the following for debugging. */
|
||||||
/* #define SCOPE_DEBUG 1 */
|
/* #define SCOPE_DEBUG 1 */
|
||||||
#ifdef SCOPE_DEBUG
|
#ifdef SCOPE_DEBUG
|
||||||
@ -85,6 +87,7 @@ dl_open_worker (void *a)
|
|||||||
struct r_debug *r;
|
struct r_debug *r;
|
||||||
unsigned int global_add;
|
unsigned int global_add;
|
||||||
const char *dst;
|
const char *dst;
|
||||||
|
int lazy;
|
||||||
|
|
||||||
/* Maybe we have to expand a DST. */
|
/* Maybe we have to expand a DST. */
|
||||||
dst = strchr (file, '$');
|
dst = strchr (file, '$');
|
||||||
@ -145,6 +148,9 @@ dl_open_worker (void *a)
|
|||||||
show_scope (new);
|
show_scope (new);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Only do lazy relocation if `LD_BIND_NOW' is not set. */
|
||||||
|
lazy = (mode & RTLD_BINDING_MASK) == RTLD_LAZY && _dl_lazy;
|
||||||
|
|
||||||
/* Relocate the objects loaded. We do this in reverse order so that copy
|
/* Relocate the objects loaded. We do this in reverse order so that copy
|
||||||
relocs of earlier objects overwrite the data written by later objects. */
|
relocs of earlier objects overwrite the data written by later objects. */
|
||||||
|
|
||||||
@ -173,8 +179,7 @@ dl_open_worker (void *a)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
_dl_relocate_object (l, l->l_scope,
|
_dl_relocate_object (l, l->l_scope, lazy, 0);
|
||||||
(mode & RTLD_BINDING_MASK) == RTLD_LAZY, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (l == new)
|
if (l == new)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Support for dynamic linking code in static libc.
|
/* Support for dynamic linking code in static libc.
|
||||||
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
|
Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -40,6 +40,7 @@ int _dl_debug_symbols;
|
|||||||
int _dl_debug_versions;
|
int _dl_debug_versions;
|
||||||
int _dl_debug_reloc;
|
int _dl_debug_reloc;
|
||||||
int _dl_debug_files;
|
int _dl_debug_files;
|
||||||
|
int _dl_lazy;
|
||||||
|
|
||||||
/* If nonzero print warnings about problematic situations. */
|
/* If nonzero print warnings about problematic situations. */
|
||||||
int _dl_verbose;
|
int _dl_verbose;
|
||||||
@ -90,6 +91,8 @@ non_dynamic_init (void)
|
|||||||
objects. */
|
objects. */
|
||||||
_dl_init_paths (getenv ("LD_LIBRARY_PATH"));
|
_dl_init_paths (getenv ("LD_LIBRARY_PATH"));
|
||||||
|
|
||||||
|
_dl_lazy = *(getenv ("LD_BIND_NOW") ?: "") == '\0';
|
||||||
|
|
||||||
#ifdef DL_PLATFORM_INIT
|
#ifdef DL_PLATFORM_INIT
|
||||||
DL_PLATFORM_INIT;
|
DL_PLATFORM_INIT;
|
||||||
#endif
|
#endif
|
||||||
|
14
elf/rtld.c
14
elf/rtld.c
@ -82,6 +82,7 @@ struct r_search_path *_dl_search_paths;
|
|||||||
const char *_dl_profile;
|
const char *_dl_profile;
|
||||||
const char *_dl_profile_output;
|
const char *_dl_profile_output;
|
||||||
struct link_map *_dl_profile_map;
|
struct link_map *_dl_profile_map;
|
||||||
|
int _dl_lazy;
|
||||||
int _dl_debug_libs;
|
int _dl_debug_libs;
|
||||||
int _dl_debug_impcalls;
|
int _dl_debug_impcalls;
|
||||||
int _dl_debug_bindings;
|
int _dl_debug_bindings;
|
||||||
@ -332,7 +333,6 @@ dl_main (const ElfW(Phdr) *phdr,
|
|||||||
ElfW(Addr) *user_entry)
|
ElfW(Addr) *user_entry)
|
||||||
{
|
{
|
||||||
const ElfW(Phdr) *ph;
|
const ElfW(Phdr) *ph;
|
||||||
int lazy;
|
|
||||||
enum mode mode;
|
enum mode mode;
|
||||||
struct link_map **preloads;
|
struct link_map **preloads;
|
||||||
unsigned int npreloads;
|
unsigned int npreloads;
|
||||||
@ -346,7 +346,7 @@ dl_main (const ElfW(Phdr) *phdr,
|
|||||||
hp_timing_t diff;
|
hp_timing_t diff;
|
||||||
|
|
||||||
/* Process the environment variable which control the behaviour. */
|
/* Process the environment variable which control the behaviour. */
|
||||||
process_envvars (&mode, &lazy);
|
process_envvars (&mode, &_dl_lazy);
|
||||||
|
|
||||||
/* Set up a flag which tells we are just starting. */
|
/* Set up a flag which tells we are just starting. */
|
||||||
_dl_starting_up = 1;
|
_dl_starting_up = 1;
|
||||||
@ -377,7 +377,7 @@ dl_main (const ElfW(Phdr) *phdr,
|
|||||||
if (! strcmp (_dl_argv[1], "--list"))
|
if (! strcmp (_dl_argv[1], "--list"))
|
||||||
{
|
{
|
||||||
mode = list;
|
mode = list;
|
||||||
lazy = -1; /* This means do no dependency analysis. */
|
_dl_lazy = -1; /* This means do no dependency analysis. */
|
||||||
|
|
||||||
++_dl_skip_args;
|
++_dl_skip_args;
|
||||||
--_dl_argc;
|
--_dl_argc;
|
||||||
@ -853,13 +853,13 @@ of this helper program; chances are you did not intend to run this program.\n\
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (lazy >= 0)
|
if (_dl_lazy >= 0)
|
||||||
{
|
{
|
||||||
/* We have to do symbol dependency testing. */
|
/* We have to do symbol dependency testing. */
|
||||||
struct relocate_args args;
|
struct relocate_args args;
|
||||||
struct link_map *l;
|
struct link_map *l;
|
||||||
|
|
||||||
args.lazy = lazy;
|
args.lazy = _dl_lazy;
|
||||||
|
|
||||||
l = _dl_loaded;
|
l = _dl_loaded;
|
||||||
while (l->l_next)
|
while (l->l_next)
|
||||||
@ -974,7 +974,7 @@ of this helper program; chances are you did not intend to run this program.\n\
|
|||||||
hp_timing_t add;
|
hp_timing_t add;
|
||||||
|
|
||||||
/* If we are profiling we also must do lazy reloaction. */
|
/* If we are profiling we also must do lazy reloaction. */
|
||||||
lazy |= consider_profiling;
|
_dl_lazy |= consider_profiling;
|
||||||
|
|
||||||
l = _dl_loaded;
|
l = _dl_loaded;
|
||||||
while (l->l_next)
|
while (l->l_next)
|
||||||
@ -984,7 +984,7 @@ of this helper program; chances are you did not intend to run this program.\n\
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
if (l != &_dl_rtld_map)
|
if (l != &_dl_rtld_map)
|
||||||
_dl_relocate_object (l, l->l_scope, lazy, consider_profiling);
|
_dl_relocate_object (l, l->l_scope, _dl_lazy, consider_profiling);
|
||||||
|
|
||||||
l = l->l_prev;
|
l = l->l_prev;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1991,92,93,94,95,96,97,98 Free Software Foundation, Inc.
|
/* Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -20,6 +20,7 @@
|
|||||||
#define _NETINET_IN_H 1
|
#define _NETINET_IN_H 1
|
||||||
|
|
||||||
#include <features.h>
|
#include <features.h>
|
||||||
|
#include <limits.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
@ -164,7 +165,7 @@ struct in6_addr
|
|||||||
uint8_t u6_addr8[16];
|
uint8_t u6_addr8[16];
|
||||||
uint16_t u6_addr16[8];
|
uint16_t u6_addr16[8];
|
||||||
uint32_t u6_addr32[4];
|
uint32_t u6_addr32[4];
|
||||||
#if (~0UL) > 0xffffffff
|
#if ULONG_MAX > 0xffffffff
|
||||||
uint64_t u6_addr64[2];
|
uint64_t u6_addr64[2];
|
||||||
#endif
|
#endif
|
||||||
} in6_u;
|
} in6_u;
|
||||||
|
@ -149,7 +149,7 @@ new_composite_name (int category, const char *newnames[LC_ALL])
|
|||||||
_nl_current_names[i]);
|
_nl_current_names[i]);
|
||||||
last_len = strlen (name);
|
last_len = strlen (name);
|
||||||
cumlen += _nl_category_name_sizes[i] + 1 + last_len + 1;
|
cumlen += _nl_category_name_sizes[i] + 1 + last_len + 1;
|
||||||
if (i > 0 && same && strcmp (name, newnames[0]) != 0)
|
if (same && strcmp (name, newnames[0]) != 0)
|
||||||
same = 0;
|
same = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* System-specific socket constants and types. Generic/4.3 BSD version.
|
/* System-specific socket constants and types. Generic/4.3 BSD version.
|
||||||
Copyright (C) 1991, 92, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
|
Copyright (C) 1991,92,94,95,96,97,98,99 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -24,6 +24,9 @@
|
|||||||
# error "Never include <bits/socket.h> directly; use <sys/socket.h> instead."
|
# error "Never include <bits/socket.h> directly; use <sys/socket.h> instead."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#include <bits/types.h>
|
||||||
|
|
||||||
#define __need_size_t
|
#define __need_size_t
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
@ -127,6 +130,24 @@ struct sockaddr
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Structure large enough to hold any socket address (with the historical
|
||||||
|
exception of AF_UNIX). We reserve 128 bytes. */
|
||||||
|
#if ULONG_MAX > 0xffffffff
|
||||||
|
# define __ss_align __uint64_t
|
||||||
|
#else
|
||||||
|
# define __ss_align __uint32_t
|
||||||
|
#endif
|
||||||
|
#define _SS_SIZE 128
|
||||||
|
#define _SS_PADSIZE (_SS_SIZE - (2 * sizeof (__ss_align)))
|
||||||
|
|
||||||
|
struct sockaddr_storage
|
||||||
|
{
|
||||||
|
__SOCKADDR_COMMON (__ss_); /* Address family, etc. */
|
||||||
|
__ss_align __ss_align; /* Force desired alignment. */
|
||||||
|
char __ss_padding[_SS_PADSIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Bits in the FLAGS argument to `send', `recv', et al. */
|
/* Bits in the FLAGS argument to `send', `recv', et al. */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#define __need_NULL
|
#define __need_NULL
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
/* Type for length arguments in socket calls. */
|
/* Type for length arguments in socket calls. */
|
||||||
@ -139,6 +140,24 @@ struct sockaddr
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Structure large enough to hold any socket address (with the historical
|
||||||
|
exception of AF_UNIX). We reserve 128 bytes. */
|
||||||
|
#if ULONG_MAX > 0xffffffff
|
||||||
|
# define __ss_aligntype __uint64_t
|
||||||
|
#else
|
||||||
|
# define __ss_aligntype __uint32_t
|
||||||
|
#endif
|
||||||
|
#define _SS_SIZE 128
|
||||||
|
#define _SS_PADSIZE (_SS_SIZE - (2 * sizeof (__ss_aligntype)))
|
||||||
|
|
||||||
|
struct sockaddr_storage
|
||||||
|
{
|
||||||
|
__SOCKADDR_COMMON (__ss_); /* Address family, etc. */
|
||||||
|
__ss_aligntype __ss_align; /* Force desired alignment. */
|
||||||
|
char __ss_padding[_SS_PADSIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Bits in the FLAGS argument to `send', `recv', et al. */
|
/* Bits in the FLAGS argument to `send', `recv', et al. */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
/* Linux defines the ftime system call but doesn't actually implement
|
/* Linux defines the ftime system call but doesn't actually implement
|
||||||
it. Use the generic implementation. */
|
it. Use the BSD implementation. */
|
||||||
#include <sysdeps/generic/ftime.c>
|
#include <sysdeps/unix/bsd/ftime.c>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* System-specific socket constants and types. Linux/MIPS version.
|
/* System-specific socket constants and types. Linux/MIPS version.
|
||||||
Copyright (C) 1991, 92, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
|
Copyright (C) 1991,92,94,95,96,97,98,99 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -28,6 +28,7 @@
|
|||||||
#define __need_NULL
|
#define __need_NULL
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
/* Type for length arguments in socket calls. */
|
/* Type for length arguments in socket calls. */
|
||||||
@ -133,6 +134,24 @@ struct sockaddr
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Structure large enough to hold any socket address (with the historical
|
||||||
|
exception of AF_UNIX). We reserve 128 bytes. */
|
||||||
|
#if ULONG_MAX > 0xffffffff
|
||||||
|
# define __ss_align __uint64_t
|
||||||
|
#else
|
||||||
|
# define __ss_align __uint32_t
|
||||||
|
#endif
|
||||||
|
#define _SS_SIZE 128
|
||||||
|
#define _SS_PADSIZE (_SS_SIZE - (2 * sizeof(__ss_align)))
|
||||||
|
|
||||||
|
struct sockaddr_storage
|
||||||
|
{
|
||||||
|
__SOCKADDR_COMMON (__ss_); /* Address family, etc. */
|
||||||
|
__ss_align __ss_align; /* Force desired alignment. */
|
||||||
|
char __ss_padding[_SS_PADSIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Bits in the FLAGS argument to `send', `recv', et al. */
|
/* Bits in the FLAGS argument to `send', `recv', et al. */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user