/* 
   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_PROFILE
       output(screen,"   WITH_PROFILE\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*));
}