mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
ef2e26c91b
(This used to be commit b0510b5428
)
536 lines
14 KiB
C
536 lines
14 KiB
C
/*
|
|
Unix SMB/CIFS implementation.
|
|
Build Options for Samba Suite
|
|
Copyright (C) Vance Lankhaar <vlankhaar@hotmail.com> 2001
|
|
Copyright (C) Andrew Bartlett <abartlet@samba.org> 2001
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
#include "includes.h"
|
|
#include "build_env.h"
|
|
#include "dynconfig.h"
|
|
|
|
static void output(BOOL screen, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
|
|
|
|
/*
|
|
#define OUTPUT(x) snprintf(outstring,sizeof(outstring),x); output(screen,outstring);
|
|
*/
|
|
/****************************************************************************
|
|
helper function for build_options
|
|
****************************************************************************/
|
|
static void output(BOOL screen, const char *format, ...)
|
|
{
|
|
char *ptr;
|
|
va_list ap;
|
|
|
|
va_start(ap, format);
|
|
vasprintf(&ptr,format,ap);
|
|
va_end(ap);
|
|
|
|
if (screen) {
|
|
d_printf("%s", ptr);
|
|
} else {
|
|
DEBUG(4,("%s", ptr));
|
|
}
|
|
|
|
SAFE_FREE(ptr);
|
|
}
|
|
|
|
/****************************************************************************
|
|
options set at build time for the samba suite
|
|
****************************************************************************/
|
|
void build_options(BOOL screen)
|
|
{
|
|
if ((DEBUGLEVEL < 4) && (!screen)) {
|
|
return;
|
|
}
|
|
|
|
#ifdef _BUILD_ENV_H
|
|
/* Output information about the build environment */
|
|
output(screen,"Build environment:\n");
|
|
output(screen," Built by: %s@%s\n",BUILD_ENV_USER,BUILD_ENV_HOST);
|
|
output(screen," Built on: %s\n",BUILD_ENV_DATE);
|
|
|
|
output(screen," Built using: %s\n",BUILD_ENV_COMPILER);
|
|
output(screen," Build host: %s\n",BUILD_ENV_UNAME);
|
|
output(screen," SRCDIR: %s\n",BUILD_ENV_SRCDIR);
|
|
output(screen," BUILDDIR: %s\n",BUILD_ENV_BUILDDIR);
|
|
|
|
|
|
#endif
|
|
|
|
/* Output various options (most correspond to --with options) */
|
|
output(screen,"\nBuild options:\n");
|
|
#ifdef WITH_SMBWRAPPER
|
|
output(screen," WITH_SMBWRAPPER\n");
|
|
#endif
|
|
#ifdef WITH_AFS
|
|
output(screen," WITH_AFS\n");
|
|
#endif
|
|
#ifdef WITH_DFS
|
|
output(screen," WITH_DFS\n");
|
|
#endif
|
|
#ifdef KRB4_AUTH
|
|
output(screen," KRB4_AUTH");
|
|
#endif
|
|
#ifdef HAVE_KRB5
|
|
output(screen," HAVE_KRB5");
|
|
#endif
|
|
#ifdef HAVE_GSSAPI
|
|
output(screen," HAVE_GSSAPI");
|
|
#endif
|
|
#ifdef HAVE_LDAP
|
|
output(screen," HAVE_LDAP");
|
|
#endif
|
|
#ifdef WITH_AUTOMOUNT
|
|
output(screen," WITH_AUTOMOUNT\n");
|
|
#endif
|
|
#ifdef WITH_SMBMOUNT
|
|
output(screen," WITH_SMBMOUNT\n");
|
|
#endif
|
|
#ifdef WITH_PAM
|
|
output(screen," WITH_PAM\n");
|
|
#endif
|
|
#ifdef WITH_TDB_SAM
|
|
output(screen," WITH_TDB_SAM\n");
|
|
#endif
|
|
#ifdef WITH_SMBPASSWD_SAM
|
|
output(screen," WITH_SMBPASSWD_SAM\n");
|
|
#endif
|
|
#ifdef WITH_NISPLUS_SAM
|
|
output(screen," WITH_NISPLUS_SAM\n");
|
|
#endif
|
|
#ifdef WITH_NISPLUS_HOME
|
|
output(screen," WITH_NISPLUS_HOME\n");
|
|
#endif
|
|
#ifdef WITH_SYSLOG
|
|
output(screen," WITH_SYSLOG\n");
|
|
#endif
|
|
#ifdef WITH_QUOTAS
|
|
output(screen," WITH_QUOTAS\n");
|
|
#endif
|
|
#ifdef WITH_VFS
|
|
output(screen," WITH_VFS\n");
|
|
#endif
|
|
#ifdef USE_SPINLOCKS
|
|
output(screen," USE_SPINLOCKS\n");
|
|
#endif
|
|
#ifdef SPARC_SPINLOCKS
|
|
output(screen," SPARC_SPINLOCKS\n");
|
|
#endif
|
|
#ifdef INTEL_SPINLOCKS
|
|
output(screen," INTEL_SPINLOCKS\n");
|
|
#endif
|
|
#ifdef MIPS_SPINLOCKS
|
|
output(screen," MIPS_SPINLOCKS\n");
|
|
#endif
|
|
#ifdef POWERPC_SPINLOCKS
|
|
output(screen," POWERPC_SPINLOCKS\n");
|
|
#endif
|
|
#ifdef HAVE_UNIXWARE_ACLS
|
|
output(screen," HAVE_UNIXWARE_ACLS\n");
|
|
#endif
|
|
#ifdef HAVE_SOLARIS_ACLS
|
|
output(screen," HAVE_SOLARIS_ACLS\n");
|
|
#endif
|
|
#ifdef HAVE_IRIX_ACLS
|
|
output(screen," HAVE_IRIX_ACLS\n");
|
|
#endif
|
|
#ifdef HAVE_AIX_ACLS
|
|
output(screen," HAVE_AIX_ACLS\n");
|
|
#endif
|
|
#ifdef HAVE_POSIX_ACLS
|
|
output(screen," HAVE_POSIX_ACLS\n");
|
|
#endif
|
|
#ifdef HAVE_TRU64_ACLS
|
|
output(screen," HAVE_TRU64_ACLS\n");
|
|
#endif
|
|
|
|
#ifdef HAVE_ACL_GET_PERM_NP
|
|
output(screen," HAVE_ACL_GET_PERM_NP\n");
|
|
#endif
|
|
#ifdef HAVE_NO_ACLS
|
|
output(screen," HAVE_NO_ACLS\n");
|
|
#endif
|
|
#ifdef HAVE_LIBREADLINE
|
|
output(screen," HAVE_LIBREADLINE\n");
|
|
#endif
|
|
#ifdef WITH_LIBICONV
|
|
output(screen," WITH_LIBICONV: %s\n",WITH_LIBICONV);
|
|
#endif
|
|
|
|
|
|
/* Output various paths to files and directories */
|
|
output(screen,"\nPaths:\n");
|
|
output(screen," CONFIGFILE: %s\n", dyn_CONFIGFILE);
|
|
#ifdef PRIVATE_DIR
|
|
output(screen," PRIVATE_DIR: %s\n",PRIVATE_DIR);
|
|
#endif
|
|
#ifdef LMHOSTSFILE
|
|
output(screen," LMHOSTSFILE: %s\n",LMHOSTSFILE);
|
|
#endif
|
|
output(screen," SBINDIR: %s\n", dyn_SBINDIR);
|
|
output(screen," BINDIR: %s\n", dyn_BINDIR);
|
|
output(screen," LOCKDIR: %s\n",dyn_LOCKDIR);
|
|
output(screen," LOGFILEBASE: %s\n", dyn_LOGFILEBASE);
|
|
|
|
/*Output various other options (most map to defines in the configure script*/
|
|
output(screen,"\nOther Build Options:\n");
|
|
#ifdef HAVE_VOLATILE
|
|
output(screen," HAVE_VOLATILE\n");
|
|
#endif
|
|
#ifdef HAVE_SHADOW_H
|
|
output(screen," HAVE_SHADOW_H\n");
|
|
#endif
|
|
#ifdef HAVE_CRYPT
|
|
output(screen," HAVE_CRYPT\n");
|
|
#endif
|
|
#ifdef USE_BOTH_CRYPT_CALLS
|
|
output(screen," USE_BOTH_CRYPT_CALLS\n");
|
|
#endif
|
|
#ifdef HAVE_TRUNCATED_SALT
|
|
output(screen," HAVE_TRUNCATED_SALT\n");
|
|
#endif
|
|
#ifdef HAVE_CUPS
|
|
output(screen," HAVE_CUPS\n");
|
|
#endif
|
|
#ifdef HAVE_CUPS_CUPS_H
|
|
output(screen," HAVE_CUPS_CUPS_H\n");
|
|
#endif
|
|
#ifdef HAVE_CUPS_LANGUAGE_H
|
|
output(screen," HAVE_CUPS_LANGUAGE_H\n");
|
|
#endif
|
|
#ifdef HAVE_DLOPEN
|
|
output(screen," HAVE_DLOPEN\n");
|
|
#endif
|
|
#ifdef HAVE_DLCLOSE
|
|
output(screen," HAVE_DLCLOSE\n");
|
|
#endif
|
|
#ifdef HAVE_DLSYM
|
|
output(screen," HAVE_DLSYM\n");
|
|
#endif
|
|
#ifdef HAVE_DLERROR
|
|
output(screen," HAVE_DLERROR\n");
|
|
#endif
|
|
#ifdef HAVE_UNIXSOCKET
|
|
output(screen," HAVE_UNIXSOCKET\n");
|
|
#endif
|
|
#ifdef HAVE_SOCKLEN_T_TYPE
|
|
output(screen," HAVE_SOCKLEN_T_TYPE\n");
|
|
#endif
|
|
#ifdef HAVE_SIG_ATOMIC_T_TYPE
|
|
output(screen," HAVE_SIG_ATOMIC_T_TYPE\n");
|
|
#endif
|
|
#ifdef HAVE_SETRESUID
|
|
output(screen," HAVE_SETRESUID\n");
|
|
#endif
|
|
#ifdef HAVE_SETRESGID
|
|
output(screen," HAVE_SETRESGID\n");
|
|
#endif
|
|
#ifdef HAVE_CONNECT
|
|
output(screen," HAVE_CONNECT\n");
|
|
#endif
|
|
#ifdef HAVE_YP_GET_DEFAULT_DOMAIN
|
|
output(screen," HAVE_YP_GET_DEFAULT_DOMAIN\n");
|
|
#endif
|
|
#ifdef HAVE_STAT64
|
|
output(screen," HAVE_STAT64\n");
|
|
#endif
|
|
#ifdef HAVE_LSTAT64
|
|
output(screen," HAVE_LSTAT64\n");
|
|
#endif
|
|
#ifdef HAVE_FSTAT64
|
|
output(screen," HAVE_FSTAT64\n");
|
|
#endif
|
|
#ifdef HAVE_STRCASECMP
|
|
output(screen," HAVE_STRCASECMP\n");
|
|
#endif
|
|
#ifdef HAVE_MEMSET
|
|
output(screen," HAVE_MEMSET\n");
|
|
#endif
|
|
#ifdef HAVE_LONGLONG
|
|
output(screen," HAVE_LONGLONG\n");
|
|
#endif
|
|
#ifdef COMPILER_SUPPORTS_LL
|
|
output(screen," COMPILER_SUPPORTS_LL\n");
|
|
#endif
|
|
#ifdef SIZEOF_OFF_T
|
|
output(screen," SIZEOF_OFF_T: %d\n",SIZEOF_OFF_T);
|
|
#endif
|
|
#ifdef HAVE_OFF64_T
|
|
output(screen," HAVE_OFF64_T\n");
|
|
#endif
|
|
#ifdef SIZEOF_INO_T
|
|
output(screen," SIZEOF_INO_T: %d\n",SIZEOF_INO_T);
|
|
#endif
|
|
#ifdef HAVE_INO64_T
|
|
output(screen," HAVE_INO64_T\n");
|
|
#endif
|
|
#ifdef HAVE_STRUCT_DIRENT64
|
|
output(screen," HAVE_STRUCT_DIRENT64\n");
|
|
#endif
|
|
#ifdef HAVE_UNSIGNED_CHAR
|
|
output(screen," HAVE_UNSIGNED_CHAR\n");
|
|
#endif
|
|
#ifdef HAVE_SOCK_SIN_LEN
|
|
output(screen," HAVE_SOCK_SIN_LEN\n");
|
|
#endif
|
|
#ifdef SEEKDIR_RETURNS_VOID
|
|
output(screen," SEEKDIR_RETURNS_VOID\n");
|
|
#endif
|
|
#ifdef HAVE_FUNCTION_MACRO
|
|
output(screen," HAVE_FUNCTION_MACRO\n");
|
|
#endif
|
|
#ifdef HAVE_GETTIMEOFDAY
|
|
output(screen," HAVE_GETTIMEOFDAY\n");
|
|
#endif
|
|
#ifdef HAVE_C99_VSNPRINTF
|
|
output(screen," HAVE_C99_VSNPRINTF\n");
|
|
#endif
|
|
#ifdef HAVE_BROKEN_READDIR
|
|
output(screen," HAVE_BROKEN_READDIR\n");
|
|
#endif
|
|
#ifdef HAVE_NATIVE_ICONV
|
|
output(screen," HAVE_NATIVE_ICONV\n");
|
|
#endif
|
|
#ifdef HAVE_KERNEL_OPLOCKS_LINUX
|
|
output(screen," HAVE_KERNEL_OPLOCKS_LINUX\n");
|
|
#endif
|
|
#ifdef HAVE_KERNEL_CHANGE_NOTIFY
|
|
output(screen," HAVE_KERNEL_CHANGE_NOTIFY\n");
|
|
#endif
|
|
#ifdef HAVE_KERNEL_SHARE_MODES
|
|
output(screen," HAVE_KERNEL_SHARE_MODES\n");
|
|
#endif
|
|
#ifdef HAVE_KERNEL_OPLOCKS_IRIX
|
|
output(screen," HAVE_KERNEL_OPLOCKS_IRIX\n");
|
|
#endif
|
|
#ifdef HAVE_IRIX_SPECIFIC_CAPABILITIES
|
|
output(screen," HAVE_IRIX_SPECIFIC_CAPABILITIES\n");
|
|
#endif
|
|
#ifdef HAVE_INT16_FROM_RPC_RPC_H
|
|
output(screen," HAVE_INT16_FROM_RPC_RPC_H\n");
|
|
#endif
|
|
#ifdef HAVE_UINT16_FROM_RPC_RPC_H
|
|
output(screen," HAVE_UINT16_FROM_RPC_RPC_H\n");
|
|
#endif
|
|
#ifdef HAVE_INT32_FROM_RPC_RPC_H
|
|
output(screen," HAVE_INT16_FROM_RPC_RPC_H\n");
|
|
#endif
|
|
#ifdef HAVE_UINT32_FROM_RPC_RPC_H
|
|
output(screen," HAVE_UINT32_FROM_RPC_RPC_H\n");
|
|
#endif
|
|
#ifdef HAVE_RPC_AUTH_ERROR_CONFLICT
|
|
output(screen," HAVE_RPC_AUTH_ERROR_CONFLICT\n");
|
|
#endif
|
|
#ifdef HAVE_FTRUNCATE_EXTEND
|
|
output(screen," HAVE_FTRUNCATE_EXTEND\n");
|
|
#endif
|
|
#ifdef HAVE_WORKING_AF_LOCAL
|
|
output(screen," HAVE_WORKING_AF_LOCAL\n");
|
|
#endif
|
|
#ifdef HAVE_BROKEN_GETGROUPS
|
|
output(screen," HAVE_BROKEN_GETGROUPS\n");
|
|
#endif
|
|
#ifdef REPLACE_GETPASS
|
|
output(screen," REPLACE_GETPASS\n");
|
|
#endif
|
|
#ifdef REPLACE_INET_NTOA
|
|
output(screen," REPLACE_INET_NTOA\n");
|
|
#endif
|
|
#ifdef HAVE_SECURE_MKSTEMP
|
|
output(screen," HAVE_SECURE_MKSTEMP\n");
|
|
#endif
|
|
#ifdef SYSCONF_SC_NGROUPS_MAX
|
|
output(screen," SYSCONF_SC_NGROUPS_MAX\n");
|
|
#endif
|
|
#ifdef HAVE_IFACE_AIX
|
|
output(screen," HAVE_IFACE_AIX\n");
|
|
#endif
|
|
#ifdef HAVE_IFACE_IFCONF
|
|
output(screen," HAVE_IFACE_IFCONF\n");
|
|
#endif
|
|
#ifdef HAVE_IFACE_IFREQ
|
|
output(screen," HAVE_IFACE_IFREQ\n");
|
|
#endif
|
|
#ifdef USE_SETRESUID
|
|
output(screen," USE_SETRESUID\n");
|
|
#endif
|
|
#ifdef USE_SETRESGID
|
|
output(screen," USE_SETREUID\n");
|
|
#endif
|
|
#ifdef USE_SETEUID
|
|
output(screen," USE_SETEUID\n");
|
|
#endif
|
|
#ifdef USE_SETUIDX
|
|
output(screen," USE_SETUIDX\n");
|
|
#endif
|
|
#ifdef HAVE_MMAP
|
|
output(screen," HAVE_MMAP\n");
|
|
#endif
|
|
#ifdef MMAP_BLACKLIST
|
|
output(screen," MMAP_BLACKLIST\n");
|
|
#endif
|
|
#ifdef FTRUNCATE_NEEDS_ROOT
|
|
output(screen," FTRUNCATE_NEEDS_ROOT\n");
|
|
#endif
|
|
#ifdef HAVE_FCNTL_LOCK
|
|
output(screen," HAVE_FCNTL_LOCK\n");
|
|
#endif
|
|
#ifdef HAVE_BROKEN_FCNTL64_LOCKS
|
|
output(screen," HAVE_BROKEN_FCNTL64_LOCKS\n");
|
|
#endif
|
|
#ifdef HAVE_STRUCT_FLOCK64
|
|
output(screen," HAVE_STRUCT_FLOCK64\n");
|
|
#endif
|
|
#ifdef BROKEN_NISPLUS_INCLUDE_FILES
|
|
output(screen," BROKEN_NISPLUS_INCLUDE_FILES\n");
|
|
#endif
|
|
#ifdef HAVE_LIBPAM
|
|
output(screen," HAVE_LIBPAM\n");
|
|
#endif
|
|
#ifdef STAT_STATVFS64
|
|
output(screen," STAT_STATVFS64\n");
|
|
#endif
|
|
#ifdef STAT_STATVFS
|
|
output(screen," STAT_STATVFS\n");
|
|
#endif
|
|
#ifdef STAT_STATFS3_OSF1
|
|
output(screen," STAT_STATFS3_OSF1\n");
|
|
#endif
|
|
#ifdef STAT_STATFS2_BSIZE
|
|
output(screen," STAT_STATFS2_BSIZE\n");
|
|
#endif
|
|
#ifdef STAT_STATFS4
|
|
output(screen," STAT_STATFS4\n");
|
|
#endif
|
|
#ifdef STAT_STATFS2_FSIZE
|
|
output(screen," STAT_STATFS2_FSIZE\n");
|
|
#endif
|
|
#ifdef STAT_STATFS2_FS_DATA
|
|
output(screen," STAT_STATFS2_FS_DATA\n");
|
|
#endif
|
|
#ifdef HAVE_EXPLICIT_LARGEFILE_SUPPORT
|
|
output(screen," HAVE_EXPLICIT_LARGEFILE_SUPPORT\n");
|
|
#endif
|
|
|
|
#ifdef WITH_UTMP
|
|
/* Output UTMP Stuff */
|
|
output(screen,"\nUTMP Related:\n");
|
|
output(screen," WITH_UTMP\n");
|
|
|
|
#ifdef HAVE_UTIMBUF
|
|
output(screen," HAVE_UTIMBUF\n");
|
|
#endif
|
|
#ifdef HAVE_UT_UT_NAME
|
|
output(screen," HAVE_UT_UT_NAME\n");
|
|
#endif
|
|
#ifdef HAVE_UT_UT_USER
|
|
output(screen," HAVE_UT_UT_USER\n");
|
|
#endif
|
|
#ifdef HAVE_UT_UT_ID
|
|
output(screen," HAVE_UT_UT_ID\n");
|
|
#endif
|
|
#ifdef HAVE_UT_UT_HOST
|
|
output(screen," HAVE_UT_UT_HOST\n");
|
|
#endif
|
|
#ifdef HAVE_UT_UT_TIME
|
|
output(screen," HAVE_UT_UT_TIME\n");
|
|
#endif
|
|
#ifdef HAVE_UT_UT_TV
|
|
output(screen," HAVE_UT_UT_TV\n");
|
|
#endif
|
|
#ifdef HAVE_UT_UT_TYPE
|
|
output(screen," HAVE_UT_UT_TYPE\n");
|
|
#endif
|
|
#ifdef HAVE_UT_UT_PID
|
|
output(screen," HAVE_UT_UT_PID\n");
|
|
#endif
|
|
#ifdef HAVE_UT_UT_EXIT
|
|
output(screen," HAVE_UT_UT_EXIT\n");
|
|
#endif
|
|
#ifdef HAVE_UT_UT_ADDR
|
|
output(screen," HAVE_UT_UT_ADDR\n");
|
|
#endif
|
|
#ifdef PUTUTLINE_RETURNS_UTMP
|
|
output(screen," PUTUTLINE_RETURNS_UTMP\n");
|
|
#endif
|
|
#ifdef HAVE_UX_UT_SYSLEN
|
|
output(screen," HAVE_UX_UT_SYSLEN\n");
|
|
#endif
|
|
#endif /* WITH_UTMP */
|
|
|
|
/* Output Build OS */
|
|
output(screen,"\nBuilt for host os:\n");
|
|
#ifdef LINUX
|
|
output(screen," LINUX\n");
|
|
#endif
|
|
#ifdef SUNOS5
|
|
output(screen," SUNOS5\n");
|
|
#endif
|
|
#ifdef SUNOS4
|
|
output(screen," SUNOS4\n");
|
|
#endif
|
|
/* BSD Isn't Defined in the configure script, but there is something about it in include/config.h.in (and I guess acconfig.h) */
|
|
#ifdef BSD
|
|
output(screen," BSD\n");
|
|
#endif
|
|
#ifdef IRIX
|
|
output(screen," IRIX\n");
|
|
#endif
|
|
#ifdef IRIX6
|
|
output(screen," IRIX6\n");
|
|
#endif
|
|
#ifdef AIX
|
|
output(screen," AIX\n");
|
|
#endif
|
|
#ifdef HPUX
|
|
output(screen," HPUX\n");
|
|
#endif
|
|
#ifdef QNX
|
|
output(screen," QNX\n");
|
|
#endif
|
|
#ifdef OSF1
|
|
output(screen," OSF1\n");
|
|
#endif
|
|
#ifdef SCO
|
|
output(screen," SCO\n");
|
|
#endif
|
|
#ifdef UNIXWARE
|
|
output(screen," UNIXWARE\n");
|
|
#endif
|
|
#ifdef NEXT2
|
|
output(screen," NEXT2\n");
|
|
#endif
|
|
#ifdef RELIANTUNIX
|
|
output(screen," RELIANTUNIX\n");
|
|
#endif
|
|
|
|
/* Output the sizes of the various types */
|
|
output(screen,"\nType sizes:\n");
|
|
output(screen," sizeof(char): %d\n",sizeof(char));
|
|
output(screen," sizeof(int): %d\n",sizeof(int));
|
|
output(screen," sizeof(long): %d\n",sizeof(long));
|
|
output(screen," sizeof(uint8): %d\n",sizeof(uint8));
|
|
output(screen," sizeof(uint16): %d\n",sizeof(uint16));
|
|
output(screen," sizeof(uint32): %d\n",sizeof(uint32));
|
|
output(screen," sizeof(short): %d\n",sizeof(short));
|
|
output(screen," sizeof(void*): %d\n",sizeof(void*));
|
|
}
|
|
|
|
|
|
|