mirror of
https://github.com/samba-team/samba.git
synced 2025-03-08 04:58:40 +03:00
update lib/replace to current upstream version (samba master)
(This used to be ctdb commit 17bcffab19fdbb435b4745ff90c327342bbbf0f8)
This commit is contained in:
parent
5d94dff27e
commit
2c0abf2dcf
63
ctdb/lib/replace/Makefile
Normal file
63
ctdb/lib/replace/Makefile
Normal file
@ -0,0 +1,63 @@
|
||||
# simple makefile wrapper to run waf
|
||||
|
||||
WAF=WAF_MAKE=1 PATH=buildtools/bin:../../buildtools/bin:$$PATH waf
|
||||
|
||||
all:
|
||||
$(WAF) build
|
||||
|
||||
install:
|
||||
$(WAF) install
|
||||
|
||||
uninstall:
|
||||
$(WAF) uninstall
|
||||
|
||||
test:
|
||||
$(WAF) test $(TEST_OPTIONS)
|
||||
|
||||
testenv:
|
||||
$(WAF) test --testenv $(TEST_OPTIONS)
|
||||
|
||||
quicktest:
|
||||
$(WAF) test --quick $(TEST_OPTIONS)
|
||||
|
||||
dist:
|
||||
touch .tmplock
|
||||
WAFLOCK=.tmplock $(WAF) dist
|
||||
|
||||
distcheck:
|
||||
touch .tmplock
|
||||
WAFLOCK=.tmplock $(WAF) distcheck
|
||||
|
||||
clean:
|
||||
$(WAF) clean
|
||||
|
||||
distclean:
|
||||
$(WAF) distclean
|
||||
|
||||
reconfigure: configure
|
||||
$(WAF) reconfigure
|
||||
|
||||
show_waf_options:
|
||||
$(WAF) --help
|
||||
|
||||
# some compatibility make targets
|
||||
everything: all
|
||||
|
||||
testsuite: all
|
||||
|
||||
check: test
|
||||
|
||||
torture: all
|
||||
|
||||
# this should do an install as well, once install is finished
|
||||
installcheck: test
|
||||
|
||||
etags:
|
||||
$(WAF) etags
|
||||
|
||||
ctags:
|
||||
$(WAF) ctags
|
||||
|
||||
bin/%:: FORCE
|
||||
$(WAF) --targets=`basename $@`
|
||||
FORCE:
|
@ -9,7 +9,9 @@ libdir = @libdir@
|
||||
VPATH = @libreplacedir@
|
||||
srcdir = @srcdir@
|
||||
builddir = @builddir@
|
||||
INSTALL = @INSTALL@
|
||||
sharedbuilddir = @sharedbuilddir@
|
||||
INSTALLCMD = @INSTALL@
|
||||
LIBS = @LIBS@
|
||||
|
||||
.PHONY: test all showflags install installcheck clean distclean realdistclean
|
||||
|
||||
@ -25,10 +27,17 @@ showflags:
|
||||
@echo ' CC = $(CC)'
|
||||
@echo ' CFLAGS = $(CFLAGS)'
|
||||
@echo ' LDFLAGS= $(LDFLAGS)'
|
||||
@echo ' LIBS = $(LIBS)'
|
||||
|
||||
install: all
|
||||
mkdir -p $(libdir)
|
||||
$(INSTALL) libreplace.a $(libdir)
|
||||
${INSTALLCMD} -d $(libdir)
|
||||
${INSTALLCMD} -m 644 libreplace.a $(libdir)
|
||||
|
||||
shared-build: all
|
||||
${INSTALLCMD} -d $(sharedbuilddir)/include
|
||||
${INSTALLCMD} -m 644 replace.h $(sharedbuilddir)/include
|
||||
${INSTALLCMD} -d $(sharedbuilddir)/lib
|
||||
${INSTALLCMD} -m 644 libreplace.a $(sharedbuilddir)/lib
|
||||
|
||||
libreplace.a: $(OBJS)
|
||||
ar -rcsv $@ $(OBJS)
|
||||
@ -38,10 +47,10 @@ test: all
|
||||
|
||||
installcheck: install test
|
||||
|
||||
TEST_OBJS = test/testsuite.o test/os2_delete.o test/strptime.o
|
||||
TEST_OBJS = test/main.o test/testsuite.o test/os2_delete.o test/strptime.o test/getifaddrs.o
|
||||
|
||||
testsuite: libreplace.a $(TEST_OBJS)
|
||||
$(CC) -o testsuite $(TEST_OBJS) -L. -lreplace $(LDFLAGS)
|
||||
$(CC) -o testsuite $(TEST_OBJS) -L. -lreplace $(LDFLAGS) $(LIBS)
|
||||
|
||||
.c.o:
|
||||
@echo Compiling $*.c
|
||||
|
@ -15,7 +15,6 @@ rename
|
||||
initgroups
|
||||
memmove
|
||||
strdup
|
||||
inet_ntoa
|
||||
setlinebuf
|
||||
vsyslog
|
||||
timegm
|
||||
@ -34,6 +33,7 @@ opendir
|
||||
readdir
|
||||
telldir
|
||||
seekdir
|
||||
clock_gettime
|
||||
closedir
|
||||
dlopen
|
||||
dlclose
|
||||
@ -47,11 +47,14 @@ mkdtemp
|
||||
mkstemp (a secure one!)
|
||||
pread
|
||||
pwrite
|
||||
chown
|
||||
lchown
|
||||
getpass
|
||||
readline (the library)
|
||||
inet_ntoa
|
||||
inet_ntop
|
||||
inet_pton
|
||||
inet_aton
|
||||
strtoll
|
||||
strtoull
|
||||
socketpair
|
||||
@ -62,14 +65,21 @@ getnameinfo
|
||||
gai_strerror
|
||||
getifaddrs
|
||||
freeifaddrs
|
||||
utime
|
||||
utimes
|
||||
dup2
|
||||
link
|
||||
readlink
|
||||
symlink
|
||||
realpath
|
||||
|
||||
Types:
|
||||
bool
|
||||
socklen_t
|
||||
uint_t
|
||||
uint{8,16,32,64}_t
|
||||
int{8,16,32,64}_t
|
||||
intptr_t
|
||||
sig_atomic_t
|
||||
|
||||
Constants:
|
||||
PATH_NAME_MAX
|
||||
@ -105,6 +115,9 @@ Headers:
|
||||
stdint.h
|
||||
stdbool.h
|
||||
|
||||
Optional C keywords:
|
||||
volatile
|
||||
|
||||
Prerequisites:
|
||||
memset (for bzero)
|
||||
syslog (for vsyslog)
|
||||
|
@ -181,32 +181,56 @@ AC_DEFUN([AC_PROG_CC_C99],
|
||||
# typically due to standards-conformance issues.
|
||||
m4_ifndef([AC_USE_SYSTEM_EXTENSIONS],[
|
||||
AC_DEFUN([AC_USE_SYSTEM_EXTENSIONS],
|
||||
[
|
||||
AC_BEFORE([$0], [AC_COMPILE_IFELSE])
|
||||
AC_BEFORE([$0], [AC_RUN_IFELSE])
|
||||
[AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl
|
||||
AC_BEFORE([$0], [AC_RUN_IFELSE])dnl
|
||||
|
||||
AC_REQUIRE([AC_GNU_SOURCE])
|
||||
AC_REQUIRE([AC_AIX])
|
||||
AC_REQUIRE([AC_MINIX])
|
||||
AC_CHECK_HEADER([minix/config.h], [MINIX=yes], [MINIX=])
|
||||
if test "$MINIX" = yes; then
|
||||
AC_DEFINE([_POSIX_SOURCE], [1],
|
||||
[Define to 1 if you need to in order for `stat' and other
|
||||
things to work.])
|
||||
AC_DEFINE([_POSIX_1_SOURCE], [2],
|
||||
[Define to 2 if the system does not provide POSIX.1 features
|
||||
except with this defined.])
|
||||
AC_DEFINE([_MINIX], [1],
|
||||
[Define to 1 if on MINIX.])
|
||||
fi
|
||||
|
||||
AH_VERBATIM([__EXTENSIONS__],
|
||||
[/* Enable extensions on Solaris. */
|
||||
[/* Enable extensions on AIX 3, Interix. */
|
||||
#ifndef _ALL_SOURCE
|
||||
# undef _ALL_SOURCE
|
||||
#endif
|
||||
/* Enable GNU extensions on systems that have them. */
|
||||
#ifndef _GNU_SOURCE
|
||||
# undef _GNU_SOURCE
|
||||
#endif
|
||||
/* Enable threading extensions on Solaris. */
|
||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
||||
# undef _POSIX_PTHREAD_SEMANTICS
|
||||
#endif
|
||||
/* Enable extensions on HP NonStop. */
|
||||
#ifndef _TANDEM_SOURCE
|
||||
# undef _TANDEM_SOURCE
|
||||
#endif
|
||||
/* Enable general extensions on Solaris. */
|
||||
#ifndef __EXTENSIONS__
|
||||
# undef __EXTENSIONS__
|
||||
#endif
|
||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
||||
# undef _POSIX_PTHREAD_SEMANTICS
|
||||
#endif])
|
||||
])
|
||||
AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__],
|
||||
[ac_cv_safe_to_define___extensions__],
|
||||
[AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM([
|
||||
[AC_LANG_PROGRAM([[
|
||||
# define __EXTENSIONS__ 1
|
||||
AC_INCLUDES_DEFAULT])],
|
||||
]AC_INCLUDES_DEFAULT])],
|
||||
[ac_cv_safe_to_define___extensions__=yes],
|
||||
[ac_cv_safe_to_define___extensions__=no])])
|
||||
test $ac_cv_safe_to_define___extensions__ = yes &&
|
||||
AC_DEFINE([__EXTENSIONS__])
|
||||
AC_DEFINE([_ALL_SOURCE])
|
||||
AC_DEFINE([_GNU_SOURCE])
|
||||
AC_DEFINE([_POSIX_PTHREAD_SEMANTICS])
|
||||
])
|
||||
AC_DEFINE([_TANDEM_SOURCE])
|
||||
])# AC_USE_SYSTEM_EXTENSIONS
|
||||
])
|
||||
|
13
ctdb/lib/replace/autogen-autotools.sh
Executable file
13
ctdb/lib/replace/autogen-autotools.sh
Executable file
@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
|
||||
rm -rf autom4te.cache
|
||||
rm -f configure config.h.in
|
||||
|
||||
autoheader || exit 1
|
||||
autoconf || exit 1
|
||||
|
||||
rm -rf autom4te.cache
|
||||
|
||||
echo "Now run ./configure and then make."
|
||||
exit 0
|
||||
|
14
ctdb/lib/replace/build_macros.m4
Normal file
14
ctdb/lib/replace/build_macros.m4
Normal file
@ -0,0 +1,14 @@
|
||||
AC_DEFUN(BUILD_WITH_SHARED_BUILD_DIR,
|
||||
[ AC_ARG_WITH([shared-build-dir],
|
||||
[AC_HELP_STRING([--with-shared-build-dir=DIR],
|
||||
[temporary build directory where libraries are installed [$srcdir/sharedbuild]])])
|
||||
|
||||
sharedbuilddir="$srcdir/sharedbuild"
|
||||
if test x"$with_shared_build_dir" != x; then
|
||||
sharedbuilddir=$with_shared_build_dir
|
||||
CFLAGS="$CFLAGS -I$with_shared_build_dir/include"
|
||||
LDFLAGS="$LDFLAGS -L$with_shared_build_dir/lib"
|
||||
fi
|
||||
AC_SUBST(sharedbuilddir)
|
||||
])
|
||||
|
58
ctdb/lib/replace/config.guess
vendored
58
ctdb/lib/replace/config.guess
vendored
@ -1,10 +1,10 @@
|
||||
#! /bin/sh
|
||||
# Attempt to guess a canonical system name.
|
||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
||||
# Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2009-06-10'
|
||||
timestamp='2009-04-27'
|
||||
|
||||
# This file is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by
|
||||
@ -170,7 +170,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
arm*|i386|m68k|ns32k|sh3*|sparc|vax)
|
||||
eval $set_cc_for_build
|
||||
if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
|
||||
| grep -q __ELF__
|
||||
| grep __ELF__ >/dev/null
|
||||
then
|
||||
# Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
|
||||
# Return netbsd for either. FIX?
|
||||
@ -656,7 +656,7 @@ EOF
|
||||
# => hppa64-hp-hpux11.23
|
||||
|
||||
if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
|
||||
grep -q __LP64__
|
||||
grep __LP64__ >/dev/null
|
||||
then
|
||||
HP_ARCH="hppa2.0w"
|
||||
else
|
||||
@ -822,9 +822,6 @@ EOF
|
||||
[345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
|
||||
echo i${UNAME_MACHINE}-pc-mks
|
||||
exit ;;
|
||||
8664:Windows_NT:*)
|
||||
echo x86_64-pc-mks
|
||||
exit ;;
|
||||
i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
|
||||
# How do we know it's Interix rather than the generic POSIX subsystem?
|
||||
# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
|
||||
@ -885,17 +882,40 @@ EOF
|
||||
m68*:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
mips:Linux:*:* | mips64:Linux:*:*)
|
||||
mips:Linux:*:*)
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
#undef CPU
|
||||
#undef ${UNAME_MACHINE}
|
||||
#undef ${UNAME_MACHINE}el
|
||||
#undef mips
|
||||
#undef mipsel
|
||||
#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
|
||||
CPU=${UNAME_MACHINE}el
|
||||
CPU=mipsel
|
||||
#else
|
||||
#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
|
||||
CPU=${UNAME_MACHINE}
|
||||
CPU=mips
|
||||
#else
|
||||
CPU=
|
||||
#endif
|
||||
#endif
|
||||
EOF
|
||||
eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
|
||||
/^CPU/{
|
||||
s: ::g
|
||||
p
|
||||
}'`"
|
||||
test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
|
||||
;;
|
||||
mips64:Linux:*:*)
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
#undef CPU
|
||||
#undef mips64
|
||||
#undef mips64el
|
||||
#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
|
||||
CPU=mips64el
|
||||
#else
|
||||
#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
|
||||
CPU=mips64
|
||||
#else
|
||||
CPU=
|
||||
#endif
|
||||
@ -927,7 +947,7 @@ EOF
|
||||
EV67) UNAME_MACHINE=alphaev67 ;;
|
||||
EV68*) UNAME_MACHINE=alphaev68 ;;
|
||||
esac
|
||||
objdump --private-headers /bin/sh | grep -q ld.so.1
|
||||
objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
|
||||
if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
|
||||
exit ;;
|
||||
@ -981,6 +1001,14 @@ EOF
|
||||
elf32-i386)
|
||||
TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
|
||||
;;
|
||||
a.out-i386-linux)
|
||||
echo "${UNAME_MACHINE}-pc-linux-gnuaout"
|
||||
exit ;;
|
||||
"")
|
||||
# Either a pre-BFD a.out linker (linux-gnuoldld) or
|
||||
# one that does not give us useful --help.
|
||||
echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
|
||||
exit ;;
|
||||
esac
|
||||
# Determine whether the default compiler is a.out or elf
|
||||
eval $set_cc_for_build
|
||||
@ -1046,7 +1074,7 @@ EOF
|
||||
i*86:syllable:*:*)
|
||||
echo ${UNAME_MACHINE}-pc-syllable
|
||||
exit ;;
|
||||
i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
|
||||
i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
|
||||
echo i386-unknown-lynxos${UNAME_RELEASE}
|
||||
exit ;;
|
||||
i*86:*DOS:*:*)
|
||||
@ -1154,7 +1182,7 @@ EOF
|
||||
rs6000:LynxOS:2.*:*)
|
||||
echo rs6000-unknown-lynxos${UNAME_RELEASE}
|
||||
exit ;;
|
||||
PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
|
||||
PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
|
||||
echo powerpc-unknown-lynxos${UNAME_RELEASE}
|
||||
exit ;;
|
||||
SM[BE]S:UNIX_SV:*:*)
|
||||
|
15
ctdb/lib/replace/config.sub
vendored
15
ctdb/lib/replace/config.sub
vendored
@ -1,10 +1,10 @@
|
||||
#! /bin/sh
|
||||
# Configuration validation subroutine script.
|
||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
||||
# Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2009-06-11'
|
||||
timestamp='2009-04-17'
|
||||
|
||||
# This file is (in principle) common to ALL GNU software.
|
||||
# The presence of a machine in this file suggests that SOME GNU software
|
||||
@ -153,9 +153,6 @@ case $os in
|
||||
os=
|
||||
basic_machine=$1
|
||||
;;
|
||||
-bluegene*)
|
||||
os=-cnk
|
||||
;;
|
||||
-sim | -cisco | -oki | -wec | -winbond)
|
||||
os=
|
||||
basic_machine=$1
|
||||
@ -470,10 +467,6 @@ case $basic_machine in
|
||||
basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
os=-linux
|
||||
;;
|
||||
bluegene*)
|
||||
basic_machine=powerpc-ibm
|
||||
os=-cnk
|
||||
;;
|
||||
c90)
|
||||
basic_machine=c90-cray
|
||||
os=-unicos
|
||||
@ -1267,7 +1260,7 @@ case $os in
|
||||
# Each alternative MUST END IN A *, to match a version number.
|
||||
# -sysv* is not here because it comes later, after sysvr4.
|
||||
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
|
||||
| -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
|
||||
| -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
|
||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
|
||||
| -kopensolaris* \
|
||||
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
|
||||
@ -1620,7 +1613,7 @@ case $basic_machine in
|
||||
-sunos*)
|
||||
vendor=sun
|
||||
;;
|
||||
-cnk*|-aix*)
|
||||
-aix*)
|
||||
vendor=ibm
|
||||
;;
|
||||
-beos*)
|
||||
|
21
ctdb/lib/replace/configure
vendored
Executable file
21
ctdb/lib/replace/configure
vendored
Executable file
@ -0,0 +1,21 @@
|
||||
#!/bin/sh
|
||||
|
||||
PREVPATH=`dirname $0`
|
||||
|
||||
if [ -f $PREVPATH/../../buildtools/bin/waf ]; then
|
||||
WAF=../../buildtools/bin/waf
|
||||
elif [ -f $PREVPATH/buildtools/bin/waf ]; then
|
||||
WAF=./buildtools/bin/waf
|
||||
else
|
||||
echo "replace: Unable to find waf"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# using JOBS=1 gives maximum compatibility with
|
||||
# systems like AIX which have broken threading in python
|
||||
JOBS=1
|
||||
export JOBS
|
||||
|
||||
cd . || exit 1
|
||||
$WAF configure "$@" || exit 1
|
||||
cd $PREVPATH
|
@ -3,7 +3,10 @@ AC_INIT(replace.c)
|
||||
AC_CONFIG_SRCDIR([replace.c])
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
|
||||
CFLAGS="$CFLAGS -I$srcdir"
|
||||
|
||||
AC_LIBREPLACE_ALL_CHECKS
|
||||
AC_LIBREPLACE_NETWORK_CHECKS
|
||||
|
||||
if test "$ac_cv_prog_gcc" = yes; then
|
||||
CFLAGS="$CFLAGS -Wall"
|
||||
@ -19,6 +22,12 @@ if test "$ac_cv_prog_gcc" = yes; then
|
||||
CFLAGS="$CFLAGS -Wno-format-y2k"
|
||||
fi
|
||||
|
||||
m4_include(build_macros.m4)
|
||||
BUILD_WITH_SHARED_BUILD_DIR
|
||||
|
||||
LIBS="${LIBREPLACE_NETWORK_LIBS}"
|
||||
AC_SUBST(LIBS)
|
||||
|
||||
AC_SUBST(LDFLAGS)
|
||||
|
||||
AC_OUTPUT(Makefile)
|
||||
|
770
ctdb/lib/replace/crypt.c
Normal file
770
ctdb/lib/replace/crypt.c
Normal file
@ -0,0 +1,770 @@
|
||||
/*
|
||||
This bit of code was derived from the UFC-crypt package which
|
||||
carries the following copyright
|
||||
|
||||
Modified for use by Samba by Andrew Tridgell, October 1994
|
||||
|
||||
Note that this routine is only faster on some machines. Under Linux 1.1.51
|
||||
libc 4.5.26 I actually found this routine to be slightly slower.
|
||||
|
||||
Under SunOS I found a huge speedup by using these routines
|
||||
(a factor of 20 or so)
|
||||
|
||||
Warning: I've had a report from Steve Kennedy <steve@gbnet.org>
|
||||
that this crypt routine may sometimes get the wrong answer. Only
|
||||
use UFC_CRYT if you really need it.
|
||||
|
||||
*/
|
||||
|
||||
#include "replace.h"
|
||||
|
||||
#ifndef HAVE_CRYPT
|
||||
|
||||
/*
|
||||
* UFC-crypt: ultra fast crypt(3) implementation
|
||||
*
|
||||
* Copyright (C) 1991-1998, Free Software Foundation, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* @(#)crypt_util.c 2.31 02/08/92
|
||||
*
|
||||
* Support routines
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef long32
|
||||
#define long32 int32_t
|
||||
#endif
|
||||
|
||||
#ifndef long64
|
||||
#define long64 int64_t
|
||||
#endif
|
||||
|
||||
#ifndef ufc_long
|
||||
#define ufc_long unsigned
|
||||
#endif
|
||||
|
||||
#ifndef _UFC_64_
|
||||
#define _UFC_32_
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Permutation done once on the 56 bit
|
||||
* key derived from the original 8 byte ASCII key.
|
||||
*/
|
||||
static int pc1[56] = {
|
||||
57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,
|
||||
10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,
|
||||
63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,
|
||||
14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4
|
||||
};
|
||||
|
||||
/*
|
||||
* How much to rotate each 28 bit half of the pc1 permutated
|
||||
* 56 bit key before using pc2 to give the i' key
|
||||
*/
|
||||
static int rots[16] = {
|
||||
1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
|
||||
};
|
||||
|
||||
/*
|
||||
* Permutation giving the key
|
||||
* of the i' DES round
|
||||
*/
|
||||
static int pc2[48] = {
|
||||
14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,
|
||||
23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,
|
||||
41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
|
||||
44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
|
||||
};
|
||||
|
||||
/*
|
||||
* The E expansion table which selects
|
||||
* bits from the 32 bit intermediate result.
|
||||
*/
|
||||
static int esel[48] = {
|
||||
32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,
|
||||
8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,
|
||||
16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,
|
||||
24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1
|
||||
};
|
||||
static int e_inverse[64];
|
||||
|
||||
/*
|
||||
* Permutation done on the
|
||||
* result of sbox lookups
|
||||
*/
|
||||
static int perm32[32] = {
|
||||
16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
|
||||
2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
|
||||
};
|
||||
|
||||
/*
|
||||
* The sboxes
|
||||
*/
|
||||
static int sbox[8][4][16]= {
|
||||
{ { 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 },
|
||||
{ 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8 },
|
||||
{ 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0 },
|
||||
{ 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 }
|
||||
},
|
||||
|
||||
{ { 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 },
|
||||
{ 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5 },
|
||||
{ 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15 },
|
||||
{ 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 }
|
||||
},
|
||||
|
||||
{ { 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 },
|
||||
{ 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1 },
|
||||
{ 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7 },
|
||||
{ 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 }
|
||||
},
|
||||
|
||||
{ { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 },
|
||||
{ 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9 },
|
||||
{ 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4 },
|
||||
{ 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 }
|
||||
},
|
||||
|
||||
{ { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 },
|
||||
{ 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6 },
|
||||
{ 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14 },
|
||||
{ 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 }
|
||||
},
|
||||
|
||||
{ { 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 },
|
||||
{ 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8 },
|
||||
{ 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6 },
|
||||
{ 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 }
|
||||
},
|
||||
|
||||
{ { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 },
|
||||
{ 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6 },
|
||||
{ 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2 },
|
||||
{ 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 }
|
||||
},
|
||||
|
||||
{ { 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 },
|
||||
{ 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2 },
|
||||
{ 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8 },
|
||||
{ 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 }
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
* This is the final
|
||||
* permutation matrix
|
||||
*/
|
||||
static int final_perm[64] = {
|
||||
40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,
|
||||
38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,
|
||||
36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,
|
||||
34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25
|
||||
};
|
||||
|
||||
/*
|
||||
* The 16 DES keys in BITMASK format
|
||||
*/
|
||||
#ifdef _UFC_32_
|
||||
long32 _ufc_keytab[16][2];
|
||||
#endif
|
||||
|
||||
#ifdef _UFC_64_
|
||||
long64 _ufc_keytab[16];
|
||||
#endif
|
||||
|
||||
|
||||
#define ascii_to_bin(c) ((c)>='a'?(c-59):(c)>='A'?((c)-53):(c)-'.')
|
||||
#define bin_to_ascii(c) ((c)>=38?((c)-38+'a'):(c)>=12?((c)-12+'A'):(c)+'.')
|
||||
|
||||
/* Macro to set a bit (0..23) */
|
||||
#define BITMASK(i) ( (1<<(11-(i)%12+3)) << ((i)<12?16:0) )
|
||||
|
||||
/*
|
||||
* sb arrays:
|
||||
*
|
||||
* Workhorses of the inner loop of the DES implementation.
|
||||
* They do sbox lookup, shifting of this value, 32 bit
|
||||
* permutation and E permutation for the next round.
|
||||
*
|
||||
* Kept in 'BITMASK' format.
|
||||
*/
|
||||
|
||||
#ifdef _UFC_32_
|
||||
long32 _ufc_sb0[8192], _ufc_sb1[8192], _ufc_sb2[8192], _ufc_sb3[8192];
|
||||
static long32 *sb[4] = {_ufc_sb0, _ufc_sb1, _ufc_sb2, _ufc_sb3};
|
||||
#endif
|
||||
|
||||
#ifdef _UFC_64_
|
||||
long64 _ufc_sb0[4096], _ufc_sb1[4096], _ufc_sb2[4096], _ufc_sb3[4096];
|
||||
static long64 *sb[4] = {_ufc_sb0, _ufc_sb1, _ufc_sb2, _ufc_sb3};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* eperm32tab: do 32 bit permutation and E selection
|
||||
*
|
||||
* The first index is the byte number in the 32 bit value to be permuted
|
||||
* - second - is the value of this byte
|
||||
* - third - selects the two 32 bit values
|
||||
*
|
||||
* The table is used and generated internally in init_des to speed it up
|
||||
*/
|
||||
static ufc_long eperm32tab[4][256][2];
|
||||
|
||||
/*
|
||||
* do_pc1: permform pc1 permutation in the key schedule generation.
|
||||
*
|
||||
* The first index is the byte number in the 8 byte ASCII key
|
||||
* - second - - the two 28 bits halfs of the result
|
||||
* - third - selects the 7 bits actually used of each byte
|
||||
*
|
||||
* The result is kept with 28 bit per 32 bit with the 4 most significant
|
||||
* bits zero.
|
||||
*/
|
||||
static ufc_long do_pc1[8][2][128];
|
||||
|
||||
/*
|
||||
* do_pc2: permform pc2 permutation in the key schedule generation.
|
||||
*
|
||||
* The first index is the septet number in the two 28 bit intermediate values
|
||||
* - second - - - septet values
|
||||
*
|
||||
* Knowledge of the structure of the pc2 permutation is used.
|
||||
*
|
||||
* The result is kept with 28 bit per 32 bit with the 4 most significant
|
||||
* bits zero.
|
||||
*/
|
||||
static ufc_long do_pc2[8][128];
|
||||
|
||||
/*
|
||||
* efp: undo an extra e selection and do final
|
||||
* permutation giving the DES result.
|
||||
*
|
||||
* Invoked 6 bit a time on two 48 bit values
|
||||
* giving two 32 bit longs.
|
||||
*/
|
||||
static ufc_long efp[16][64][2];
|
||||
|
||||
static unsigned char bytemask[8] = {
|
||||
0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
|
||||
};
|
||||
|
||||
static ufc_long longmask[32] = {
|
||||
0x80000000, 0x40000000, 0x20000000, 0x10000000,
|
||||
0x08000000, 0x04000000, 0x02000000, 0x01000000,
|
||||
0x00800000, 0x00400000, 0x00200000, 0x00100000,
|
||||
0x00080000, 0x00040000, 0x00020000, 0x00010000,
|
||||
0x00008000, 0x00004000, 0x00002000, 0x00001000,
|
||||
0x00000800, 0x00000400, 0x00000200, 0x00000100,
|
||||
0x00000080, 0x00000040, 0x00000020, 0x00000010,
|
||||
0x00000008, 0x00000004, 0x00000002, 0x00000001
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Silly rewrite of 'bzero'. I do so
|
||||
* because some machines don't have
|
||||
* bzero and some don't have memset.
|
||||
*/
|
||||
|
||||
static void clearmem(char *start, int cnt)
|
||||
{ while(cnt--)
|
||||
*start++ = '\0';
|
||||
}
|
||||
|
||||
static int initialized = 0;
|
||||
|
||||
/* lookup a 6 bit value in sbox */
|
||||
|
||||
#define s_lookup(i,s) sbox[(i)][(((s)>>4) & 0x2)|((s) & 0x1)][((s)>>1) & 0xf];
|
||||
|
||||
/*
|
||||
* Initialize unit - may be invoked directly
|
||||
* by fcrypt users.
|
||||
*/
|
||||
|
||||
static void ufc_init_des(void)
|
||||
{ int comes_from_bit;
|
||||
int bit, sg;
|
||||
ufc_long j;
|
||||
ufc_long mask1, mask2;
|
||||
|
||||
/*
|
||||
* Create the do_pc1 table used
|
||||
* to affect pc1 permutation
|
||||
* when generating keys
|
||||
*/
|
||||
for(bit = 0; bit < 56; bit++) {
|
||||
comes_from_bit = pc1[bit] - 1;
|
||||
mask1 = bytemask[comes_from_bit % 8 + 1];
|
||||
mask2 = longmask[bit % 28 + 4];
|
||||
for(j = 0; j < 128; j++) {
|
||||
if(j & mask1)
|
||||
do_pc1[comes_from_bit / 8][bit / 28][j] |= mask2;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Create the do_pc2 table used
|
||||
* to affect pc2 permutation when
|
||||
* generating keys
|
||||
*/
|
||||
for(bit = 0; bit < 48; bit++) {
|
||||
comes_from_bit = pc2[bit] - 1;
|
||||
mask1 = bytemask[comes_from_bit % 7 + 1];
|
||||
mask2 = BITMASK(bit % 24);
|
||||
for(j = 0; j < 128; j++) {
|
||||
if(j & mask1)
|
||||
do_pc2[comes_from_bit / 7][j] |= mask2;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Now generate the table used to do combined
|
||||
* 32 bit permutation and e expansion
|
||||
*
|
||||
* We use it because we have to permute 16384 32 bit
|
||||
* longs into 48 bit in order to initialize sb.
|
||||
*
|
||||
* Looping 48 rounds per permutation becomes
|
||||
* just too slow...
|
||||
*
|
||||
*/
|
||||
|
||||
clearmem((char*)eperm32tab, sizeof(eperm32tab));
|
||||
|
||||
for(bit = 0; bit < 48; bit++) {
|
||||
ufc_long inner_mask1,comes_from;
|
||||
|
||||
comes_from = perm32[esel[bit]-1]-1;
|
||||
inner_mask1 = bytemask[comes_from % 8];
|
||||
|
||||
for(j = 256; j--;) {
|
||||
if(j & inner_mask1)
|
||||
eperm32tab[comes_from / 8][j][bit / 24] |= BITMASK(bit % 24);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Create the sb tables:
|
||||
*
|
||||
* For each 12 bit segment of an 48 bit intermediate
|
||||
* result, the sb table precomputes the two 4 bit
|
||||
* values of the sbox lookups done with the two 6
|
||||
* bit halves, shifts them to their proper place,
|
||||
* sends them through perm32 and finally E expands
|
||||
* them so that they are ready for the next
|
||||
* DES round.
|
||||
*
|
||||
*/
|
||||
for(sg = 0; sg < 4; sg++) {
|
||||
int j1, j2;
|
||||
int s1, s2;
|
||||
|
||||
for(j1 = 0; j1 < 64; j1++) {
|
||||
s1 = s_lookup(2 * sg, j1);
|
||||
for(j2 = 0; j2 < 64; j2++) {
|
||||
ufc_long to_permute, inx;
|
||||
|
||||
s2 = s_lookup(2 * sg + 1, j2);
|
||||
to_permute = ((s1 << 4) | s2) << (24 - 8 * sg);
|
||||
|
||||
#ifdef _UFC_32_
|
||||
inx = ((j1 << 6) | j2) << 1;
|
||||
sb[sg][inx ] = eperm32tab[0][(to_permute >> 24) & 0xff][0];
|
||||
sb[sg][inx+1] = eperm32tab[0][(to_permute >> 24) & 0xff][1];
|
||||
sb[sg][inx ] |= eperm32tab[1][(to_permute >> 16) & 0xff][0];
|
||||
sb[sg][inx+1] |= eperm32tab[1][(to_permute >> 16) & 0xff][1];
|
||||
sb[sg][inx ] |= eperm32tab[2][(to_permute >> 8) & 0xff][0];
|
||||
sb[sg][inx+1] |= eperm32tab[2][(to_permute >> 8) & 0xff][1];
|
||||
sb[sg][inx ] |= eperm32tab[3][(to_permute) & 0xff][0];
|
||||
sb[sg][inx+1] |= eperm32tab[3][(to_permute) & 0xff][1];
|
||||
#endif
|
||||
#ifdef _UFC_64_
|
||||
inx = ((j1 << 6) | j2);
|
||||
sb[sg][inx] =
|
||||
((long64)eperm32tab[0][(to_permute >> 24) & 0xff][0] << 32) |
|
||||
(long64)eperm32tab[0][(to_permute >> 24) & 0xff][1];
|
||||
sb[sg][inx] |=
|
||||
((long64)eperm32tab[1][(to_permute >> 16) & 0xff][0] << 32) |
|
||||
(long64)eperm32tab[1][(to_permute >> 16) & 0xff][1];
|
||||
sb[sg][inx] |=
|
||||
((long64)eperm32tab[2][(to_permute >> 8) & 0xff][0] << 32) |
|
||||
(long64)eperm32tab[2][(to_permute >> 8) & 0xff][1];
|
||||
sb[sg][inx] |=
|
||||
((long64)eperm32tab[3][(to_permute) & 0xff][0] << 32) |
|
||||
(long64)eperm32tab[3][(to_permute) & 0xff][1];
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Create an inverse matrix for esel telling
|
||||
* where to plug out bits if undoing it
|
||||
*/
|
||||
for(bit=48; bit--;) {
|
||||
e_inverse[esel[bit] - 1 ] = bit;
|
||||
e_inverse[esel[bit] - 1 + 32] = bit + 48;
|
||||
}
|
||||
|
||||
/*
|
||||
* create efp: the matrix used to
|
||||
* undo the E expansion and effect final permutation
|
||||
*/
|
||||
clearmem((char*)efp, sizeof efp);
|
||||
for(bit = 0; bit < 64; bit++) {
|
||||
int o_bit, o_long;
|
||||
ufc_long word_value, inner_mask1, inner_mask2;
|
||||
int comes_from_f_bit, comes_from_e_bit;
|
||||
int comes_from_word, bit_within_word;
|
||||
|
||||
/* See where bit i belongs in the two 32 bit long's */
|
||||
o_long = bit / 32; /* 0..1 */
|
||||
o_bit = bit % 32; /* 0..31 */
|
||||
|
||||
/*
|
||||
* And find a bit in the e permutated value setting this bit.
|
||||
*
|
||||
* Note: the e selection may have selected the same bit several
|
||||
* times. By the initialization of e_inverse, we only look
|
||||
* for one specific instance.
|
||||
*/
|
||||
comes_from_f_bit = final_perm[bit] - 1; /* 0..63 */
|
||||
comes_from_e_bit = e_inverse[comes_from_f_bit]; /* 0..95 */
|
||||
comes_from_word = comes_from_e_bit / 6; /* 0..15 */
|
||||
bit_within_word = comes_from_e_bit % 6; /* 0..5 */
|
||||
|
||||
inner_mask1 = longmask[bit_within_word + 26];
|
||||
inner_mask2 = longmask[o_bit];
|
||||
|
||||
for(word_value = 64; word_value--;) {
|
||||
if(word_value & inner_mask1)
|
||||
efp[comes_from_word][word_value][o_long] |= inner_mask2;
|
||||
}
|
||||
}
|
||||
initialized++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Process the elements of the sb table permuting the
|
||||
* bits swapped in the expansion by the current salt.
|
||||
*/
|
||||
|
||||
#ifdef _UFC_32_
|
||||
static void shuffle_sb(long32 *k, ufc_long saltbits)
|
||||
{ ufc_long j;
|
||||
long32 x;
|
||||
for(j=4096; j--;) {
|
||||
x = (k[0] ^ k[1]) & (long32)saltbits;
|
||||
*k++ ^= x;
|
||||
*k++ ^= x;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef _UFC_64_
|
||||
static void shuffle_sb(long64 *k, ufc_long saltbits)
|
||||
{ ufc_long j;
|
||||
long64 x;
|
||||
for(j=4096; j--;) {
|
||||
x = ((*k >> 32) ^ *k) & (long64)saltbits;
|
||||
*k++ ^= (x << 32) | x;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Setup the unit for a new salt
|
||||
* Hopefully we'll not see a new salt in each crypt call.
|
||||
*/
|
||||
|
||||
static unsigned char current_salt[3] = "&&"; /* invalid value */
|
||||
static ufc_long current_saltbits = 0;
|
||||
static int direction = 0;
|
||||
|
||||
static void setup_salt(const char *s1)
|
||||
{ ufc_long i, j, saltbits;
|
||||
const unsigned char *s2 = (const unsigned char *)s1;
|
||||
|
||||
if(!initialized)
|
||||
ufc_init_des();
|
||||
|
||||
if(s2[0] == current_salt[0] && s2[1] == current_salt[1])
|
||||
return;
|
||||
current_salt[0] = s2[0]; current_salt[1] = s2[1];
|
||||
|
||||
/*
|
||||
* This is the only crypt change to DES:
|
||||
* entries are swapped in the expansion table
|
||||
* according to the bits set in the salt.
|
||||
*/
|
||||
saltbits = 0;
|
||||
for(i = 0; i < 2; i++) {
|
||||
long c=ascii_to_bin(s2[i]);
|
||||
if(c < 0 || c > 63)
|
||||
c = 0;
|
||||
for(j = 0; j < 6; j++) {
|
||||
if((c >> j) & 0x1)
|
||||
saltbits |= BITMASK(6 * i + j);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Permute the sb table values
|
||||
* to reflect the changed e
|
||||
* selection table
|
||||
*/
|
||||
shuffle_sb(_ufc_sb0, current_saltbits ^ saltbits);
|
||||
shuffle_sb(_ufc_sb1, current_saltbits ^ saltbits);
|
||||
shuffle_sb(_ufc_sb2, current_saltbits ^ saltbits);
|
||||
shuffle_sb(_ufc_sb3, current_saltbits ^ saltbits);
|
||||
|
||||
current_saltbits = saltbits;
|
||||
}
|
||||
|
||||
static void ufc_mk_keytab(char *key)
|
||||
{ ufc_long v1, v2, *k1;
|
||||
int i;
|
||||
#ifdef _UFC_32_
|
||||
long32 v, *k2 = &_ufc_keytab[0][0];
|
||||
#endif
|
||||
#ifdef _UFC_64_
|
||||
long64 v, *k2 = &_ufc_keytab[0];
|
||||
#endif
|
||||
|
||||
v1 = v2 = 0; k1 = &do_pc1[0][0][0];
|
||||
for(i = 8; i--;) {
|
||||
v1 |= k1[*key & 0x7f]; k1 += 128;
|
||||
v2 |= k1[*key++ & 0x7f]; k1 += 128;
|
||||
}
|
||||
|
||||
for(i = 0; i < 16; i++) {
|
||||
k1 = &do_pc2[0][0];
|
||||
|
||||
v1 = (v1 << rots[i]) | (v1 >> (28 - rots[i]));
|
||||
v = k1[(v1 >> 21) & 0x7f]; k1 += 128;
|
||||
v |= k1[(v1 >> 14) & 0x7f]; k1 += 128;
|
||||
v |= k1[(v1 >> 7) & 0x7f]; k1 += 128;
|
||||
v |= k1[(v1 ) & 0x7f]; k1 += 128;
|
||||
|
||||
#ifdef _UFC_32_
|
||||
*k2++ = v;
|
||||
v = 0;
|
||||
#endif
|
||||
#ifdef _UFC_64_
|
||||
v <<= 32;
|
||||
#endif
|
||||
|
||||
v2 = (v2 << rots[i]) | (v2 >> (28 - rots[i]));
|
||||
v |= k1[(v2 >> 21) & 0x7f]; k1 += 128;
|
||||
v |= k1[(v2 >> 14) & 0x7f]; k1 += 128;
|
||||
v |= k1[(v2 >> 7) & 0x7f]; k1 += 128;
|
||||
v |= k1[(v2 ) & 0x7f];
|
||||
|
||||
*k2++ = v;
|
||||
}
|
||||
|
||||
direction = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Undo an extra E selection and do final permutations
|
||||
*/
|
||||
|
||||
ufc_long *_ufc_dofinalperm(ufc_long l1, ufc_long l2, ufc_long r1, ufc_long r2)
|
||||
{ ufc_long v1, v2, x;
|
||||
static ufc_long ary[2];
|
||||
|
||||
x = (l1 ^ l2) & current_saltbits; l1 ^= x; l2 ^= x;
|
||||
x = (r1 ^ r2) & current_saltbits; r1 ^= x; r2 ^= x;
|
||||
|
||||
v1=v2=0; l1 >>= 3; l2 >>= 3; r1 >>= 3; r2 >>= 3;
|
||||
|
||||
v1 |= efp[15][ r2 & 0x3f][0]; v2 |= efp[15][ r2 & 0x3f][1];
|
||||
v1 |= efp[14][(r2 >>= 6) & 0x3f][0]; v2 |= efp[14][ r2 & 0x3f][1];
|
||||
v1 |= efp[13][(r2 >>= 10) & 0x3f][0]; v2 |= efp[13][ r2 & 0x3f][1];
|
||||
v1 |= efp[12][(r2 >>= 6) & 0x3f][0]; v2 |= efp[12][ r2 & 0x3f][1];
|
||||
|
||||
v1 |= efp[11][ r1 & 0x3f][0]; v2 |= efp[11][ r1 & 0x3f][1];
|
||||
v1 |= efp[10][(r1 >>= 6) & 0x3f][0]; v2 |= efp[10][ r1 & 0x3f][1];
|
||||
v1 |= efp[ 9][(r1 >>= 10) & 0x3f][0]; v2 |= efp[ 9][ r1 & 0x3f][1];
|
||||
v1 |= efp[ 8][(r1 >>= 6) & 0x3f][0]; v2 |= efp[ 8][ r1 & 0x3f][1];
|
||||
|
||||
v1 |= efp[ 7][ l2 & 0x3f][0]; v2 |= efp[ 7][ l2 & 0x3f][1];
|
||||
v1 |= efp[ 6][(l2 >>= 6) & 0x3f][0]; v2 |= efp[ 6][ l2 & 0x3f][1];
|
||||
v1 |= efp[ 5][(l2 >>= 10) & 0x3f][0]; v2 |= efp[ 5][ l2 & 0x3f][1];
|
||||
v1 |= efp[ 4][(l2 >>= 6) & 0x3f][0]; v2 |= efp[ 4][ l2 & 0x3f][1];
|
||||
|
||||
v1 |= efp[ 3][ l1 & 0x3f][0]; v2 |= efp[ 3][ l1 & 0x3f][1];
|
||||
v1 |= efp[ 2][(l1 >>= 6) & 0x3f][0]; v2 |= efp[ 2][ l1 & 0x3f][1];
|
||||
v1 |= efp[ 1][(l1 >>= 10) & 0x3f][0]; v2 |= efp[ 1][ l1 & 0x3f][1];
|
||||
v1 |= efp[ 0][(l1 >>= 6) & 0x3f][0]; v2 |= efp[ 0][ l1 & 0x3f][1];
|
||||
|
||||
ary[0] = v1; ary[1] = v2;
|
||||
return ary;
|
||||
}
|
||||
|
||||
/*
|
||||
* crypt only: convert from 64 bit to 11 bit ASCII
|
||||
* prefixing with the salt
|
||||
*/
|
||||
|
||||
static char *output_conversion(ufc_long v1, ufc_long v2, const char *salt)
|
||||
{ static char outbuf[14];
|
||||
int i, s;
|
||||
|
||||
outbuf[0] = salt[0];
|
||||
outbuf[1] = salt[1] ? salt[1] : salt[0];
|
||||
|
||||
for(i = 0; i < 5; i++)
|
||||
outbuf[i + 2] = bin_to_ascii((v1 >> (26 - 6 * i)) & 0x3f);
|
||||
|
||||
s = (v2 & 0xf) << 2;
|
||||
v2 = (v2 >> 2) | ((v1 & 0x3) << 30);
|
||||
|
||||
for(i = 5; i < 10; i++)
|
||||
outbuf[i + 2] = bin_to_ascii((v2 >> (56 - 6 * i)) & 0x3f);
|
||||
|
||||
outbuf[12] = bin_to_ascii(s);
|
||||
outbuf[13] = 0;
|
||||
|
||||
return outbuf;
|
||||
}
|
||||
|
||||
/*
|
||||
* UNIX crypt function
|
||||
*/
|
||||
|
||||
static ufc_long *_ufc_doit(ufc_long , ufc_long, ufc_long, ufc_long, ufc_long);
|
||||
|
||||
char *ufc_crypt(const char *key,const char *salt)
|
||||
{ ufc_long *s;
|
||||
char ktab[9];
|
||||
|
||||
/*
|
||||
* Hack DES tables according to salt
|
||||
*/
|
||||
setup_salt(salt);
|
||||
|
||||
/*
|
||||
* Setup key schedule
|
||||
*/
|
||||
clearmem(ktab, sizeof ktab);
|
||||
strncpy(ktab, key, 8);
|
||||
ufc_mk_keytab(ktab);
|
||||
|
||||
/*
|
||||
* Go for the 25 DES encryptions
|
||||
*/
|
||||
s = _ufc_doit((ufc_long)0, (ufc_long)0,
|
||||
(ufc_long)0, (ufc_long)0, (ufc_long)25);
|
||||
|
||||
/*
|
||||
* And convert back to 6 bit ASCII
|
||||
*/
|
||||
return output_conversion(s[0], s[1], salt);
|
||||
}
|
||||
|
||||
|
||||
#ifdef _UFC_32_
|
||||
|
||||
/*
|
||||
* 32 bit version
|
||||
*/
|
||||
|
||||
extern long32 _ufc_keytab[16][2];
|
||||
extern long32 _ufc_sb0[], _ufc_sb1[], _ufc_sb2[], _ufc_sb3[];
|
||||
|
||||
#define SBA(sb, v) (*(long32*)((char*)(sb)+(v)))
|
||||
|
||||
static ufc_long *_ufc_doit(ufc_long l1, ufc_long l2, ufc_long r1, ufc_long r2, ufc_long itr)
|
||||
{ int i;
|
||||
long32 s, *k;
|
||||
|
||||
while(itr--) {
|
||||
k = &_ufc_keytab[0][0];
|
||||
for(i=8; i--; ) {
|
||||
s = *k++ ^ r1;
|
||||
l1 ^= SBA(_ufc_sb1, s & 0xffff); l2 ^= SBA(_ufc_sb1, (s & 0xffff)+4);
|
||||
l1 ^= SBA(_ufc_sb0, s >>= 16); l2 ^= SBA(_ufc_sb0, (s) +4);
|
||||
s = *k++ ^ r2;
|
||||
l1 ^= SBA(_ufc_sb3, s & 0xffff); l2 ^= SBA(_ufc_sb3, (s & 0xffff)+4);
|
||||
l1 ^= SBA(_ufc_sb2, s >>= 16); l2 ^= SBA(_ufc_sb2, (s) +4);
|
||||
|
||||
s = *k++ ^ l1;
|
||||
r1 ^= SBA(_ufc_sb1, s & 0xffff); r2 ^= SBA(_ufc_sb1, (s & 0xffff)+4);
|
||||
r1 ^= SBA(_ufc_sb0, s >>= 16); r2 ^= SBA(_ufc_sb0, (s) +4);
|
||||
s = *k++ ^ l2;
|
||||
r1 ^= SBA(_ufc_sb3, s & 0xffff); r2 ^= SBA(_ufc_sb3, (s & 0xffff)+4);
|
||||
r1 ^= SBA(_ufc_sb2, s >>= 16); r2 ^= SBA(_ufc_sb2, (s) +4);
|
||||
}
|
||||
s=l1; l1=r1; r1=s; s=l2; l2=r2; r2=s;
|
||||
}
|
||||
return _ufc_dofinalperm(l1, l2, r1, r2);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef _UFC_64_
|
||||
|
||||
/*
|
||||
* 64 bit version
|
||||
*/
|
||||
|
||||
extern long64 _ufc_keytab[16];
|
||||
extern long64 _ufc_sb0[], _ufc_sb1[], _ufc_sb2[], _ufc_sb3[];
|
||||
|
||||
#define SBA(sb, v) (*(long64*)((char*)(sb)+(v)))
|
||||
|
||||
static ufc_long *_ufc_doit(ufc_long l1, ufc_long l2, ufc_long r1, ufc_long r2, ufc_long itr)
|
||||
{ int i;
|
||||
long64 l, r, s, *k;
|
||||
|
||||
l = (((long64)l1) << 32) | ((long64)l2);
|
||||
r = (((long64)r1) << 32) | ((long64)r2);
|
||||
|
||||
while(itr--) {
|
||||
k = &_ufc_keytab[0];
|
||||
for(i=8; i--; ) {
|
||||
s = *k++ ^ r;
|
||||
l ^= SBA(_ufc_sb3, (s >> 0) & 0xffff);
|
||||
l ^= SBA(_ufc_sb2, (s >> 16) & 0xffff);
|
||||
l ^= SBA(_ufc_sb1, (s >> 32) & 0xffff);
|
||||
l ^= SBA(_ufc_sb0, (s >> 48) & 0xffff);
|
||||
|
||||
s = *k++ ^ l;
|
||||
r ^= SBA(_ufc_sb3, (s >> 0) & 0xffff);
|
||||
r ^= SBA(_ufc_sb2, (s >> 16) & 0xffff);
|
||||
r ^= SBA(_ufc_sb1, (s >> 32) & 0xffff);
|
||||
r ^= SBA(_ufc_sb0, (s >> 48) & 0xffff);
|
||||
}
|
||||
s=l; l=r; r=s;
|
||||
}
|
||||
|
||||
l1 = l >> 32; l2 = l & 0xffffffff;
|
||||
r1 = r >> 32; r2 = r & 0xffffffff;
|
||||
return _ufc_dofinalperm(l1, l2, r1, r2);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#else
|
||||
int ufc_dummy_procedure(void);
|
||||
int ufc_dummy_procedure(void) {return 0;}
|
||||
#endif
|
6
ctdb/lib/replace/crypt.m4
Normal file
6
ctdb/lib/replace/crypt.m4
Normal file
@ -0,0 +1,6 @@
|
||||
###############################################
|
||||
# test for where we get crypt() from
|
||||
AC_CHECK_HEADERS(crypt.h)
|
||||
AC_SEARCH_LIBS_EXT(crypt, [crypt], CRYPT_LIBS,
|
||||
[ AC_DEFINE(HAVE_CRYPT,1,[Whether the system has the crypt() function]) ],
|
||||
[ LIBREPLACEOBJ="${LIBREPLACEOBJ} $libreplacedir/crypt.o" ])
|
@ -3,6 +3,7 @@
|
||||
Samba system utilities
|
||||
Copyright (C) Andrew Tridgell 1992-1998
|
||||
Copyright (C) Jeremy Allison 1998-2002
|
||||
Copyright (C) Jelmer Vernooij 2006
|
||||
|
||||
** NOTE! The following LGPL license applies to the replace
|
||||
** library. This does NOT imply that all of Samba is released
|
||||
@ -35,6 +36,8 @@ void *rep_dlopen(const char *name, int flags)
|
||||
#endif
|
||||
{
|
||||
#ifdef HAVE_SHL_LOAD
|
||||
if (name == NULL)
|
||||
return PROG_HANDLE;
|
||||
return (void *)shl_load(name, flags, 0);
|
||||
#else
|
||||
return NULL;
|
||||
|
@ -23,7 +23,7 @@ AC_VERIFY_C_PROTOTYPE([void *dlopen(const char* filename, unsigned int flags)],
|
||||
])
|
||||
|
||||
if test x"${libreplace_cv_dlfcn}" = x"yes";then
|
||||
LIBREPLACEOBJ="${LIBREPLACEOBJ} dlfcn.o"
|
||||
LIBREPLACEOBJ="${LIBREPLACEOBJ} $libreplacedir/dlfcn.o"
|
||||
fi
|
||||
|
||||
LIBDL="$LIBS"
|
||||
|
@ -75,7 +75,9 @@ in lib/replace we use rep_xxx()
|
||||
#undef getnameinfo
|
||||
#endif
|
||||
#define getnameinfo rep_getnameinfo
|
||||
#ifndef HAVE_GETNAMEINFO
|
||||
#define HAVE_GETNAMEINFO
|
||||
#endif
|
||||
|
||||
extern int rep_getaddrinfo(const char *node, const char *service,
|
||||
const struct addrinfo * hints, struct addrinfo ** res);
|
||||
|
@ -19,6 +19,8 @@
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#define SOCKET_WRAPPER_NOT_REPLACE
|
||||
|
||||
#include "replace.h"
|
||||
#include "system/network.h"
|
||||
|
||||
@ -42,13 +44,14 @@
|
||||
|
||||
void rep_freeifaddrs(struct ifaddrs *ifp)
|
||||
{
|
||||
free(ifp->ifa_name);
|
||||
free(ifp->ifa_addr);
|
||||
free(ifp->ifa_netmask);
|
||||
free(ifp->ifa_dstaddr);
|
||||
if (ifp->ifa_next != NULL)
|
||||
if (ifp != NULL) {
|
||||
free(ifp->ifa_name);
|
||||
free(ifp->ifa_addr);
|
||||
free(ifp->ifa_netmask);
|
||||
free(ifp->ifa_dstaddr);
|
||||
freeifaddrs(ifp->ifa_next);
|
||||
free(ifp);
|
||||
free(ifp);
|
||||
}
|
||||
}
|
||||
|
||||
static struct sockaddr *sockaddr_dup(struct sockaddr *sa)
|
||||
@ -81,11 +84,8 @@ int rep_getifaddrs(struct ifaddrs **ifap)
|
||||
char buff[8192];
|
||||
int fd, i, n;
|
||||
struct ifreq *ifr=NULL;
|
||||
int total = 0;
|
||||
struct in_addr ipaddr;
|
||||
struct in_addr nmask;
|
||||
char *iname;
|
||||
struct ifaddrs *curif, *lastif;
|
||||
struct ifaddrs *curif;
|
||||
struct ifaddrs *lastif = NULL;
|
||||
|
||||
*ifap = NULL;
|
||||
|
||||
@ -106,39 +106,34 @@ int rep_getifaddrs(struct ifaddrs **ifap)
|
||||
n = ifc.ifc_len / sizeof(struct ifreq);
|
||||
|
||||
/* Loop through interfaces, looking for given IP address */
|
||||
for (i=n-1;i>=0 && total < max_interfaces;i--) {
|
||||
if (ioctl(fd, SIOCGIFADDR, &ifr[i]) != 0) {
|
||||
for (i=n-1; i>=0; i--) {
|
||||
if (ioctl(fd, SIOCGIFFLAGS, &ifr[i]) == -1) {
|
||||
freeifaddrs(*ifap);
|
||||
return -1;
|
||||
}
|
||||
|
||||
curif = calloc(1, sizeof(struct ifaddrs));
|
||||
if (lastif == NULL) {
|
||||
*ifap = curif;
|
||||
} else {
|
||||
lastif->ifa_next = (*ifap);
|
||||
}
|
||||
|
||||
curif->ifa_name = strdup(ifr[i].ifr_name);
|
||||
curif->ifa_addr = sockaddr_dup(&ifr[i].ifr_addr);
|
||||
curif->ifa_flags = ifr[i].ifr_flags;
|
||||
curif->ifa_dstaddr = NULL;
|
||||
curif->ifa_data = NULL;
|
||||
curif->ifa_next = NULL;
|
||||
|
||||
curif->ifa_addr = NULL;
|
||||
if (ioctl(fd, SIOCGIFADDR, &ifr[i]) != -1) {
|
||||
curif->ifa_addr = sockaddr_dup(&ifr[i].ifr_addr);
|
||||
}
|
||||
|
||||
curif->ifa_netmask = NULL;
|
||||
if (ioctl(fd, SIOCGIFNETMASK, &ifr[i]) != -1) {
|
||||
curif->ifa_netmask = sockaddr_dup(&ifr[i].ifr_addr);
|
||||
}
|
||||
|
||||
if (ioctl(fd, SIOCGIFFLAGS, &ifr[i]) != 0) {
|
||||
freeifaddrs(*ifap);
|
||||
return -1;
|
||||
}
|
||||
|
||||
curif->ifa_flags = ifr[i].ifr_flags;
|
||||
|
||||
if (ioctl(fd, SIOCGIFNETMASK, &ifr[i]) != 0) {
|
||||
freeifaddrs(*ifap);
|
||||
return -1;
|
||||
}
|
||||
|
||||
curif->ifa_netmask = sockaddr_dup(&ifr[i].ifr_addr);
|
||||
|
||||
if (lastif == NULL) {
|
||||
*ifap = curif;
|
||||
} else {
|
||||
lastif->ifa_next = curif;
|
||||
}
|
||||
lastif = curif;
|
||||
}
|
||||
|
||||
@ -166,11 +161,8 @@ int rep_getifaddrs(struct ifaddrs **ifap)
|
||||
char buff[8192];
|
||||
int fd, i, n;
|
||||
struct ifreq *ifr=NULL;
|
||||
int total = 0;
|
||||
struct in_addr ipaddr;
|
||||
struct in_addr nmask;
|
||||
char *iname;
|
||||
struct ifaddrs *curif;
|
||||
struct ifaddrs *lastif = NULL;
|
||||
|
||||
*ifap = NULL;
|
||||
|
||||
@ -201,14 +193,14 @@ int rep_getifaddrs(struct ifaddrs **ifap)
|
||||
|
||||
/* Loop through interfaces */
|
||||
|
||||
for (i = 0; i<n && total < max_interfaces; i++) {
|
||||
for (i = 0; i<n; i++) {
|
||||
ifreq = ifr[i];
|
||||
|
||||
curif = calloc(1, sizeof(struct ifaddrs));
|
||||
if (lastif == NULL) {
|
||||
*ifap = curif;
|
||||
} else {
|
||||
lastif->ifa_next = (*ifap);
|
||||
lastif->ifa_next = curif;
|
||||
}
|
||||
|
||||
strioctl.ic_cmd = SIOCGIFFLAGS;
|
||||
@ -267,11 +259,8 @@ int rep_getifaddrs(struct ifaddrs **ifap)
|
||||
int fd, i;
|
||||
struct ifconf ifc;
|
||||
struct ifreq *ifr=NULL;
|
||||
struct in_addr ipaddr;
|
||||
struct in_addr nmask;
|
||||
char *iname;
|
||||
int total = 0;
|
||||
struct ifaddrs *curif, *lastif;
|
||||
struct ifaddrs *curif;
|
||||
struct ifaddrs *lastif = NULL;
|
||||
|
||||
*ifap = NULL;
|
||||
|
||||
@ -293,7 +282,7 @@ int rep_getifaddrs(struct ifaddrs **ifap)
|
||||
i = ifc.ifc_len;
|
||||
|
||||
while (i > 0) {
|
||||
uint_t inc;
|
||||
unsigned int inc;
|
||||
|
||||
inc = ifr->ifr_addr.sa_len;
|
||||
|
||||
@ -306,7 +295,7 @@ int rep_getifaddrs(struct ifaddrs **ifap)
|
||||
if (lastif == NULL) {
|
||||
*ifap = curif;
|
||||
} else {
|
||||
lastif->ifa_next = (*ifap);
|
||||
lastif->ifa_next = curif;
|
||||
}
|
||||
|
||||
curif->ifa_name = strdup(ifr->ifr_name);
|
||||
@ -361,32 +350,3 @@ int rep_getifaddrs(struct ifaddrs **ifap)
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef AUTOCONF_TEST
|
||||
/* this is the autoconf driver to test get_interfaces() */
|
||||
|
||||
int main()
|
||||
{
|
||||
struct ifaddrs *ifs = NULL;
|
||||
int ret;
|
||||
|
||||
ret = getifaddrs(&ifs);
|
||||
if (ret != 0) {
|
||||
perror("getifaddrs() failed");
|
||||
return 1;
|
||||
}
|
||||
|
||||
while (ifs) {
|
||||
printf("%-10s ", ifs->ifa_name);
|
||||
if (ifs->ifa_addr != NULL &&
|
||||
ifs->ifa_addr->sa_family == AF_INET) {
|
||||
printf("IP=%s ", inet_ntoa(((struct sockaddr_in *)ifs->ifa_addr)->sin_addr));
|
||||
if (ifs->ifa_netmask != NULL)
|
||||
printf("NETMASK=%s", inet_ntoa(((struct sockaddr_in *)ifs->ifa_netmask)->sin_addr));
|
||||
}
|
||||
printf("\n");
|
||||
ifs = ifs->ifa_next;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
@ -34,10 +34,6 @@ typedef int sig_atomic_t;
|
||||
#define SIGCLD SIGCHLD
|
||||
#endif
|
||||
|
||||
#ifndef SIGNAL_CAST
|
||||
#define SIGNAL_CAST (RETSIGTYPE (*)(int))
|
||||
#endif
|
||||
|
||||
#ifdef SYSV_TERMIO
|
||||
|
||||
/* SYSTEM V TERMIO HANDLING */
|
||||
@ -99,7 +95,7 @@ static int tcsetattr(int fd, int flags, struct sgttyb *_t)
|
||||
static struct termios t;
|
||||
#endif /* SYSV_TERMIO */
|
||||
|
||||
static void catch_signal(int signum,void (*handler)(int ))
|
||||
static void catch_signal(int signum, void (*handler)(int ))
|
||||
{
|
||||
#ifdef HAVE_SIGACTION
|
||||
struct sigaction act;
|
||||
@ -131,7 +127,7 @@ static int in_fd = -1;
|
||||
Signal function to tell us were ^C'ed.
|
||||
****************************************************************/
|
||||
|
||||
static void gotintr_sig(void)
|
||||
static void gotintr_sig(int signum)
|
||||
{
|
||||
gotintr = 1;
|
||||
if (in_fd != -1)
|
||||
@ -148,7 +144,7 @@ char *rep_getpass(const char *prompt)
|
||||
size_t nread;
|
||||
|
||||
/* Catch problematic signals */
|
||||
catch_signal(SIGINT, SIGNAL_CAST gotintr_sig);
|
||||
catch_signal(SIGINT, gotintr_sig);
|
||||
|
||||
/* Try to write to and read from the terminal if we can.
|
||||
If we can't open the terminal, use stderr and stdin. */
|
||||
@ -185,7 +181,9 @@ char *rep_getpass(const char *prompt)
|
||||
buf[0] = 0;
|
||||
if (!gotintr) {
|
||||
in_fd = fileno(in);
|
||||
fgets(buf, bufsize, in);
|
||||
if (fgets(buf, bufsize, in) == NULL) {
|
||||
buf[0] = 0;
|
||||
}
|
||||
}
|
||||
nread = strlen(buf);
|
||||
if (nread) {
|
||||
@ -195,8 +193,9 @@ char *rep_getpass(const char *prompt)
|
||||
|
||||
/* Restore echoing. */
|
||||
if (echo_off) {
|
||||
if (gotintr && in_fd == -1)
|
||||
if (gotintr && in_fd == -1) {
|
||||
in = fopen ("/dev/tty", "w+");
|
||||
}
|
||||
if (in != NULL)
|
||||
tcsetattr (fileno (in), TCSANOW, &t);
|
||||
}
|
||||
@ -208,7 +207,7 @@ char *rep_getpass(const char *prompt)
|
||||
fclose(in);
|
||||
|
||||
/* Catch problematic signals */
|
||||
catch_signal(SIGINT, SIGNAL_CAST SIG_DFL);
|
||||
catch_signal(SIGINT, SIG_DFL);
|
||||
|
||||
if (gotintr) {
|
||||
printf("Interrupted by signal.\n");
|
||||
|
@ -1,14 +1,24 @@
|
||||
AC_CACHE_CHECK([whether getpass should be replaced],samba_cv_REPLACE_GETPASS,[
|
||||
AC_CHECK_FUNC(getpass, libreplace_cv_HAVE_GETPASS=yes)
|
||||
AC_CHECK_FUNC(getpassphrase, libreplace_cv_HAVE_GETPASSPHRASE=yes)
|
||||
if test x"$libreplace_cv_HAVE_GETPASS" = x"yes" -a x"$libreplace_cv_HAVE_GETPASSPHRASE" = x"yes"; then
|
||||
AC_DEFINE(REPLACE_GETPASS_BY_GETPASSPHRASE, 1, [getpass returns <9 chars where getpassphrase returns <265 chars])
|
||||
AC_DEFINE(REPLACE_GETPASS,1,[Whether getpass should be replaced])
|
||||
LIBREPLACEOBJ="${LIBREPLACEOBJ} $libreplacedir/getpass.o"
|
||||
else
|
||||
|
||||
AC_CACHE_CHECK([whether getpass should be replaced],libreplace_cv_REPLACE_GETPASS,[
|
||||
SAVE_CPPFLAGS="$CPPFLAGS"
|
||||
CPPFLAGS="$CPPFLAGS -I$libreplacedir/"
|
||||
AC_TRY_COMPILE([
|
||||
#include "confdefs.h"
|
||||
#define NO_CONFIG_H
|
||||
#include "$libreplacedir/getpass.c"
|
||||
],[],samba_cv_REPLACE_GETPASS=yes,samba_cv_REPLACE_GETPASS=no)
|
||||
],[],libreplace_cv_REPLACE_GETPASS=yes,libreplace_cv_REPLACE_GETPASS=no)
|
||||
CPPFLAGS="$SAVE_CPPFLAGS"
|
||||
])
|
||||
if test x"$samba_cv_REPLACE_GETPASS" = x"yes"; then
|
||||
if test x"$libreplace_cv_REPLACE_GETPASS" = x"yes"; then
|
||||
AC_DEFINE(REPLACE_GETPASS,1,[Whether getpass should be replaced])
|
||||
LIBREPLACEOBJ="${LIBREPLACEOBJ} getpass.o"
|
||||
LIBREPLACEOBJ="${LIBREPLACEOBJ} $libreplacedir/getpass.o"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
2
ctdb/lib/replace/hdr_replace.h
Normal file
2
ctdb/lib/replace/hdr_replace.h
Normal file
@ -0,0 +1,2 @@
|
||||
/* this is a replacement header for a missing system header */
|
||||
#include "replace.h"
|
33
ctdb/lib/replace/inet_aton.c
Normal file
33
ctdb/lib/replace/inet_aton.c
Normal file
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Unix SMB/CIFS implementation.
|
||||
* replacement functions
|
||||
* Copyright (C) Michael Adam <obnox@samba.org> 2008
|
||||
*
|
||||
* ** NOTE! The following LGPL license applies to the replace
|
||||
* ** library. This does NOT imply that all of Samba is released
|
||||
* ** under the LGPL
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "replace.h"
|
||||
#include "system/network.h"
|
||||
|
||||
/**
|
||||
* We know that we have inet_pton from earlier libreplace checks.
|
||||
*/
|
||||
int rep_inet_aton(const char *src, struct in_addr *dst)
|
||||
{
|
||||
return (inet_pton(AF_INET, src, dst) > 0) ? 1 : 0;
|
||||
}
|
39
ctdb/lib/replace/inet_ntoa.c
Normal file
39
ctdb/lib/replace/inet_ntoa.c
Normal file
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Unix SMB/CIFS implementation.
|
||||
* replacement routines for broken systems
|
||||
* Copyright (C) Andrew Tridgell 2003
|
||||
* Copyright (C) Michael Adam 2008
|
||||
*
|
||||
* ** NOTE! The following LGPL license applies to the replace
|
||||
* ** library. This does NOT imply that all of Samba is released
|
||||
* ** under the LGPL
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "replace.h"
|
||||
#include "system/network.h"
|
||||
|
||||
/**
|
||||
* NOTE: this is not thread safe, but it can't be, either
|
||||
* since it returns a pointer to static memory.
|
||||
*/
|
||||
char *rep_inet_ntoa(struct in_addr ip)
|
||||
{
|
||||
uint8_t *p = (uint8_t *)&ip.s_addr;
|
||||
static char buf[18];
|
||||
slprintf(buf, 17, "%d.%d.%d.%d",
|
||||
(int)p[0], (int)p[1], (int)p[2], (int)p[3]);
|
||||
return buf;
|
||||
}
|
@ -5,7 +5,7 @@ echo "LIBREPLACE_LOCATION_CHECKS: START"
|
||||
dnl find the libreplace sources. This is meant to work both for
|
||||
dnl libreplace standalone builds, and builds of packages using libreplace
|
||||
libreplacedir=""
|
||||
libreplacepaths="$srcdir $srcdir/lib/replace $srcdir/libreplace $srcdir/../libreplace $srcdir/../replace"
|
||||
libreplacepaths="$srcdir $srcdir/lib/replace $srcdir/libreplace $srcdir/../libreplace $srcdir/../replace $srcdir/../lib/replace $srcdir/../../../lib/replace"
|
||||
for d in $libreplacepaths; do
|
||||
if test -f "$d/replace.c"; then
|
||||
libreplacedir="$d"
|
||||
@ -16,7 +16,7 @@ done
|
||||
if test x"$libreplacedir" = "x"; then
|
||||
AC_MSG_ERROR([cannot find libreplace in $libreplacepaths])
|
||||
fi
|
||||
LIBREPLACEOBJ="replace.o"
|
||||
LIBREPLACEOBJ="$libreplacedir/replace.o"
|
||||
AC_SUBST(LIBREPLACEOBJ)
|
||||
|
||||
AC_CANONICAL_BUILD
|
||||
@ -34,19 +34,23 @@ echo "LIBREPLACE_BROKEN_CHECKS: START"
|
||||
dnl find the libreplace sources. This is meant to work both for
|
||||
dnl libreplace standalone builds, and builds of packages using libreplace
|
||||
libreplacedir=""
|
||||
for d in "$srcdir" "$srcdir/lib/replace" "$srcdir/libreplace" "$srcdir/../libreplace" "$srcdir/../replace"; do
|
||||
libreplacepaths="$srcdir $srcdir/lib/replace $srcdir/libreplace $srcdir/../libreplace $srcdir/../replace $srcdir/../lib/replace $srcdir/../../../lib/replace"
|
||||
for d in $libreplacepaths; do
|
||||
if test -f "$d/replace.c"; then
|
||||
libreplacedir="$d"
|
||||
AC_SUBST(libreplacedir)
|
||||
break;
|
||||
fi
|
||||
done
|
||||
LIBREPLACEOBJ="replace.o"
|
||||
if test x"$libreplacedir" = "x"; then
|
||||
AC_MSG_ERROR([cannot find libreplace in $libreplacepaths])
|
||||
fi
|
||||
|
||||
LIBREPLACEOBJ="$libreplacedir/replace.o"
|
||||
AC_SUBST(LIBREPLACEOBJ)
|
||||
|
||||
LIBREPLACEOBJ="${LIBREPLACEOBJ} snprintf.o"
|
||||
LIBREPLACEOBJ="${LIBREPLACEOBJ} $libreplacedir/snprintf.o"
|
||||
|
||||
AC_TYPE_SIGNAL
|
||||
AC_TYPE_UID_T
|
||||
AC_TYPE_MODE_T
|
||||
AC_TYPE_OFF_T
|
||||
@ -59,14 +63,16 @@ AC_CHECK_TYPE(offset_t,loff_t)
|
||||
|
||||
AC_FUNC_MEMCMP
|
||||
|
||||
AC_CHECK_FUNCS(pipe strftime srandom random srand rand usleep setbuffer lstat getpgrp)
|
||||
AC_CHECK_FUNCS([pipe strftime srandom random srand rand usleep setbuffer lstat getpgrp utime utimes])
|
||||
|
||||
AC_CHECK_HEADERS(stdbool.h stdint.h sys/select.h)
|
||||
AC_CHECK_HEADERS(setjmp.h)
|
||||
AC_CHECK_HEADERS(setjmp.h utime.h)
|
||||
|
||||
LIBREPLACE_PROVIDE_HEADER([stdint.h])
|
||||
LIBREPLACE_PROVIDE_HEADER([stdbool.h])
|
||||
|
||||
AC_DEFINE(HAVE_LIBREPLACE, 1, [We have libreplace])
|
||||
|
||||
AC_CHECK_TYPE(bool,
|
||||
[AC_DEFINE(HAVE_BOOL, 1, [Whether the bool type is available])],,
|
||||
[
|
||||
@ -85,103 +91,55 @@ AC_INCLUDES_DEFAULT
|
||||
#endif]
|
||||
)
|
||||
|
||||
AC_CACHE_CHECK([for working mmap],samba_cv_HAVE_MMAP,[
|
||||
AC_CHECK_HEADERS(linux/types.h)
|
||||
|
||||
AC_CACHE_CHECK([for working mmap],libreplace_cv_HAVE_MMAP,[
|
||||
AC_TRY_RUN([#include "$libreplacedir/test/shared_mmap.c"],
|
||||
samba_cv_HAVE_MMAP=yes,samba_cv_HAVE_MMAP=no,samba_cv_HAVE_MMAP=cross)])
|
||||
if test x"$samba_cv_HAVE_MMAP" = x"yes"; then
|
||||
libreplace_cv_HAVE_MMAP=yes,libreplace_cv_HAVE_MMAP=no,libreplace_cv_HAVE_MMAP=cross)])
|
||||
if test x"$libreplace_cv_HAVE_MMAP" = x"yes"; then
|
||||
AC_DEFINE(HAVE_MMAP,1,[Whether mmap works])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for working mremap],libreplace_cv_HAVE_MREMAP,[
|
||||
AC_TRY_RUN([#include "$libreplacedir/test/shared_mremap.c"],
|
||||
libreplace_cv_HAVE_MREMAP=yes,libreplace_cv_HAVE_MREMAP=no,libreplace_cv_HAVE_MREMAP=cross)])
|
||||
if test x"$libreplace_cv_HAVE_MREMAP" = x"yes"; then
|
||||
AC_DEFINE(HAVE_MREMAP,1,[Whether mremap works])
|
||||
fi
|
||||
|
||||
|
||||
AC_CHECK_HEADERS(sys/syslog.h syslog.h)
|
||||
AC_CHECK_HEADERS(sys/time.h time.h)
|
||||
AC_CHECK_HEADERS(stdarg.h vararg.h)
|
||||
AC_CHECK_HEADERS(sys/socket.h netinet/in.h netdb.h arpa/inet.h)
|
||||
AC_CHECK_HEADERS(netinet/ip.h netinet/tcp.h netinet/in_systm.h netinet/in_ip.h)
|
||||
AC_CHECK_HEADERS(sys/sockio.h sys/un.h)
|
||||
AC_CHECK_HEADERS(sys/mount.h mntent.h)
|
||||
AC_CHECK_HEADERS(stropts.h)
|
||||
AC_CHECK_HEADERS(unix.h)
|
||||
|
||||
dnl we need to check that net/if.h really can be used, to cope with hpux
|
||||
dnl where including it always fails
|
||||
AC_CACHE_CHECK([for usable net/if.h],libreplace_cv_USABLE_NET_IF_H,[
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
|
||||
AC_INCLUDES_DEFAULT
|
||||
#if HAVE_SYS_SOCKET_H
|
||||
# include <sys/socket.h>
|
||||
#endif
|
||||
#include <net/if.h>
|
||||
int main(void) {return 0;}])],
|
||||
[libreplace_cv_USABLE_NET_IF_H=yes],
|
||||
[libreplace_cv_USABLE_NET_IF_H=no]
|
||||
)
|
||||
])
|
||||
if test x"$libreplace_cv_USABLE_NET_IF_H" = x"yes";then
|
||||
AC_DEFINE(HAVE_NET_IF_H, 1, usability of net/if.h)
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for broken inet_ntoa],samba_cv_REPLACE_INET_NTOA,[
|
||||
AC_TRY_RUN([
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
main() { struct in_addr ip; ip.s_addr = 0x12345678;
|
||||
if (strcmp(inet_ntoa(ip),"18.52.86.120") &&
|
||||
strcmp(inet_ntoa(ip),"120.86.52.18")) { exit(0); }
|
||||
exit(1);}],
|
||||
samba_cv_REPLACE_INET_NTOA=yes,samba_cv_REPLACE_INET_NTOA=no,samba_cv_REPLACE_INET_NTOA=cross)])
|
||||
if test x"$samba_cv_REPLACE_INET_NTOA" = x"yes"; then
|
||||
AC_DEFINE(REPLACE_INET_NTOA,1,[Whether inet_ntoa should be replaced])
|
||||
fi
|
||||
|
||||
AC_HAVE_TYPE([socklen_t],[#include <sys/socket.h>])
|
||||
AC_HAVE_TYPE([sa_family_t],[#include <sys/socket.h>])
|
||||
AC_HAVE_TYPE([struct addrinfo], [#include <netdb.h>])
|
||||
AC_HAVE_TYPE([struct sockaddr], [#include <sys/socket.h>])
|
||||
AC_HAVE_TYPE([struct sockaddr_storage], [
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
])
|
||||
AC_HAVE_TYPE([struct sockaddr_in6], [
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
])
|
||||
|
||||
if test x"$ac_cv_type_struct_sockaddr_storage" = x"yes"; then
|
||||
AC_CHECK_MEMBER(struct sockaddr_storage.ss_family,
|
||||
AC_DEFINE(HAVE_SS_FAMILY, 1, [Defined if struct sockaddr_storage has ss_family field]),,
|
||||
[
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
])
|
||||
|
||||
if test x"$ac_cv_member_struct_sockaddr_storage_ss_family" != x"yes"; then
|
||||
AC_CHECK_MEMBER(struct sockaddr_storage.__ss_family,
|
||||
AC_DEFINE(HAVE___SS_FAMILY, 1, [Defined if struct sockaddr_storage has __ss_family field]),,
|
||||
[
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
])
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_CHECK_FUNCS(seteuid setresuid setegid setresgid chroot bzero strerror)
|
||||
AC_CHECK_FUNCS(seteuid setreuid setresuid setegid setregid setresgid)
|
||||
AC_CHECK_FUNCS(chroot bzero strerror strerror_r)
|
||||
AC_CHECK_FUNCS(vsyslog setlinebuf mktime ftruncate chsize rename)
|
||||
AC_CHECK_FUNCS(waitpid strlcpy strlcat initgroups memmove strdup)
|
||||
AC_CHECK_FUNCS(pread pwrite strndup strcasestr strtok_r mkdtemp socketpair)
|
||||
AC_CHECK_FUNCS(isatty)
|
||||
AC_CHECK_FUNCS(waitpid wait4 strlcpy strlcat initgroups memmove strdup)
|
||||
AC_CHECK_FUNCS(pread pwrite strndup strcasestr strtok_r mkdtemp dup2 dprintf vdprintf)
|
||||
AC_CHECK_FUNCS(isatty chown lchown link readlink symlink realpath)
|
||||
AC_CHECK_FUNCS(fdatasync,,[
|
||||
# if we didn't find it, look in librt (Solaris hides it there...)
|
||||
AC_CHECK_LIB(rt, fdatasync,
|
||||
[libreplace_cv_HAVE_FDATASYNC_IN_LIBRT=yes
|
||||
AC_DEFINE(HAVE_FDATASYNC, 1, Define to 1 if there is support for fdatasync)])
|
||||
])
|
||||
AC_HAVE_DECL(fdatasync, [#include <unistd.h>])
|
||||
AC_CHECK_FUNCS(clock_gettime,libreplace_cv_have_clock_gettime=yes,[
|
||||
AC_CHECK_LIB(rt, clock_gettime,
|
||||
[libreplace_cv_HAVE_CLOCK_GETTIME_IN_LIBRT=yes
|
||||
libreplace_cv_have_clock_gettime=yes
|
||||
AC_DEFINE(HAVE_CLOCK_GETTIME, 1, Define to 1 if there is support for clock_gettime)])
|
||||
])
|
||||
AC_CHECK_FUNCS(get_current_dir_name)
|
||||
AC_HAVE_DECL(setresuid, [#include <unistd.h>])
|
||||
AC_HAVE_DECL(setresgid, [#include <unistd.h>])
|
||||
AC_HAVE_DECL(errno, [#include <errno.h>])
|
||||
|
||||
AC_CACHE_CHECK([for secure mkstemp],samba_cv_HAVE_SECURE_MKSTEMP,[
|
||||
AC_CACHE_CHECK([for secure mkstemp],libreplace_cv_HAVE_SECURE_MKSTEMP,[
|
||||
AC_TRY_RUN([#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
@ -196,10 +154,10 @@ main() {
|
||||
if ((st.st_mode & 0777) != 0600) exit(1);
|
||||
exit(0);
|
||||
}],
|
||||
samba_cv_HAVE_SECURE_MKSTEMP=yes,
|
||||
samba_cv_HAVE_SECURE_MKSTEMP=no,
|
||||
samba_cv_HAVE_SECURE_MKSTEMP=cross)])
|
||||
if test x"$samba_cv_HAVE_SECURE_MKSTEMP" = x"yes"; then
|
||||
libreplace_cv_HAVE_SECURE_MKSTEMP=yes,
|
||||
libreplace_cv_HAVE_SECURE_MKSTEMP=no,
|
||||
libreplace_cv_HAVE_SECURE_MKSTEMP=cross)])
|
||||
if test x"$libreplace_cv_HAVE_SECURE_MKSTEMP" = x"yes"; then
|
||||
AC_DEFINE(HAVE_SECURE_MKSTEMP,1,[Whether mkstemp is secure])
|
||||
fi
|
||||
|
||||
@ -208,7 +166,7 @@ AC_CHECK_HEADERS(stdio.h strings.h)
|
||||
AC_CHECK_DECLS([snprintf, vsnprintf, asprintf, vasprintf])
|
||||
AC_CHECK_FUNCS(snprintf vsnprintf asprintf vasprintf)
|
||||
|
||||
AC_CACHE_CHECK([for C99 vsnprintf],samba_cv_HAVE_C99_VSNPRINTF,[
|
||||
AC_CACHE_CHECK([for C99 vsnprintf],libreplace_cv_HAVE_C99_VSNPRINTF,[
|
||||
AC_TRY_RUN([
|
||||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
@ -242,43 +200,43 @@ void foo(const char *format, ...) {
|
||||
}
|
||||
main() { foo("hello"); }
|
||||
],
|
||||
samba_cv_HAVE_C99_VSNPRINTF=yes,samba_cv_HAVE_C99_VSNPRINTF=no,samba_cv_HAVE_C99_VSNPRINTF=cross)])
|
||||
if test x"$samba_cv_HAVE_C99_VSNPRINTF" = x"yes"; then
|
||||
libreplace_cv_HAVE_C99_VSNPRINTF=yes,libreplace_cv_HAVE_C99_VSNPRINTF=no,libreplace_cv_HAVE_C99_VSNPRINTF=cross)])
|
||||
if test x"$libreplace_cv_HAVE_C99_VSNPRINTF" = x"yes"; then
|
||||
AC_DEFINE(HAVE_C99_VSNPRINTF,1,[Whether there is a C99 compliant vsnprintf])
|
||||
fi
|
||||
|
||||
|
||||
dnl VA_COPY
|
||||
AC_CACHE_CHECK([for va_copy],samba_cv_HAVE_VA_COPY,[
|
||||
AC_CACHE_CHECK([for va_copy],libreplace_cv_HAVE_VA_COPY,[
|
||||
AC_TRY_LINK([#include <stdarg.h>
|
||||
va_list ap1,ap2;], [va_copy(ap1,ap2);],
|
||||
samba_cv_HAVE_VA_COPY=yes,samba_cv_HAVE_VA_COPY=no)])
|
||||
if test x"$samba_cv_HAVE_VA_COPY" = x"yes"; then
|
||||
libreplace_cv_HAVE_VA_COPY=yes,libreplace_cv_HAVE_VA_COPY=no)])
|
||||
if test x"$libreplace_cv_HAVE_VA_COPY" = x"yes"; then
|
||||
AC_DEFINE(HAVE_VA_COPY,1,[Whether va_copy() is available])
|
||||
fi
|
||||
|
||||
if test x"$samba_cv_HAVE_VA_COPY" != x"yes"; then
|
||||
AC_CACHE_CHECK([for __va_copy],samba_cv_HAVE___VA_COPY,[
|
||||
if test x"$libreplace_cv_HAVE_VA_COPY" != x"yes"; then
|
||||
AC_CACHE_CHECK([for __va_copy],libreplace_cv_HAVE___VA_COPY,[
|
||||
AC_TRY_LINK([#include <stdarg.h>
|
||||
va_list ap1,ap2;], [__va_copy(ap1,ap2);],
|
||||
samba_cv_HAVE___VA_COPY=yes,samba_cv_HAVE___VA_COPY=no)])
|
||||
if test x"$samba_cv_HAVE___VA_COPY" = x"yes"; then
|
||||
libreplace_cv_HAVE___VA_COPY=yes,libreplace_cv_HAVE___VA_COPY=no)])
|
||||
if test x"$libreplace_cv_HAVE___VA_COPY" = x"yes"; then
|
||||
AC_DEFINE(HAVE___VA_COPY,1,[Whether __va_copy() is available])
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl __FUNCTION__ macro
|
||||
AC_CACHE_CHECK([for __FUNCTION__ macro],samba_cv_HAVE_FUNCTION_MACRO,[
|
||||
AC_CACHE_CHECK([for __FUNCTION__ macro],libreplace_cv_HAVE_FUNCTION_MACRO,[
|
||||
AC_TRY_COMPILE([#include <stdio.h>], [printf("%s\n", __FUNCTION__);],
|
||||
samba_cv_HAVE_FUNCTION_MACRO=yes,samba_cv_HAVE_FUNCTION_MACRO=no)])
|
||||
if test x"$samba_cv_HAVE_FUNCTION_MACRO" = x"yes"; then
|
||||
libreplace_cv_HAVE_FUNCTION_MACRO=yes,libreplace_cv_HAVE_FUNCTION_MACRO=no)])
|
||||
if test x"$libreplace_cv_HAVE_FUNCTION_MACRO" = x"yes"; then
|
||||
AC_DEFINE(HAVE_FUNCTION_MACRO,1,[Whether there is a __FUNCTION__ macro])
|
||||
else
|
||||
dnl __func__ macro
|
||||
AC_CACHE_CHECK([for __func__ macro],samba_cv_HAVE_func_MACRO,[
|
||||
AC_CACHE_CHECK([for __func__ macro],libreplace_cv_HAVE_func_MACRO,[
|
||||
AC_TRY_COMPILE([#include <stdio.h>], [printf("%s\n", __func__);],
|
||||
samba_cv_HAVE_func_MACRO=yes,samba_cv_HAVE_func_MACRO=no)])
|
||||
if test x"$samba_cv_HAVE_func_MACRO" = x"yes"; then
|
||||
libreplace_cv_HAVE_func_MACRO=yes,libreplace_cv_HAVE_func_MACRO=no)])
|
||||
if test x"$libreplace_cv_HAVE_func_MACRO" = x"yes"; then
|
||||
AC_DEFINE(HAVE_func_MACRO,1,[Whether there is a __func__ macro])
|
||||
fi
|
||||
fi
|
||||
@ -290,10 +248,13 @@ AC_CHECK_TYPE(comparison_fn_t,
|
||||
|
||||
AC_HAVE_DECL(setenv, [#include <stdlib.h>])
|
||||
AC_CHECK_FUNCS(setenv unsetenv)
|
||||
AC_HAVE_DECL(environ, [#include <unistd.h>])
|
||||
|
||||
AC_CHECK_FUNCS(strnlen)
|
||||
AC_CHECK_FUNCS(strtoull __strtoull strtouq strtoll __strtoll strtoq)
|
||||
|
||||
AC_CHECK_FUNCS(memmem)
|
||||
|
||||
# this test disabled as we don't actually need __VA_ARGS__ yet
|
||||
AC_TRY_CPP([
|
||||
#define eprintf(...) fprintf(stderr, __VA_ARGS__)
|
||||
@ -301,7 +262,7 @@ eprintf("bla", "bar");
|
||||
], AC_DEFINE(HAVE__VA_ARGS__MACRO, 1, [Whether the __VA_ARGS__ macro is available]))
|
||||
|
||||
|
||||
AC_CACHE_CHECK([for sig_atomic_t type],samba_cv_sig_atomic_t, [
|
||||
AC_CACHE_CHECK([for sig_atomic_t type],libreplace_cv_sig_atomic_t, [
|
||||
AC_TRY_COMPILE([
|
||||
#include <sys/types.h>
|
||||
#if STDC_HEADERS
|
||||
@ -309,30 +270,30 @@ AC_CACHE_CHECK([for sig_atomic_t type],samba_cv_sig_atomic_t, [
|
||||
#include <stddef.h>
|
||||
#endif
|
||||
#include <signal.h>],[sig_atomic_t i = 0],
|
||||
samba_cv_sig_atomic_t=yes,samba_cv_sig_atomic_t=no)])
|
||||
if test x"$samba_cv_sig_atomic_t" = x"yes"; then
|
||||
libreplace_cv_sig_atomic_t=yes,libreplace_cv_sig_atomic_t=no)])
|
||||
if test x"$libreplace_cv_sig_atomic_t" = x"yes"; then
|
||||
AC_DEFINE(HAVE_SIG_ATOMIC_T_TYPE,1,[Whether we have the atomic_t variable type])
|
||||
fi
|
||||
|
||||
|
||||
AC_CACHE_CHECK([for O_DIRECT flag to open(2)],samba_cv_HAVE_OPEN_O_DIRECT,[
|
||||
AC_CACHE_CHECK([for O_DIRECT flag to open(2)],libreplace_cv_HAVE_OPEN_O_DIRECT,[
|
||||
AC_TRY_COMPILE([
|
||||
#include <unistd.h>
|
||||
#ifdef HAVE_FCNTL_H
|
||||
#include <fcntl.h>
|
||||
#endif],
|
||||
[int fd = open("/dev/null", O_DIRECT);],
|
||||
samba_cv_HAVE_OPEN_O_DIRECT=yes,samba_cv_HAVE_OPEN_O_DIRECT=no)])
|
||||
if test x"$samba_cv_HAVE_OPEN_O_DIRECT" = x"yes"; then
|
||||
libreplace_cv_HAVE_OPEN_O_DIRECT=yes,libreplace_cv_HAVE_OPEN_O_DIRECT=no)])
|
||||
if test x"$libreplace_cv_HAVE_OPEN_O_DIRECT" = x"yes"; then
|
||||
AC_DEFINE(HAVE_OPEN_O_DIRECT,1,[Whether the open(2) accepts O_DIRECT])
|
||||
fi
|
||||
|
||||
|
||||
dnl Check if the C compiler understands volatile (it should, being ANSI).
|
||||
AC_CACHE_CHECK([that the C compiler understands volatile],samba_cv_volatile, [
|
||||
AC_CACHE_CHECK([that the C compiler understands volatile],libreplace_cv_volatile, [
|
||||
AC_TRY_COMPILE([#include <sys/types.h>],[volatile int i = 0],
|
||||
samba_cv_volatile=yes,samba_cv_volatile=no)])
|
||||
if test x"$samba_cv_volatile" = x"yes"; then
|
||||
libreplace_cv_volatile=yes,libreplace_cv_volatile=no)])
|
||||
if test x"$libreplace_cv_volatile" = x"yes"; then
|
||||
AC_DEFINE(HAVE_VOLATILE, 1, [Whether the C compiler understands volatile])
|
||||
fi
|
||||
|
||||
@ -343,13 +304,39 @@ m4_include(getpass.m4)
|
||||
m4_include(strptime.m4)
|
||||
m4_include(win32.m4)
|
||||
m4_include(timegm.m4)
|
||||
m4_include(inet_ntop.m4)
|
||||
m4_include(inet_pton.m4)
|
||||
m4_include(getaddrinfo.m4)
|
||||
m4_include(repdir.m4)
|
||||
m4_include(getifaddrs.m4)
|
||||
m4_include(crypt.m4)
|
||||
|
||||
AC_CHECK_FUNCS([syslog printf memset memcpy],,[AC_MSG_ERROR([Required function not found])])
|
||||
if test x$libreplace_cv_have_clock_gettime = xyes ; then
|
||||
SMB_CHECK_CLOCK_ID(CLOCK_MONOTONIC)
|
||||
SMB_CHECK_CLOCK_ID(CLOCK_PROCESS_CPUTIME_ID)
|
||||
SMB_CHECK_CLOCK_ID(CLOCK_REALTIME)
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for struct timespec type],libreplace_cv_struct_timespec, [
|
||||
AC_TRY_COMPILE([
|
||||
#include <sys/types.h>
|
||||
#if STDC_HEADERS
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#endif
|
||||
#if TIME_WITH_SYS_TIME
|
||||
# include <sys/time.h>
|
||||
# include <time.h>
|
||||
#else
|
||||
# if HAVE_SYS_TIME_H
|
||||
# include <sys/time.h>
|
||||
# else
|
||||
# include <time.h>
|
||||
# endif
|
||||
#endif
|
||||
],[struct timespec ts;],
|
||||
libreplace_cv_struct_timespec=yes,libreplace_cv_struct_timespec=no)])
|
||||
if test x"$libreplace_cv_struct_timespec" = x"yes"; then
|
||||
AC_DEFINE(HAVE_STRUCT_TIMESPEC,1,[Whether we have struct timespec])
|
||||
fi
|
||||
|
||||
AC_CHECK_FUNCS([printf memset memcpy],,[AC_MSG_ERROR([Required function not found])])
|
||||
|
||||
echo "LIBREPLACE_BROKEN_CHECKS: END"
|
||||
]) dnl end AC_LIBREPLACE_BROKEN_CHECKS
|
||||
@ -374,5 +361,38 @@ CFLAGS="$CFLAGS -I$libreplacedir"
|
||||
|
||||
m4_include(libreplace_cc.m4)
|
||||
m4_include(libreplace_ld.m4)
|
||||
m4_include(libreplace_network.m4)
|
||||
m4_include(libreplace_macros.m4)
|
||||
m4_include(autoconf-2.60.m4)
|
||||
|
||||
|
||||
dnl SMB_CHECK_CLOCK_ID(clockid)
|
||||
dnl Test whether the specified clock_gettime clock ID is available. If it
|
||||
dnl is, we define HAVE_clockid
|
||||
AC_DEFUN([SMB_CHECK_CLOCK_ID],
|
||||
[
|
||||
AC_MSG_CHECKING(for $1)
|
||||
AC_TRY_LINK([
|
||||
#if TIME_WITH_SYS_TIME
|
||||
# include <sys/time.h>
|
||||
# include <time.h>
|
||||
#else
|
||||
# if HAVE_SYS_TIME_H
|
||||
# include <sys/time.h>
|
||||
# else
|
||||
# include <time.h>
|
||||
# endif
|
||||
#endif
|
||||
],
|
||||
[
|
||||
clockid_t clk = $1;
|
||||
],
|
||||
[
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_$1, 1,
|
||||
[Whether the clock_gettime clock ID $1 is available])
|
||||
],
|
||||
[
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
])
|
||||
m4_ifndef([AC_USE_SYSTEM_EXTENSIONS],[m4_include(autoconf-2.60.m4)])
|
||||
|
@ -109,31 +109,38 @@ AC_CHECK_HEADERS([standards.h])
|
||||
# Solaris needs HAVE_LONG_LONG defined
|
||||
AC_CHECK_TYPES(long long)
|
||||
|
||||
AC_CHECK_TYPE(uint_t, unsigned int)
|
||||
AC_CHECK_TYPE(int8_t, char)
|
||||
AC_CHECK_TYPE(uint8_t, unsigned char)
|
||||
AC_CHECK_TYPE(int16_t, short)
|
||||
AC_CHECK_TYPE(uint16_t, unsigned short)
|
||||
AC_CHECK_TYPE(int32_t, long)
|
||||
AC_CHECK_TYPE(uint32_t, unsigned long)
|
||||
AC_CHECK_TYPE(int64_t, long long)
|
||||
AC_CHECK_TYPE(uint64_t, unsigned long long)
|
||||
|
||||
AC_CHECK_TYPE(size_t, unsigned int)
|
||||
AC_CHECK_TYPE(ssize_t, int)
|
||||
|
||||
AC_CHECK_SIZEOF(int)
|
||||
AC_CHECK_SIZEOF(char)
|
||||
AC_CHECK_SIZEOF(short)
|
||||
AC_CHECK_SIZEOF(long)
|
||||
AC_CHECK_SIZEOF(long long)
|
||||
|
||||
AC_CHECK_TYPE(int8_t, char)
|
||||
AC_CHECK_TYPE(uint8_t, unsigned char)
|
||||
AC_CHECK_TYPE(int16_t, short)
|
||||
AC_CHECK_TYPE(uint16_t, unsigned short)
|
||||
|
||||
if test $ac_cv_sizeof_int -eq 4 ; then
|
||||
AC_CHECK_TYPE(int32_t, int)
|
||||
AC_CHECK_TYPE(uint32_t, unsigned int)
|
||||
elif test $ac_cv_size_long -eq 4 ; then
|
||||
AC_CHECK_TYPE(int32_t, long)
|
||||
AC_CHECK_TYPE(uint32_t, unsigned long)
|
||||
else
|
||||
AC_MSG_ERROR([LIBREPLACE no 32-bit type found])
|
||||
fi
|
||||
|
||||
AC_CHECK_TYPE(int64_t, long long)
|
||||
AC_CHECK_TYPE(uint64_t, unsigned long long)
|
||||
|
||||
AC_CHECK_TYPE(size_t, unsigned int)
|
||||
AC_CHECK_TYPE(ssize_t, int)
|
||||
|
||||
AC_CHECK_SIZEOF(off_t)
|
||||
AC_CHECK_SIZEOF(size_t)
|
||||
AC_CHECK_SIZEOF(ssize_t)
|
||||
|
||||
AC_CHECK_TYPE(intptr_t, unsigned long long)
|
||||
AC_CHECK_TYPE(ptrdiff_t, unsigned long long)
|
||||
AC_CHECK_TYPES([intptr_t, uintptr_t, ptrdiff_t])
|
||||
|
||||
if test x"$ac_cv_type_long_long" != x"yes";then
|
||||
AC_MSG_ERROR([LIBREPLACE needs type 'long long'])
|
||||
@ -157,7 +164,8 @@ AC_CACHE_CHECK([for immediate structures],libreplace_cv_immediate_structures,[
|
||||
FOOBAR y;
|
||||
} f2[] = {
|
||||
{FOO_ONE}
|
||||
};
|
||||
};
|
||||
static const FOOBAR f3[] = {FOO_ONE};
|
||||
],
|
||||
libreplace_cv_immediate_structures=yes,
|
||||
libreplace_cv_immediate_structures=no,
|
||||
|
@ -40,7 +40,7 @@ LDFLAGS="$saved_LDFLAGS"
|
||||
AC_DEFUN([AC_LD_PICFLAG],
|
||||
[
|
||||
case "$host_os" in
|
||||
*linux*)
|
||||
*linux*|*gnu*)
|
||||
PICFLAG="-fPIC"
|
||||
;;
|
||||
*solaris*)
|
||||
@ -71,13 +71,12 @@ case "$host_os" in
|
||||
PICFLAG="-O2"
|
||||
;;
|
||||
*hpux*)
|
||||
if test $ac_cv_prog_cc_Ae = yes; then
|
||||
PICFLAG="+z +ESnolit"
|
||||
elif test "${GCC}" = "yes"; then
|
||||
if test "${GCC}" = "yes"; then
|
||||
PICFLAG="-fPIC"
|
||||
fi
|
||||
if test "$host_cpu" = "ia64"; then
|
||||
PICFLAG="+z"
|
||||
elif test "$host_cpu" = "ia64"; then
|
||||
PICFLAG="+z"
|
||||
elif test $ac_cv_prog_cc_Ae = yes; then
|
||||
PICFLAG="+z +ESnolit"
|
||||
fi
|
||||
;;
|
||||
*osf*)
|
||||
@ -111,7 +110,7 @@ AC_DEFUN([AC_LIBREPLACE_LD_SHLIB_FLAGS],
|
||||
LD_SHLIB_FLAGS="-shared"
|
||||
|
||||
case "$host_os" in
|
||||
*linux*)
|
||||
*linux*|*gnu*)
|
||||
LD_SHLIB_FLAGS="-shared -Wl,-Bsymbolic"
|
||||
;;
|
||||
*solaris*)
|
||||
@ -209,7 +208,7 @@ AC_DEFUN([AC_LD_SONAMEFLAG],
|
||||
AC_SUBST(SONAMEFLAG)
|
||||
SONAMEFLAG=""
|
||||
case "$host_os" in
|
||||
*linux*)
|
||||
*linux*|*gnu*|*qnx*)
|
||||
SONAMEFLAG="-Wl,-soname="
|
||||
;;
|
||||
*solaris*)
|
||||
@ -249,6 +248,22 @@ AC_DEFUN([AC_LD_SONAMEFLAG],
|
||||
esac
|
||||
])
|
||||
|
||||
AC_DEFUN([AC_LD_VERSIONSCRIPT],
|
||||
[
|
||||
AC_SUBST(VERSIONSCRIPT)
|
||||
VERSIONSCRIPT=""
|
||||
case "$host_os" in
|
||||
*linux*|*gnu*)
|
||||
VERSIONSCRIPT="-Wl,--version-script"
|
||||
;;
|
||||
*solaris*)
|
||||
if test "${GCC}" = "yes"; then
|
||||
VERSIONSCRIPT="-Wl,--version-script"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
])
|
||||
|
||||
AC_DEFUN([AC_LIBREPLACE_MDLD],
|
||||
[
|
||||
AC_REQUIRE([AC_LIBREPLACE_LD_SHLIB_LINKER])
|
||||
@ -261,15 +276,18 @@ AC_DEFUN([AC_LIBREPLACE_LD_SHLIB_ALLOW_UNDEF_FLAG],
|
||||
LD_ALLOW_SHLIB_UNDEF_FLAG=""
|
||||
|
||||
case "$host_os" in
|
||||
*linux*)
|
||||
*linux*|*gnu*)
|
||||
LD_SHLIB_ALLOW_UNDEF_FLAG="-Wl,--allow-shlib-undefined"
|
||||
;;
|
||||
*osf*)
|
||||
LD_SHLIB_ALLOW_UNDEF_FLAG="-expect_unresolved '*'"
|
||||
LD_SHLIB_ALLOW_UNDEF_FLAG="-Wl,-expect_unresolved,\"*\""
|
||||
;;
|
||||
*darwin*)
|
||||
LD_SHLIB_ALLOW_UNDEF_FLAG="-undefined dynamic_lookup"
|
||||
;;
|
||||
*aix*)
|
||||
LD_SHLIB_ALLOW_UNDEF_FLAG="-Wl,-bnoentry"
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST(LD_SHLIB_ALLOW_UNDEF_FLAG)
|
||||
@ -286,7 +304,10 @@ AC_DEFUN([AC_LIBREPLACE_MDLD_FLAGS],
|
||||
AC_DEFUN([AC_LIBREPLACE_RUNTIME_LIB_PATH_VAR],
|
||||
[
|
||||
case "$host_os" in
|
||||
*linux*)
|
||||
*linux*|*gnu*)
|
||||
LIB_PATH_VAR=LD_LIBRARY_PATH
|
||||
;;
|
||||
*bsd*)
|
||||
LIB_PATH_VAR=LD_LIBRARY_PATH
|
||||
;;
|
||||
*solaris*)
|
||||
@ -299,7 +320,7 @@ AC_DEFUN([AC_LIBREPLACE_RUNTIME_LIB_PATH_VAR],
|
||||
LIB_PATH_VAR=LD_LIBRARY_PATH
|
||||
;;
|
||||
*aix*)
|
||||
LIB_PATH_VAR=LIB_PATH
|
||||
LIB_PATH_VAR=LIBPATH
|
||||
;;
|
||||
*irix*)
|
||||
LIB_PATH_VAR=LD_LIBRARY_PATH
|
||||
@ -307,6 +328,9 @@ AC_DEFUN([AC_LIBREPLACE_RUNTIME_LIB_PATH_VAR],
|
||||
*darwin*)
|
||||
LIB_PATH_VAR=DYLD_LIBRARY_PATH
|
||||
;;
|
||||
*)
|
||||
LIB_PATH_VAR=LD_LIBRARY_PATH
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST(LIB_PATH_VAR)
|
||||
|
@ -293,12 +293,12 @@ AC_DEFUN(AC_VERIFY_C_PROTOTYPE,
|
||||
$2
|
||||
}
|
||||
])],[
|
||||
AS_TR_SH([ac_cv_c_prototype_$1])=yes
|
||||
eval AS_TR_SH([ac_cv_c_prototype_$1])=yes
|
||||
],[
|
||||
AS_TR_SH([ac_cv_c_prototype_$1])=no
|
||||
eval AS_TR_SH([ac_cv_c_prototype_$1])=no
|
||||
])
|
||||
)
|
||||
AS_IF([test $AS_TR_SH([ac_cv_c_prototype_$1]) = yes],[$3],[$4])
|
||||
AS_IF([eval test $AS_TR_SH([ac_cv_c_prototype_$1]) = yes],[$3],[$4])
|
||||
])
|
||||
|
||||
AC_DEFUN(LIBREPLACE_PROVIDE_HEADER,
|
||||
|
479
ctdb/lib/replace/libreplace_network.m4
Normal file
479
ctdb/lib/replace/libreplace_network.m4
Normal file
@ -0,0 +1,479 @@
|
||||
AC_DEFUN_ONCE(AC_LIBREPLACE_NETWORK_CHECKS,
|
||||
[
|
||||
echo "LIBREPLACE_NETWORK_CHECKS: START"
|
||||
|
||||
AC_DEFINE(LIBREPLACE_NETWORK_CHECKS, 1, [LIBREPLACE_NETWORK_CHECKS were used])
|
||||
LIBREPLACE_NETWORK_OBJS=""
|
||||
LIBREPLACE_NETWORK_LIBS=""
|
||||
|
||||
AC_CHECK_HEADERS(sys/socket.h netinet/in.h netdb.h arpa/inet.h)
|
||||
AC_CHECK_HEADERS(netinet/in_systm.h)
|
||||
AC_CHECK_HEADERS([netinet/ip.h], [], [],[
|
||||
#include <sys/types.h>
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_SYSTM_H
|
||||
#include <netinet/in_systm.h>
|
||||
#endif
|
||||
])
|
||||
AC_CHECK_HEADERS(netinet/tcp.h netinet/in_ip.h)
|
||||
AC_CHECK_HEADERS(sys/sockio.h sys/un.h)
|
||||
AC_CHECK_HEADERS(sys/uio.h)
|
||||
|
||||
dnl we need to check that net/if.h really can be used, to cope with hpux
|
||||
dnl where including it always fails
|
||||
AC_CACHE_CHECK([for usable net/if.h],libreplace_cv_USABLE_NET_IF_H,[
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
|
||||
AC_INCLUDES_DEFAULT
|
||||
#if HAVE_SYS_SOCKET_H
|
||||
# include <sys/socket.h>
|
||||
#endif
|
||||
#include <net/if.h>
|
||||
int main(void) {return 0;}])],
|
||||
[libreplace_cv_USABLE_NET_IF_H=yes],
|
||||
[libreplace_cv_USABLE_NET_IF_H=no]
|
||||
)
|
||||
])
|
||||
if test x"$libreplace_cv_USABLE_NET_IF_H" = x"yes";then
|
||||
AC_DEFINE(HAVE_NET_IF_H, 1, usability of net/if.h)
|
||||
fi
|
||||
|
||||
AC_HAVE_TYPE([socklen_t],[#include <sys/socket.h>])
|
||||
AC_HAVE_TYPE([sa_family_t],[#include <sys/socket.h>])
|
||||
AC_HAVE_TYPE([struct addrinfo], [#include <netdb.h>])
|
||||
AC_HAVE_TYPE([struct sockaddr], [#include <sys/socket.h>])
|
||||
AC_HAVE_TYPE([struct sockaddr_storage], [
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
])
|
||||
AC_HAVE_TYPE([struct sockaddr_in6], [
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
])
|
||||
|
||||
if test x"$ac_cv_type_struct_sockaddr_storage" = x"yes"; then
|
||||
AC_CHECK_MEMBER(struct sockaddr_storage.ss_family,
|
||||
AC_DEFINE(HAVE_SS_FAMILY, 1, [Defined if struct sockaddr_storage has ss_family field]),,
|
||||
[
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
])
|
||||
|
||||
if test x"$ac_cv_member_struct_sockaddr_storage_ss_family" != x"yes"; then
|
||||
AC_CHECK_MEMBER(struct sockaddr_storage.__ss_family,
|
||||
AC_DEFINE(HAVE___SS_FAMILY, 1, [Defined if struct sockaddr_storage has __ss_family field]),,
|
||||
[
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
])
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for sin_len in sock],libreplace_cv_HAVE_SOCK_SIN_LEN,[
|
||||
AC_TRY_COMPILE(
|
||||
[
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
],[
|
||||
struct sockaddr_in sock; sock.sin_len = sizeof(sock);
|
||||
],[
|
||||
libreplace_cv_HAVE_SOCK_SIN_LEN=yes
|
||||
],[
|
||||
libreplace_cv_HAVE_SOCK_SIN_LEN=no
|
||||
])
|
||||
])
|
||||
if test x"$libreplace_cv_HAVE_SOCK_SIN_LEN" = x"yes"; then
|
||||
AC_DEFINE(HAVE_SOCK_SIN_LEN,1,[Whether the sockaddr_in struct has a sin_len property])
|
||||
fi
|
||||
|
||||
############################################
|
||||
# check for unix domain sockets
|
||||
AC_CACHE_CHECK([for unix domain sockets],libreplace_cv_HAVE_UNIXSOCKET,[
|
||||
AC_TRY_COMPILE([
|
||||
#include <sys/types.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
],[
|
||||
struct sockaddr_un sunaddr;
|
||||
sunaddr.sun_family = AF_UNIX;
|
||||
],[
|
||||
libreplace_cv_HAVE_UNIXSOCKET=yes
|
||||
],[
|
||||
libreplace_cv_HAVE_UNIXSOCKET=no
|
||||
])
|
||||
])
|
||||
if test x"$libreplace_cv_HAVE_UNIXSOCKET" = x"yes"; then
|
||||
AC_DEFINE(HAVE_UNIXSOCKET,1,[If we need to build with unixscoket support])
|
||||
fi
|
||||
|
||||
dnl The following test is roughly taken from the cvs sources.
|
||||
dnl
|
||||
dnl If we can't find connect, try looking in -lsocket, -lnsl, and -linet.
|
||||
dnl The Irix 5 libc.so has connect and gethostbyname, but Irix 5 also has
|
||||
dnl libsocket.so which has a bad implementation of gethostbyname (it
|
||||
dnl only looks in /etc/hosts), so we only look for -lsocket if we need
|
||||
dnl it.
|
||||
AC_CHECK_FUNCS(connect)
|
||||
if test x"$ac_cv_func_connect" = x"no"; then
|
||||
AC_CHECK_LIB_EXT(nsl_s, LIBREPLACE_NETWORK_LIBS, connect)
|
||||
AC_CHECK_LIB_EXT(nsl, LIBREPLACE_NETWORK_LIBS, connect)
|
||||
AC_CHECK_LIB_EXT(socket, LIBREPLACE_NETWORK_LIBS, connect)
|
||||
AC_CHECK_LIB_EXT(inet, LIBREPLACE_NETWORK_LIBS, connect)
|
||||
dnl We can't just call AC_CHECK_FUNCS(connect) here,
|
||||
dnl because the value has been cached.
|
||||
if test x"$ac_cv_lib_ext_nsl_s_connect" = x"yes" ||
|
||||
test x"$ac_cv_lib_ext_nsl_connect" = x"yes" ||
|
||||
test x"$ac_cv_lib_ext_socket_connect" = x"yes" ||
|
||||
test x"$ac_cv_lib_ext_inet_connect" = x"yes"
|
||||
then
|
||||
AC_DEFINE(HAVE_CONNECT,1,[Whether the system has connect()])
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_CHECK_FUNCS(gethostbyname)
|
||||
if test x"$ac_cv_func_gethostbyname" = x"no"; then
|
||||
AC_CHECK_LIB_EXT(nsl_s, LIBREPLACE_NETWORK_LIBS, gethostbyname)
|
||||
AC_CHECK_LIB_EXT(nsl, LIBREPLACE_NETWORK_LIBS, gethostbyname)
|
||||
AC_CHECK_LIB_EXT(socket, LIBREPLACE_NETWORK_LIBS, gethostbyname)
|
||||
dnl We can't just call AC_CHECK_FUNCS(gethostbyname) here,
|
||||
dnl because the value has been cached.
|
||||
if test x"$ac_cv_lib_ext_nsl_s_gethostbyname" = x"yes" ||
|
||||
test x"$ac_cv_lib_ext_nsl_gethostbyname" = x"yes" ||
|
||||
test x"$ac_cv_lib_ext_socket_gethostbyname" = x"yes"
|
||||
then
|
||||
AC_DEFINE(HAVE_GETHOSTBYNAME,1,
|
||||
[Whether the system has gethostbyname()])
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl HP-UX has if_nametoindex in -lipv6
|
||||
AC_CHECK_FUNCS(if_nametoindex)
|
||||
if test x"$ac_cv_func_if_nametoindex" = x"no"; then
|
||||
AC_CHECK_LIB_EXT(ipv6, LIBREPLACE_NETWORK_LIBS, if_nametoindex)
|
||||
dnl We can't just call AC_CHECK_FUNCS(if_nametoindex) here,
|
||||
dnl because the value has been cached.
|
||||
if test x"$ac_cv_lib_ext_ipv6_if_nametoindex" = x"yes"
|
||||
then
|
||||
AC_DEFINE(HAVE_IF_NAMETOINDEX, 1,
|
||||
[Whether the system has if_nametoindex()])
|
||||
fi
|
||||
fi
|
||||
|
||||
# The following tests need LIBS="${LIBREPLACE_NETWORK_LIBS}"
|
||||
old_LIBS=$LIBS
|
||||
LIBS="${LIBREPLACE_NETWORK_LIBS}"
|
||||
libreplace_SAVE_CPPFLAGS="$CPPFLAGS"
|
||||
CPPFLAGS="$CPPFLAGS -I$libreplacedir"
|
||||
|
||||
AC_CHECK_FUNCS(socketpair,[],[LIBREPLACE_NETWORK_OBJS="${LIBREPLACE_NETWORK_OBJS} $libreplacedir/socketpair.o"])
|
||||
|
||||
AC_CACHE_CHECK([for broken inet_ntoa],libreplace_cv_REPLACE_INET_NTOA,[
|
||||
AC_TRY_RUN([
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
main() { struct in_addr ip; ip.s_addr = 0x12345678;
|
||||
if (strcmp(inet_ntoa(ip),"18.52.86.120") &&
|
||||
strcmp(inet_ntoa(ip),"120.86.52.18")) { exit(0); }
|
||||
exit(1);}],
|
||||
libreplace_cv_REPLACE_INET_NTOA=yes,libreplace_cv_REPLACE_INET_NTOA=no,libreplace_cv_REPLACE_INET_NTOA=cross)])
|
||||
|
||||
AC_CHECK_FUNCS(inet_ntoa,[],[libreplace_cv_REPLACE_INET_NTOA=yes])
|
||||
if test x"$libreplace_cv_REPLACE_INET_NTOA" = x"yes"; then
|
||||
AC_DEFINE(REPLACE_INET_NTOA,1,[Whether inet_ntoa should be replaced])
|
||||
LIBREPLACE_NETWORK_OBJS="${LIBREPLACE_NETWORK_OBJS} $libreplacedir/inet_ntoa.o"
|
||||
fi
|
||||
|
||||
AC_CHECK_FUNCS(inet_aton,[],[LIBREPLACE_NETWORK_OBJS="${LIBREPLACE_NETWORK_OBJS} $libreplacedir/inet_aton.o"])
|
||||
|
||||
AC_CHECK_FUNCS(inet_ntop,[],[LIBREPLACE_NETWORK_OBJS="${LIBREPLACE_NETWORK_OBJS} $libreplacedir/inet_ntop.o"])
|
||||
|
||||
AC_CHECK_FUNCS(inet_pton,[],[LIBREPLACE_NETWORK_OBJS="${LIBREPLACE_NETWORK_OBJS} $libreplacedir/inet_pton.o"])
|
||||
|
||||
dnl test for getaddrinfo/getnameinfo
|
||||
AC_CACHE_CHECK([for getaddrinfo],libreplace_cv_HAVE_GETADDRINFO,[
|
||||
AC_TRY_LINK([
|
||||
#include <sys/types.h>
|
||||
#if STDC_HEADERS
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#endif
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>],
|
||||
[
|
||||
struct sockaddr sa;
|
||||
struct addrinfo *ai = NULL;
|
||||
int ret = getaddrinfo(NULL, NULL, NULL, &ai);
|
||||
if (ret != 0) {
|
||||
const char *es = gai_strerror(ret);
|
||||
}
|
||||
freeaddrinfo(ai);
|
||||
ret = getnameinfo(&sa, sizeof(sa),
|
||||
NULL, 0,
|
||||
NULL, 0, 0);
|
||||
|
||||
],
|
||||
libreplace_cv_HAVE_GETADDRINFO=yes,libreplace_cv_HAVE_GETADDRINFO=no)])
|
||||
|
||||
if test x"$libreplace_cv_HAVE_GETADDRINFO" = x"yes"; then
|
||||
# getaddrinfo is broken on some AIX systems
|
||||
# see bug 5910, use our replacements if we detect
|
||||
# a broken system.
|
||||
AC_TRY_RUN([
|
||||
#include <stddef.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>
|
||||
int main(int argc, const char *argv[])
|
||||
{
|
||||
struct addrinfo hints = {0,};
|
||||
struct addrinfo *ppres;
|
||||
const char hostname1[] = "0.0.0.0";
|
||||
const char hostname2[] = "127.0.0.1";
|
||||
const char hostname3[] = "::";
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
hints.ai_flags =
|
||||
AI_NUMERICHOST|AI_PASSIVE|AI_ADDRCONFIG;
|
||||
/* Test for broken flag combination on AIX. */
|
||||
if (getaddrinfo(hostname1, NULL, &hints, &ppres) == EAI_BADFLAGS) {
|
||||
/* This fails on an IPv6-only box, but not with
|
||||
the EAI_BADFLAGS error. */
|
||||
return 1;
|
||||
}
|
||||
if (getaddrinfo(hostname2, NULL, &hints, &ppres) == 0) {
|
||||
/* IPv4 lookup works - good enough. */
|
||||
return 0;
|
||||
}
|
||||
/* Uh-oh, no IPv4. Are we IPv6-only ? */
|
||||
return getaddrinfo(hostname3, NULL, &hints, &ppres) != 0 ? 1 : 0;
|
||||
}],
|
||||
libreplace_cv_HAVE_GETADDRINFO=yes,
|
||||
libreplace_cv_HAVE_GETADDRINFO=no)
|
||||
fi
|
||||
|
||||
if test x"$libreplace_cv_HAVE_GETADDRINFO" = x"yes"; then
|
||||
AC_DEFINE(HAVE_GETADDRINFO,1,[Whether the system has getaddrinfo])
|
||||
AC_DEFINE(HAVE_GETNAMEINFO,1,[Whether the system has getnameinfo])
|
||||
AC_DEFINE(HAVE_FREEADDRINFO,1,[Whether the system has freeaddrinfo])
|
||||
AC_DEFINE(HAVE_GAI_STRERROR,1,[Whether the system has gai_strerror])
|
||||
else
|
||||
LIBREPLACE_NETWORK_OBJS="${LIBREPLACE_NETWORK_OBJS} $libreplacedir/getaddrinfo.o"
|
||||
fi
|
||||
|
||||
AC_CHECK_HEADERS([ifaddrs.h])
|
||||
|
||||
dnl Used when getifaddrs is not available
|
||||
AC_CHECK_MEMBERS([struct sockaddr.sa_len],
|
||||
[AC_DEFINE(HAVE_SOCKADDR_SA_LEN, 1, [Whether struct sockaddr has a sa_len member])],
|
||||
[],
|
||||
[#include <sys/socket.h>])
|
||||
|
||||
dnl test for getifaddrs and freeifaddrs
|
||||
AC_CACHE_CHECK([for getifaddrs and freeifaddrs],libreplace_cv_HAVE_GETIFADDRS,[
|
||||
AC_TRY_LINK([
|
||||
#include <sys/types.h>
|
||||
#if STDC_HEADERS
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#endif
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <ifaddrs.h>
|
||||
#include <netdb.h>],
|
||||
[
|
||||
struct ifaddrs *ifp = NULL;
|
||||
int ret = getifaddrs (&ifp);
|
||||
freeifaddrs(ifp);
|
||||
],
|
||||
libreplace_cv_HAVE_GETIFADDRS=yes,libreplace_cv_HAVE_GETIFADDRS=no)])
|
||||
if test x"$libreplace_cv_HAVE_GETIFADDRS" = x"yes"; then
|
||||
AC_DEFINE(HAVE_GETIFADDRS,1,[Whether the system has getifaddrs])
|
||||
AC_DEFINE(HAVE_FREEIFADDRS,1,[Whether the system has freeifaddrs])
|
||||
AC_DEFINE(HAVE_STRUCT_IFADDRS,1,[Whether struct ifaddrs is available])
|
||||
fi
|
||||
|
||||
##################
|
||||
# look for a method of finding the list of network interfaces
|
||||
iface=no;
|
||||
AC_CACHE_CHECK([for iface getifaddrs],libreplace_cv_HAVE_IFACE_GETIFADDRS,[
|
||||
AC_TRY_RUN([
|
||||
#define HAVE_IFACE_GETIFADDRS 1
|
||||
#define NO_CONFIG_H 1
|
||||
#define AUTOCONF_TEST 1
|
||||
#define SOCKET_WRAPPER_NOT_REPLACE
|
||||
#include "$libreplacedir/replace.c"
|
||||
#include "$libreplacedir/inet_ntop.c"
|
||||
#include "$libreplacedir/snprintf.c"
|
||||
#include "$libreplacedir/getifaddrs.c"
|
||||
#define getifaddrs_test main
|
||||
#include "$libreplacedir/test/getifaddrs.c"],
|
||||
libreplace_cv_HAVE_IFACE_GETIFADDRS=yes,libreplace_cv_HAVE_IFACE_GETIFADDRS=no,libreplace_cv_HAVE_IFACE_GETIFADDRS=cross)])
|
||||
if test x"$libreplace_cv_HAVE_IFACE_GETIFADDRS" = x"yes"; then
|
||||
iface=yes;AC_DEFINE(HAVE_IFACE_GETIFADDRS,1,[Whether iface getifaddrs is available])
|
||||
else
|
||||
LIBREPLACE_NETWORK_OBJS="${LIBREPLACE_NETWORK_OBJS} $libreplacedir/getifaddrs.o"
|
||||
fi
|
||||
|
||||
|
||||
if test $iface = no; then
|
||||
AC_CACHE_CHECK([for iface AIX],libreplace_cv_HAVE_IFACE_AIX,[
|
||||
AC_TRY_RUN([
|
||||
#define HAVE_IFACE_AIX 1
|
||||
#define NO_CONFIG_H 1
|
||||
#define AUTOCONF_TEST 1
|
||||
#undef _XOPEN_SOURCE_EXTENDED
|
||||
#define SOCKET_WRAPPER_NOT_REPLACE
|
||||
#include "$libreplacedir/replace.c"
|
||||
#include "$libreplacedir/inet_ntop.c"
|
||||
#include "$libreplacedir/snprintf.c"
|
||||
#include "$libreplacedir/getifaddrs.c"
|
||||
#define getifaddrs_test main
|
||||
#include "$libreplacedir/test/getifaddrs.c"],
|
||||
libreplace_cv_HAVE_IFACE_AIX=yes,libreplace_cv_HAVE_IFACE_AIX=no,libreplace_cv_HAVE_IFACE_AIX=cross)])
|
||||
if test x"$libreplace_cv_HAVE_IFACE_AIX" = x"yes"; then
|
||||
iface=yes;AC_DEFINE(HAVE_IFACE_AIX,1,[Whether iface AIX is available])
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
if test $iface = no; then
|
||||
AC_CACHE_CHECK([for iface ifconf],libreplace_cv_HAVE_IFACE_IFCONF,[
|
||||
AC_TRY_RUN([
|
||||
#define HAVE_IFACE_IFCONF 1
|
||||
#define NO_CONFIG_H 1
|
||||
#define AUTOCONF_TEST 1
|
||||
#define SOCKET_WRAPPER_NOT_REPLACE
|
||||
#include "$libreplacedir/replace.c"
|
||||
#include "$libreplacedir/inet_ntop.c"
|
||||
#include "$libreplacedir/snprintf.c"
|
||||
#include "$libreplacedir/getifaddrs.c"
|
||||
#define getifaddrs_test main
|
||||
#include "$libreplacedir/test/getifaddrs.c"],
|
||||
libreplace_cv_HAVE_IFACE_IFCONF=yes,libreplace_cv_HAVE_IFACE_IFCONF=no,libreplace_cv_HAVE_IFACE_IFCONF=cross)])
|
||||
if test x"$libreplace_cv_HAVE_IFACE_IFCONF" = x"yes"; then
|
||||
iface=yes;AC_DEFINE(HAVE_IFACE_IFCONF,1,[Whether iface ifconf is available])
|
||||
fi
|
||||
fi
|
||||
|
||||
if test $iface = no; then
|
||||
AC_CACHE_CHECK([for iface ifreq],libreplace_cv_HAVE_IFACE_IFREQ,[
|
||||
AC_TRY_RUN([
|
||||
#define HAVE_IFACE_IFREQ 1
|
||||
#define NO_CONFIG_H 1
|
||||
#define AUTOCONF_TEST 1
|
||||
#define SOCKET_WRAPPER_NOT_REPLACE
|
||||
#include "$libreplacedir/replace.c"
|
||||
#include "$libreplacedir/inet_ntop.c"
|
||||
#include "$libreplacedir/snprintf.c"
|
||||
#include "$libreplacedir/getifaddrs.c"
|
||||
#define getifaddrs_test main
|
||||
#include "$libreplacedir/test/getifaddrs.c"],
|
||||
libreplace_cv_HAVE_IFACE_IFREQ=yes,libreplace_cv_HAVE_IFACE_IFREQ=no,libreplace_cv_HAVE_IFACE_IFREQ=cross)])
|
||||
if test x"$libreplace_cv_HAVE_IFACE_IFREQ" = x"yes"; then
|
||||
iface=yes;AC_DEFINE(HAVE_IFACE_IFREQ,1,[Whether iface ifreq is available])
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl Some old Linux systems have broken header files and
|
||||
dnl miss the IPV6_V6ONLY define in netinet/in.h,
|
||||
dnl but have it in linux/in6.h.
|
||||
dnl We can't include both files so we just check if the value
|
||||
dnl if defined and do the replacement in system/network.h
|
||||
AC_CACHE_CHECK([for IPV6_V6ONLY support],libreplace_cv_HAVE_IPV6_V6ONLY,[
|
||||
AC_TRY_COMPILE([
|
||||
#include <stdlib.h> /* for NULL */
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <netdb.h>
|
||||
#include <netinet/in.h>
|
||||
],
|
||||
[
|
||||
#ifndef IPV6_V6ONLY
|
||||
#error no IPV6_V6ONLY
|
||||
#endif
|
||||
],[
|
||||
libreplace_cv_HAVE_IPV6_V6ONLY=yes
|
||||
],[
|
||||
libreplace_cv_HAVE_IPV6_V6ONLY=no
|
||||
])
|
||||
])
|
||||
if test x"$libreplace_cv_HAVE_IPV6_V6ONLY" != x"yes"; then
|
||||
dnl test for IPV6_V6ONLY
|
||||
AC_CACHE_CHECK([for IPV6_V6ONLY in linux/in6.h],libreplace_cv_HAVE_LINUX_IPV6_V6ONLY_26,[
|
||||
AC_TRY_COMPILE([
|
||||
#include <linux/in6.h>
|
||||
],
|
||||
[
|
||||
#if (IPV6_V6ONLY != 26)
|
||||
#error no linux IPV6_V6ONLY
|
||||
#endif
|
||||
],[
|
||||
libreplace_cv_HAVE_LINUX_IPV6_V6ONLY_26=yes
|
||||
],[
|
||||
libreplace_cv_HAVE_LINUX_IPV6_V6ONLY_26=no
|
||||
])
|
||||
])
|
||||
if test x"$libreplace_cv_HAVE_LINUX_IPV6_V6ONLY_26" = x"yes"; then
|
||||
AC_DEFINE(HAVE_LINUX_IPV6_V6ONLY_26,1,[Whether the system has IPV6_V6ONLY in linux/in6.h])
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl test for ipv6
|
||||
AC_CACHE_CHECK([for ipv6 support],libreplace_cv_HAVE_IPV6,[
|
||||
AC_TRY_LINK([
|
||||
#include <stdlib.h> /* for NULL */
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <netdb.h>
|
||||
#include <netinet/in.h>
|
||||
],
|
||||
[
|
||||
struct sockaddr_storage sa_store;
|
||||
struct addrinfo *ai = NULL;
|
||||
struct in6_addr in6addr;
|
||||
int idx = if_nametoindex("iface1");
|
||||
int s = socket(AF_INET6, SOCK_STREAM, 0);
|
||||
int ret = getaddrinfo(NULL, NULL, NULL, &ai);
|
||||
if (ret != 0) {
|
||||
const char *es = gai_strerror(ret);
|
||||
}
|
||||
freeaddrinfo(ai);
|
||||
{
|
||||
int val = 1;
|
||||
#ifdef HAVE_LINUX_IPV6_V6ONLY_26
|
||||
#define IPV6_V6ONLY 26
|
||||
#endif
|
||||
ret = setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY,
|
||||
(const void *)&val, sizeof(val));
|
||||
}
|
||||
],[
|
||||
libreplace_cv_HAVE_IPV6=yes
|
||||
],[
|
||||
libreplace_cv_HAVE_IPV6=no
|
||||
])
|
||||
])
|
||||
if test x"$libreplace_cv_HAVE_IPV6" = x"yes"; then
|
||||
AC_DEFINE(HAVE_IPV6,1,[Whether the system has IPv6 support])
|
||||
fi
|
||||
|
||||
LIBS=$old_LIBS
|
||||
CPPFLAGS="$libreplace_SAVE_CPPFLAGS"
|
||||
|
||||
LIBREPLACEOBJ="${LIBREPLACEOBJ} ${LIBREPLACE_NETWORK_OBJS}"
|
||||
|
||||
echo "LIBREPLACE_NETWORK_CHECKS: END"
|
||||
]) dnl end AC_LIBREPLACE_NETWORK_CHECKS
|
133
ctdb/lib/replace/poll.c
Normal file
133
ctdb/lib/replace/poll.c
Normal file
@ -0,0 +1,133 @@
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
poll.c - poll wrapper
|
||||
|
||||
This file is based on code from libssh (LGPLv2.1+ at the time it
|
||||
was downloaded), thus the following copyrights:
|
||||
|
||||
Copyright (c) 2009-2010 by Andreas Schneider <mail@cynapses.org>
|
||||
Copyright (c) 2003-2009 by Aris Adamantiadis
|
||||
Copyright (c) 2009 Aleksandar Kanchev
|
||||
Copyright (C) Volker Lendecke 2011
|
||||
|
||||
** NOTE! The following LGPL license applies to the replace
|
||||
** library. This does NOT imply that all of Samba is released
|
||||
** under the LGPL
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 3 of the License, or (at your option) any later version.
|
||||
|
||||
This library 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "replace.h"
|
||||
#include "system/select.h"
|
||||
|
||||
|
||||
int rep_poll(struct pollfd *fds, nfds_t nfds, int timeout)
|
||||
{
|
||||
fd_set rfds, wfds, efds;
|
||||
struct timeval tv, *ptv;
|
||||
int max_fd;
|
||||
int rc;
|
||||
nfds_t i;
|
||||
|
||||
if (fds == NULL) {
|
||||
errno = EFAULT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
FD_ZERO(&rfds);
|
||||
FD_ZERO(&wfds);
|
||||
FD_ZERO(&efds);
|
||||
|
||||
rc = 0;
|
||||
max_fd = 0;
|
||||
|
||||
/* compute fd_sets and find largest descriptor */
|
||||
for (i = 0; i < nfds; i++) {
|
||||
if ((fds[i].fd < 0) || (fds[i].fd >= FD_SETSIZE)) {
|
||||
fds[i].revents = POLLNVAL;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (fds[i].events & (POLLIN | POLLRDNORM)) {
|
||||
FD_SET(fds[i].fd, &rfds);
|
||||
}
|
||||
if (fds[i].events & (POLLOUT | POLLWRNORM | POLLWRBAND)) {
|
||||
FD_SET(fds[i].fd, &wfds);
|
||||
}
|
||||
if (fds[i].events & (POLLPRI | POLLRDBAND)) {
|
||||
FD_SET(fds[i].fd, &efds);
|
||||
}
|
||||
if (fds[i].fd > max_fd &&
|
||||
(fds[i].events & (POLLIN | POLLOUT | POLLPRI |
|
||||
POLLRDNORM | POLLRDBAND |
|
||||
POLLWRNORM | POLLWRBAND))) {
|
||||
max_fd = fds[i].fd;
|
||||
}
|
||||
}
|
||||
|
||||
if (timeout < 0) {
|
||||
ptv = NULL;
|
||||
} else {
|
||||
ptv = &tv;
|
||||
if (timeout == 0) {
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = 0;
|
||||
} else {
|
||||
tv.tv_sec = timeout / 1000;
|
||||
tv.tv_usec = (timeout % 1000) * 1000;
|
||||
}
|
||||
}
|
||||
|
||||
rc = select(max_fd + 1, &rfds, &wfds, &efds, ptv);
|
||||
if (rc < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (rc = 0, i = 0; i < nfds; i++) {
|
||||
if ((fds[i].fd < 0) || (fds[i].fd >= FD_SETSIZE)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
fds[i].revents = 0;
|
||||
|
||||
if (FD_ISSET(fds[i].fd, &rfds)) {
|
||||
int err = errno;
|
||||
int available = 0;
|
||||
int ret;
|
||||
|
||||
/* support for POLLHUP */
|
||||
ret = ioctl(fds[i].fd, FIONREAD, &available);
|
||||
if ((ret == -1) || (available == 0)) {
|
||||
fds[i].revents |= POLLHUP;
|
||||
} else {
|
||||
fds[i].revents |= fds[i].events
|
||||
& (POLLIN | POLLRDNORM);
|
||||
}
|
||||
|
||||
errno = err;
|
||||
}
|
||||
if (FD_ISSET(fds[i].fd, &wfds)) {
|
||||
fds[i].revents |= fds[i].events
|
||||
& (POLLOUT | POLLWRNORM | POLLWRBAND);
|
||||
}
|
||||
if (FD_ISSET(fds[i].fd, &efds)) {
|
||||
fds[i].revents |= fds[i].events
|
||||
& (POLLPRI | POLLRDBAND);
|
||||
}
|
||||
if (fds[i].revents & ~POLLHUP) {
|
||||
rc++;
|
||||
}
|
||||
}
|
||||
return rc;
|
||||
}
|
@ -7,6 +7,9 @@ AC_CACHE_CHECK([for broken readdir],libreplace_cv_READDIR_NEEDED,[
|
||||
[libreplace_cv_READDIR_NEEDED="assuming not"])
|
||||
])
|
||||
|
||||
AC_CHECK_FUNCS(dirfd)
|
||||
AC_HAVE_DECL(dirfd, [#include <dirent.h>])
|
||||
|
||||
#
|
||||
# try to replace with getdirentries() if needed
|
||||
#
|
||||
@ -42,7 +45,7 @@ fi
|
||||
if test x"$libreplace_cv_READDIR_GETDIRENTRIES" = x"yes"; then
|
||||
AC_DEFINE(REPLACE_READDIR,1,[replace readdir])
|
||||
AC_DEFINE(REPLACE_READDIR_GETDIRENTRIES,1,[replace readdir using getdirentries()])
|
||||
LIBREPLACEOBJ="${LIBREPLACEOBJ} repdir_getdirentries.o"
|
||||
LIBREPLACEOBJ="${LIBREPLACEOBJ} $libreplacedir/repdir_getdirentries.o"
|
||||
libreplace_cv_READDIR_NEEDED=no
|
||||
fi
|
||||
|
||||
@ -65,7 +68,7 @@ fi
|
||||
if test x"$libreplace_cv_READDIR_GETDENTS" = x"yes"; then
|
||||
AC_DEFINE(REPLACE_READDIR,1,[replace readdir])
|
||||
AC_DEFINE(REPLACE_READDIR_GETDENTS,1,[replace readdir using getdents()])
|
||||
LIBREPLACEOBJ="${LIBREPLACEOBJ} repdir_getdents.o"
|
||||
LIBREPLACEOBJ="${LIBREPLACEOBJ} $libreplacedir/repdir_getdents.o"
|
||||
libreplace_cv_READDIR_NEEDED=no
|
||||
fi
|
||||
|
||||
|
13
ctdb/lib/replace/replace-test.h
Normal file
13
ctdb/lib/replace/replace-test.h
Normal file
@ -0,0 +1,13 @@
|
||||
#ifndef __LIB_REPLACE_REPLACE_TEST_H__
|
||||
#define __LIB_REPLACE_REPLACE_TEST_H__
|
||||
|
||||
#include <stdbool.h>
|
||||
struct torture_context;
|
||||
|
||||
bool torture_local_replace(struct torture_context *ctx);
|
||||
int libreplace_test_strptime(void);
|
||||
int test_readdir_os2_delete(void);
|
||||
int getifaddrs_test(void);
|
||||
|
||||
#endif /* __LIB_REPLACE_REPLACE_TEST_H__ */
|
||||
|
@ -2,6 +2,8 @@
|
||||
Unix SMB/CIFS implementation.
|
||||
replacement routines for broken systems
|
||||
Copyright (C) Andrew Tridgell 1992-1998
|
||||
Copyright (C) Jelmer Vernooij 2005-2008
|
||||
Copyright (C) Matthieu Patou 2010
|
||||
|
||||
** NOTE! The following LGPL license applies to the replace
|
||||
** library. This does NOT imply that all of Samba is released
|
||||
@ -27,10 +29,13 @@
|
||||
#include "system/time.h"
|
||||
#include "system/passwd.h"
|
||||
#include "system/syslog.h"
|
||||
#include "system/network.h"
|
||||
#include "system/locale.h"
|
||||
#include "system/wait.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#define mkdir(d,m) _mkdir(d)
|
||||
#endif
|
||||
|
||||
void replace_dummy(void);
|
||||
void replace_dummy(void) {}
|
||||
|
||||
@ -83,6 +88,9 @@ size_t rep_strlcat(char *d, const char *s, size_t bufsize)
|
||||
size_t ret = len1 + len2;
|
||||
|
||||
if (len1+len2 >= bufsize) {
|
||||
if (bufsize < (len1+1)) {
|
||||
return ret;
|
||||
}
|
||||
len2 = bufsize - (len1+1);
|
||||
}
|
||||
if (len2 > 0) {
|
||||
@ -168,7 +176,7 @@ int rep_initgroups(char *name, gid_t id)
|
||||
#include <grp.h>
|
||||
|
||||
gid_t *grouplst = NULL;
|
||||
int max_gr = 32;
|
||||
int max_gr = NGROUPS_MAX;
|
||||
int ret;
|
||||
int i,j;
|
||||
struct group *g;
|
||||
@ -218,7 +226,7 @@ long nap(long milliseconds) {
|
||||
#ifndef HAVE_MEMMOVE
|
||||
/*******************************************************************
|
||||
safely copies memory, ensuring no overlap problems.
|
||||
this is only used if the machine does not have it's own memmove().
|
||||
this is only used if the machine does not have its own memmove().
|
||||
this is not the fastest algorithm in town, but it will do for our
|
||||
needs.
|
||||
********************************************************************/
|
||||
@ -295,20 +303,6 @@ char *rep_strdup(const char *s)
|
||||
}
|
||||
#endif /* HAVE_STRDUP */
|
||||
|
||||
#ifndef WITH_PTHREADS
|
||||
/* REWRITE: not thread safe */
|
||||
#ifdef REPLACE_INET_NTOA
|
||||
char *rep_inet_ntoa(struct in_addr ip)
|
||||
{
|
||||
uint8_t *p = (uint8_t *)&ip.s_addr;
|
||||
static char buf[18];
|
||||
slprintf(buf, 17, "%d.%d.%d.%d",
|
||||
(int)p[0], (int)p[1], (int)p[2], (int)p[3]);
|
||||
return buf;
|
||||
}
|
||||
#endif /* REPLACE_INET_NTOA */
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SETLINEBUF
|
||||
void rep_setlinebuf(FILE *stream)
|
||||
{
|
||||
@ -366,7 +360,7 @@ char *rep_strndup(const char *s, size_t n)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_WAITPID
|
||||
#if !defined(HAVE_WAITPID) && defined(HAVE_WAIT4)
|
||||
int rep_waitpid(pid_t pid,int *status,int options)
|
||||
{
|
||||
return wait4(pid, status, options, NULL);
|
||||
@ -379,7 +373,8 @@ int rep_seteuid(uid_t euid)
|
||||
#ifdef HAVE_SETRESUID
|
||||
return setresuid(-1, euid, -1);
|
||||
#else
|
||||
# error "You need a seteuid function"
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
@ -390,7 +385,8 @@ int rep_setegid(gid_t egid)
|
||||
#ifdef HAVE_SETRESGID
|
||||
return setresgid(-1, egid, -1);
|
||||
#else
|
||||
# error "You need a setegid function"
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
@ -414,7 +410,7 @@ int rep_chroot(const char *dname)
|
||||
int rep_mkstemp(char *template)
|
||||
{
|
||||
/* have a reasonable go at emulating it. Hope that
|
||||
the system mktemp() isn't completly hopeless */
|
||||
the system mktemp() isn't completely hopeless */
|
||||
char *p = mktemp(template);
|
||||
if (!p)
|
||||
return -1;
|
||||
@ -473,7 +469,7 @@ char *rep_strcasestr(const char *haystack, const char *needle)
|
||||
for (s=haystack;*s;s++) {
|
||||
if (toupper(*needle) == toupper(*s) &&
|
||||
strncasecmp(s, needle, nlen) == 0) {
|
||||
return (char *)((intptr_t)s);
|
||||
return (char *)((uintptr_t)s);
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
@ -507,6 +503,7 @@ char *rep_strtok_r(char *s, const char *delim, char **save_ptr)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef HAVE_STRTOLL
|
||||
long long int rep_strtoll(const char *str, char **endptr, int base)
|
||||
{
|
||||
@ -520,7 +517,29 @@ long long int rep_strtoll(const char *str, char **endptr, int base)
|
||||
# error "You need a strtoll function"
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_BSD_STRTOLL
|
||||
#ifdef HAVE_STRTOQ
|
||||
long long int rep_strtoll(const char *str, char **endptr, int base)
|
||||
{
|
||||
long long int nb = strtoq(str, endptr, base);
|
||||
/* In linux EINVAL is only returned if base is not ok */
|
||||
if (errno == EINVAL) {
|
||||
if (base == 0 || (base >1 && base <37)) {
|
||||
/* Base was ok so it's because we were not
|
||||
* able to make the convertion.
|
||||
* Let's reset errno.
|
||||
*/
|
||||
errno = 0;
|
||||
}
|
||||
}
|
||||
return nb;
|
||||
}
|
||||
#else
|
||||
#error "You need the strtoq function"
|
||||
#endif /* HAVE_STRTOQ */
|
||||
#endif /* HAVE_BSD_STRTOLL */
|
||||
#endif /* HAVE_STRTOLL */
|
||||
|
||||
|
||||
#ifndef HAVE_STRTOULL
|
||||
@ -536,7 +555,29 @@ unsigned long long int rep_strtoull(const char *str, char **endptr, int base)
|
||||
# error "You need a strtoull function"
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_BSD_STRTOLL
|
||||
#ifdef HAVE_STRTOUQ
|
||||
unsigned long long int rep_strtoull(const char *str, char **endptr, int base)
|
||||
{
|
||||
unsigned long long int nb = strtouq(str, endptr, base);
|
||||
/* In linux EINVAL is only returned if base is not ok */
|
||||
if (errno == EINVAL) {
|
||||
if (base == 0 || (base >1 && base <37)) {
|
||||
/* Base was ok so it's because we were not
|
||||
* able to make the convertion.
|
||||
* Let's reset errno.
|
||||
*/
|
||||
errno = 0;
|
||||
}
|
||||
}
|
||||
return nb;
|
||||
}
|
||||
#else
|
||||
#error "You need the strtouq function"
|
||||
#endif /* HAVE_STRTOUQ */
|
||||
#endif /* HAVE_BSD_STRTOLL */
|
||||
#endif /* HAVE_STRTOULL */
|
||||
|
||||
#ifndef HAVE_SETENV
|
||||
int rep_setenv(const char *name, const char *value, int overwrite)
|
||||
@ -600,24 +641,190 @@ int rep_unsetenv(const char *name)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SOCKETPAIR
|
||||
int rep_socketpair(int d, int type, int protocol, int sv[2])
|
||||
#ifndef HAVE_UTIME
|
||||
int rep_utime(const char *filename, const struct utimbuf *buf)
|
||||
{
|
||||
if (d != AF_UNIX) {
|
||||
errno = EAFNOSUPPORT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (protocol != 0) {
|
||||
errno = EPROTONOSUPPORT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (type != SOCK_STREAM) {
|
||||
errno = EOPNOTSUPP;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return pipe(sv);
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_UTIMES
|
||||
int rep_utimes(const char *filename, const struct timeval tv[2])
|
||||
{
|
||||
struct utimbuf u;
|
||||
|
||||
u.actime = tv[0].tv_sec;
|
||||
if (tv[0].tv_usec > 500000) {
|
||||
u.actime += 1;
|
||||
}
|
||||
|
||||
u.modtime = tv[1].tv_sec;
|
||||
if (tv[1].tv_usec > 500000) {
|
||||
u.modtime += 1;
|
||||
}
|
||||
|
||||
return utime(filename, &u);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DUP2
|
||||
int rep_dup2(int oldfd, int newfd)
|
||||
{
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_CHOWN
|
||||
/**
|
||||
chown isn't used much but OS/2 doesn't have it
|
||||
**/
|
||||
int rep_chown(const char *fname, uid_t uid, gid_t gid)
|
||||
{
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_LINK
|
||||
int rep_link(const char *oldpath, const char *newpath)
|
||||
{
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_READLINK
|
||||
int rep_readlink(const char *path, char *buf, size_t bufsiz)
|
||||
{
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SYMLINK
|
||||
int rep_symlink(const char *oldpath, const char *newpath)
|
||||
{
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_LCHOWN
|
||||
int rep_lchown(const char *fname,uid_t uid,gid_t gid)
|
||||
{
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_REALPATH
|
||||
char *rep_realpath(const char *path, char *resolved_path)
|
||||
{
|
||||
/* As realpath is not a system call we can't return ENOSYS. */
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef HAVE_MEMMEM
|
||||
void *rep_memmem(const void *haystack, size_t haystacklen,
|
||||
const void *needle, size_t needlelen)
|
||||
{
|
||||
if (needlelen == 0) {
|
||||
return discard_const(haystack);
|
||||
}
|
||||
while (haystacklen >= needlelen) {
|
||||
char *p = (char *)memchr(haystack, *(const char *)needle,
|
||||
haystacklen-(needlelen-1));
|
||||
if (!p) return NULL;
|
||||
if (memcmp(p, needle, needlelen) == 0) {
|
||||
return p;
|
||||
}
|
||||
haystack = p+1;
|
||||
haystacklen -= (p - (const char *)haystack) + 1;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_VDPRINTF
|
||||
int rep_vdprintf(int fd, const char *format, va_list ap)
|
||||
{
|
||||
char *s = NULL;
|
||||
int ret;
|
||||
|
||||
vasprintf(&s, format, ap);
|
||||
if (s == NULL) {
|
||||
errno = ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
ret = write(fd, s, strlen(s));
|
||||
free(s);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DPRINTF
|
||||
int rep_dprintf(int fd, const char *format, ...)
|
||||
{
|
||||
int ret;
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, format);
|
||||
ret = vdprintf(fd, format, ap);
|
||||
va_end(ap);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_GET_CURRENT_DIR_NAME
|
||||
char *rep_get_current_dir_name(void)
|
||||
{
|
||||
char buf[PATH_MAX+1];
|
||||
char *p;
|
||||
p = getcwd(buf, sizeof(buf));
|
||||
if (p == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
return strdup(p);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_STRERROR_R) || !defined(STRERROR_R_PROTO_COMPATIBLE)
|
||||
int rep_strerror_r(int errnum, char *buf, size_t buflen)
|
||||
{
|
||||
char *s = strerror(errnum);
|
||||
if (strlen(s)+1 > buflen) {
|
||||
errno = ERANGE;
|
||||
return -1;
|
||||
}
|
||||
strncpy(buf, s, buflen);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_CLOCK_GETTIME
|
||||
int rep_clock_gettime(clockid_t clk_id, struct timespec *tp)
|
||||
{
|
||||
struct timeval tval;
|
||||
switch (clk_id) {
|
||||
case 0: /* CLOCK_REALTIME :*/
|
||||
#ifdef HAVE_GETTIMEOFDAY_TZ
|
||||
gettimeofday(&tval,NULL);
|
||||
#else
|
||||
gettimeofday(&tval);
|
||||
#endif
|
||||
tp->tv_sec = tval.tv_sec;
|
||||
tp->tv_nsec = tval.tv_usec * 1000;
|
||||
break;
|
||||
default:
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
@ -4,7 +4,7 @@
|
||||
macros to go along with the lib/replace/ portability layer code
|
||||
|
||||
Copyright (C) Andrew Tridgell 2005
|
||||
Copyright (C) Jelmer Vernooij 2006
|
||||
Copyright (C) Jelmer Vernooij 2006-2008
|
||||
Copyright (C) Jeremy Allison 2007.
|
||||
|
||||
** NOTE! The following LGPL license applies to the replace
|
||||
@ -52,9 +52,58 @@
|
||||
which causes a warning storm on irix */
|
||||
#undef HAVE_INTTYPES_H
|
||||
#elif HAVE_INTTYPES_H
|
||||
#define __STDC_FORMAT_MACROS
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
|
||||
#ifndef __PRI64_PREFIX
|
||||
# if __WORDSIZE == 64
|
||||
# define __PRI64_PREFIX "l"
|
||||
# else
|
||||
# define __PRI64_PREFIX "ll"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Decimal notation. */
|
||||
#ifndef PRId8
|
||||
# define PRId8 "d"
|
||||
#endif
|
||||
#ifndef PRId16
|
||||
# define PRId16 "d"
|
||||
#endif
|
||||
#ifndef PRId32
|
||||
# define PRId32 "d"
|
||||
#endif
|
||||
#ifndef PRId64
|
||||
# define PRId64 __PRI64_PREFIX "d"
|
||||
#endif
|
||||
|
||||
#ifndef PRIi8
|
||||
# define PRIi8 "i"
|
||||
#endif
|
||||
#ifndef PRIi16
|
||||
# define PRIi16 "i"
|
||||
#endif
|
||||
#ifndef PRIi32
|
||||
# define PRIi32 "i"
|
||||
#endif
|
||||
#ifndef PRIi64
|
||||
# define PRIi64 __PRI64_PREFIX "i"
|
||||
#endif
|
||||
|
||||
#ifndef PRIu8
|
||||
# define PRIu8 "u"
|
||||
#endif
|
||||
#ifndef PRIu16
|
||||
# define PRIu16 "u"
|
||||
#endif
|
||||
#ifndef PRIu32
|
||||
# define PRIu32 "u"
|
||||
#endif
|
||||
#ifndef PRIu64
|
||||
# define PRIu64 __PRI64_PREFIX "u"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#endif
|
||||
@ -72,6 +121,13 @@
|
||||
#include <stddef.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LINUX_TYPES_H
|
||||
/*
|
||||
* This is needed as some broken header files require this to be included early
|
||||
*/
|
||||
#include <linux/types.h>
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRERROR
|
||||
extern char *sys_errlist[];
|
||||
#define strerror(i) sys_errlist[i]
|
||||
@ -91,6 +147,12 @@ char *rep_strdup(const char *s);
|
||||
void *rep_memmove(void *dest,const void *src,int size);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_MEMMEM
|
||||
#define memmem rep_memmem
|
||||
void *rep_memmem(const void *haystack, size_t haystacklen,
|
||||
const void *needle, size_t needlelen);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_MKTIME
|
||||
#define mktime rep_mktime
|
||||
/* prototype is in "system/time.h" */
|
||||
@ -101,6 +163,16 @@ void *rep_memmove(void *dest,const void *src,int size);
|
||||
/* prototype is in "system/time.h" */
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_UTIME
|
||||
#define utime rep_utime
|
||||
/* prototype is in "system/time.h" */
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_UTIMES
|
||||
#define utimes rep_utimes
|
||||
/* prototype is in "system/time.h" */
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRLCPY
|
||||
#define strlcpy rep_strlcpy
|
||||
size_t rep_strlcpy(char *d, const char *s, size_t bufsize);
|
||||
@ -123,6 +195,15 @@ char *rep_strndup(const char *s, size_t n);
|
||||
size_t rep_strnlen(const char *s, size_t n);
|
||||
#endif
|
||||
|
||||
#if !HAVE_DECL_ENVIRON
|
||||
#ifdef __APPLE__
|
||||
#include <crt_externs.h>
|
||||
#define environ (*_NSGetEnviron())
|
||||
#else
|
||||
extern char **environ;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SETENV
|
||||
#define setenv rep_setenv
|
||||
int rep_setenv(const char *name, const char *value, int overwrite);
|
||||
@ -147,6 +228,53 @@ int rep_seteuid(uid_t);
|
||||
int rep_setegid(gid_t);
|
||||
#endif
|
||||
|
||||
#if (defined(USE_SETRESUID) && !defined(HAVE_SETRESUID_DECL))
|
||||
/* stupid glibc */
|
||||
int setresuid(uid_t ruid, uid_t euid, uid_t suid);
|
||||
#endif
|
||||
#if (defined(USE_SETRESUID) && !defined(HAVE_SETRESGID_DECL))
|
||||
int setresgid(gid_t rgid, gid_t egid, gid_t sgid);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_CHOWN
|
||||
#define chown rep_chown
|
||||
int rep_chown(const char *path, uid_t uid, gid_t gid);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_CHROOT
|
||||
#define chroot rep_chroot
|
||||
int rep_chroot(const char *dirname);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_LINK
|
||||
#define link rep_link
|
||||
int rep_link(const char *oldpath, const char *newpath);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_READLINK
|
||||
#define readlink rep_readlink
|
||||
ssize_t rep_readlink(const char *path, char *buf, size_t bufsize);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SYMLINK
|
||||
#define symlink rep_symlink
|
||||
int rep_symlink(const char *oldpath, const char *newpath);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_REALPATH
|
||||
#define realpath rep_realpath
|
||||
char *rep_realpath(const char *path, char *resolved_path);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_LCHOWN
|
||||
#define lchown rep_lchown
|
||||
int rep_lchown(const char *fname,uid_t uid,gid_t gid);
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNIX_H
|
||||
#include <unix.h>
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SETLINEBUF
|
||||
#define setlinebuf rep_setlinebuf
|
||||
void rep_setlinebuf(FILE *);
|
||||
@ -162,14 +290,26 @@ char *rep_strcasestr(const char *haystack, const char *needle);
|
||||
char *rep_strtok_r(char *s, const char *delim, char **save_ptr);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#ifndef HAVE_STRTOLL
|
||||
#define strtoll rep_strtoll
|
||||
long long int rep_strtoll(const char *str, char **endptr, int base);
|
||||
#else
|
||||
#ifdef HAVE_BSD_STRTOLL
|
||||
#define strtoll rep_strtoll
|
||||
long long int rep_strtoll(const char *str, char **endptr, int base);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRTOULL
|
||||
#define strtoull rep_strtoull
|
||||
unsigned long long int rep_strtoull(const char *str, char **endptr, int base);
|
||||
#else
|
||||
#ifdef HAVE_BSD_STRTOLL /* yes, it's not HAVE_BSD_STRTOULL */
|
||||
#define strtoull rep_strtoull
|
||||
unsigned long long int rep_strtoull(const char *str, char **endptr, int base);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_FTRUNCATE
|
||||
@ -212,7 +352,17 @@ int rep_dlclose(void *handle);
|
||||
|
||||
#ifndef HAVE_SOCKETPAIR
|
||||
#define socketpair rep_socketpair
|
||||
int rep_socketpair(int d, int type, int protocol, int sv[2]);
|
||||
/* prototype is in system/network.h */
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_VDPRINTF
|
||||
#define vdprintf rep_vdprintf
|
||||
int rep_vdprintf(int fd, const char *format, va_list ap);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DPRINTF
|
||||
#define dprintf rep_dprintf
|
||||
int rep_dprintf(int fd, const char *format, ...);
|
||||
#endif
|
||||
|
||||
#ifndef PRINTF_ATTRIBUTE
|
||||
@ -290,6 +440,11 @@ struct tm;
|
||||
char *rep_strptime(const char *buf, const char *format, struct tm *tm);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DUP2
|
||||
#define dup2 rep_dup2
|
||||
int rep_dup2(int oldfd, int newfd);
|
||||
#endif
|
||||
|
||||
/* Load header file for dynamic linking stuff */
|
||||
#ifdef HAVE_DLFCN_H
|
||||
#include <dlfcn.h>
|
||||
@ -318,14 +473,20 @@ char *rep_mkdtemp(char *template);
|
||||
#ifndef HAVE_PREAD
|
||||
#define pread rep_pread
|
||||
ssize_t rep_pread(int __fd, void *__buf, size_t __nbytes, off_t __offset);
|
||||
#define LIBREPLACE_PREAD_REPLACED 1
|
||||
#else
|
||||
#define LIBREPLACE_PREAD_NOT_REPLACED 1
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_PWRITE
|
||||
#define pwrite rep_pwrite
|
||||
ssize_t rep_pwrite(int __fd, const void *__buf, size_t __nbytes, off_t __offset);
|
||||
#define LIBREPLACE_PWRITE_REPLACED 1
|
||||
#else
|
||||
#define LIBREPLACE_PWRITE_NOT_REPLACED 1
|
||||
#endif
|
||||
|
||||
#ifdef REPLACE_INET_NTOA
|
||||
#if !defined(HAVE_INET_NTOA) || defined(REPLACE_INET_NTOA)
|
||||
#define inet_ntoa rep_inet_ntoa
|
||||
/* prototype is in "system/network.h" */
|
||||
#endif
|
||||
@ -340,6 +501,21 @@ ssize_t rep_pwrite(int __fd, const void *__buf, size_t __nbytes, off_t __offset)
|
||||
/* prototype is in "system/network.h" */
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_INET_ATON
|
||||
#define inet_aton rep_inet_aton
|
||||
/* prototype is in "system/network.h" */
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_CONNECT
|
||||
#define connect rep_connect
|
||||
/* prototype is in "system/network.h" */
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_GETHOSTBYNAME
|
||||
#define gethostbyname rep_gethostbyname
|
||||
/* prototype is in "system/network.h" */
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_GETIFADDRS
|
||||
#define getifaddrs rep_getifaddrs
|
||||
/* prototype is in "system/network.h" */
|
||||
@ -350,6 +526,21 @@ ssize_t rep_pwrite(int __fd, const void *__buf, size_t __nbytes, off_t __offset)
|
||||
/* prototype is in "system/network.h" */
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_GET_CURRENT_DIR_NAME
|
||||
#define get_current_dir_name rep_get_current_dir_name
|
||||
char *rep_get_current_dir_name(void);
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_STRERROR_R) || !defined(STRERROR_R_PROTO_COMPATIBLE)
|
||||
#undef strerror_r
|
||||
#define strerror_r rep_strerror_r
|
||||
int rep_strerror_r(int errnum, char *buf, size_t buflen);
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_CLOCK_GETTIME)
|
||||
#define clock_gettime rep_clock_gettime
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LIMITS_H
|
||||
#include <limits.h>
|
||||
#endif
|
||||
@ -366,18 +557,6 @@ ssize_t rep_pwrite(int __fd, const void *__buf, size_t __nbytes, off_t __offset)
|
||||
? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) : (t) 0))
|
||||
#define _TYPE_MAXIMUM(t) ((t) (~ (t) 0 - _TYPE_MINIMUM (t)))
|
||||
|
||||
#ifndef HOST_NAME_MAX
|
||||
#define HOST_NAME_MAX 255
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Some older systems seem not to have MAXHOSTNAMELEN
|
||||
* defined.
|
||||
*/
|
||||
#ifndef MAXHOSTNAMELEN
|
||||
#define MAXHOSTNAMELEN HOST_NAME_MAX
|
||||
#endif
|
||||
|
||||
#ifndef UINT16_MAX
|
||||
#define UINT16_MAX 65535
|
||||
#endif
|
||||
@ -410,6 +589,18 @@ typedef int bool;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_INTPTR_T)
|
||||
typedef long long intptr_t ;
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_UINTPTR_T)
|
||||
typedef unsigned long long uintptr_t ;
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_PTRDIFF_T)
|
||||
typedef unsigned long long ptrdiff_t ;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* to prevent <rpcsvc/yp_prot.h> from doing a redefine of 'bool'
|
||||
*
|
||||
@ -484,7 +675,7 @@ typedef int bool;
|
||||
Also, please call this via the discard_const_p() macro interface, as that
|
||||
makes the return type safe.
|
||||
*/
|
||||
#define discard_const(ptr) ((void *)((intptr_t)(ptr)))
|
||||
#define discard_const(ptr) ((void *)((uintptr_t)(ptr)))
|
||||
|
||||
/** Type-safe version of discard_const */
|
||||
#define discard_const_p(type, ptr) ((type *)discard_const(ptr))
|
||||
@ -546,7 +737,69 @@ typedef int bool;
|
||||
#define QSORT_CAST (int (*)(const void *, const void *))
|
||||
#endif
|
||||
|
||||
/* These should be properly defined for libraries to control visibility. */
|
||||
#define _PRIVATE_
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX 1024
|
||||
#endif
|
||||
|
||||
#ifndef MAX_DNS_NAME_LENGTH
|
||||
#define MAX_DNS_NAME_LENGTH 256 /* Actually 255 but +1 for terminating null. */
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_CRYPT
|
||||
char *ufc_crypt(const char *key, const char *salt);
|
||||
#define crypt ufc_crypt
|
||||
#else
|
||||
#ifdef HAVE_CRYPT_H
|
||||
#include <crypt.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* these macros gain us a few percent of speed on gcc */
|
||||
#if (__GNUC__ >= 3)
|
||||
/* the strange !! is to ensure that __builtin_expect() takes either 0 or 1
|
||||
as its first argument */
|
||||
#ifndef likely
|
||||
#define likely(x) __builtin_expect(!!(x), 1)
|
||||
#endif
|
||||
#ifndef unlikely
|
||||
#define unlikely(x) __builtin_expect(!!(x), 0)
|
||||
#endif
|
||||
#else
|
||||
#ifndef likely
|
||||
#define likely(x) (x)
|
||||
#endif
|
||||
#ifndef unlikely
|
||||
#define unlikely(x) (x)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_FDATASYNC
|
||||
#define fdatasync(fd) fsync(fd)
|
||||
#elif !defined(HAVE_DECL_FDATASYNC)
|
||||
int fdatasync(int );
|
||||
#endif
|
||||
|
||||
/* these are used to mark symbols as local to a shared lib, or
|
||||
* publicly available via the shared lib API */
|
||||
#ifndef _PUBLIC_
|
||||
#ifdef HAVE_VISIBILITY_ATTR
|
||||
#define _PUBLIC_ __attribute__((visibility("default")))
|
||||
#else
|
||||
#define _PUBLIC_
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef _PRIVATE_
|
||||
#ifdef HAVE_VISIBILITY_ATTR
|
||||
# define _PRIVATE_ __attribute__((visibility("hidden")))
|
||||
#else
|
||||
# define _PRIVATE_
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_POLL
|
||||
#define poll rep_poll
|
||||
/* prototype is in "system/network.h" */
|
||||
#endif
|
||||
|
||||
#endif /* _LIBREPLACE_REPLACE_H */
|
||||
|
@ -1,8 +1,12 @@
|
||||
AC_LIBREPLACE_BROKEN_CHECKS
|
||||
AC_LIBREPLACE_NETWORK_CHECKS
|
||||
|
||||
SMB_EXT_LIB(LIBREPLACE_EXT, [${LIBDL}])
|
||||
SMB_EXT_LIB(LIBREPLACE_EXT, [${LIBDL} ${CRYPT_LIBS}])
|
||||
SMB_ENABLE(LIBREPLACE_EXT)
|
||||
|
||||
SMB_EXT_LIB(LIBREPLACE_NETWORK, [${LIBREPLACE_NETWORK_LIBS}])
|
||||
SMB_ENABLE(LIBREPLACE_NETWORK)
|
||||
|
||||
# remove leading ./
|
||||
LIBREPLACE_DIR=`echo ${libreplacedir} |sed -e 's/^\.\///g'`
|
||||
|
||||
@ -13,14 +17,11 @@ LIBREPLACE_DIR=`echo ${libreplacedir} |sed -e 's/^\.\///g'`
|
||||
# build directory.
|
||||
LIBREPLACE_DIR=`echo ${LIBREPLACE_DIR} | sed -e "s|^$srcdir/||g"`
|
||||
|
||||
LIBREPLACE_OBJS=""
|
||||
for obj in ${LIBREPLACEOBJ}; do
|
||||
LIBREPLACE_OBJS="${LIBREPLACE_OBJS} ${LIBREPLACE_DIR}/${obj}"
|
||||
done
|
||||
LIBREPLACE_OBJS="${LIBREPLACEOBJ}"
|
||||
|
||||
SMB_SUBSYSTEM(LIBREPLACE,
|
||||
[${LIBREPLACE_OBJS}],
|
||||
[LIBREPLACE_EXT],
|
||||
[LIBREPLACE_EXT LIBREPLACE_NETWORK],
|
||||
[-Ilib/replace])
|
||||
|
||||
LIBREPLACE_HOSTCC_OBJS=`echo ${LIBREPLACE_OBJS} |sed -e 's/\.o/\.ho/g'`
|
||||
@ -29,3 +30,5 @@ SMB_SUBSYSTEM(LIBREPLACE_HOSTCC,
|
||||
[${LIBREPLACE_HOSTCC_OBJS}],
|
||||
[],
|
||||
[-Ilib/replace])
|
||||
|
||||
AC_CHECK_FUNCS([syslog],,[AC_MSG_ERROR([Required function not found])])
|
||||
|
@ -504,6 +504,7 @@ static int dopr(char *buffer, size_t maxlen, const char *format, va_list args_in
|
||||
break;
|
||||
case 'p':
|
||||
cnk->type = CNK_PTR;
|
||||
cnk->flags |= DP_F_UNSIGNED;
|
||||
break;
|
||||
case 'n':
|
||||
cnk->type = CNK_NUM;
|
||||
@ -526,7 +527,7 @@ static int dopr(char *buffer, size_t maxlen, const char *format, va_list args_in
|
||||
}
|
||||
}
|
||||
|
||||
/* retieve the format arguments */
|
||||
/* retrieve the format arguments */
|
||||
for (pnum = 0; pnum < max_pos; pnum++) {
|
||||
int i;
|
||||
|
||||
@ -1264,7 +1265,7 @@ static int add_cnk_list_entry(struct pr_chunk_x **list,
|
||||
VA_COPY(ap2, ap);
|
||||
ret = vsnprintf(NULL, 0, format, ap2);
|
||||
va_end(ap2);
|
||||
if (ret <= 0) return ret;
|
||||
if (ret < 0) return ret;
|
||||
|
||||
(*ptr) = (char *)malloc(ret+1);
|
||||
if (!*ptr) return -1;
|
||||
|
35
ctdb/lib/replace/socket.c
Normal file
35
ctdb/lib/replace/socket.c
Normal file
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Unix SMB/CIFS implementation.
|
||||
*
|
||||
* Dummy replacements for socket functions.
|
||||
*
|
||||
* Copyright (C) Michael Adam <obnox@samba.org> 2008
|
||||
*
|
||||
* 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "replace.h"
|
||||
#include "system/network.h"
|
||||
|
||||
int rep_connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen)
|
||||
{
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct hostent *rep_gethostbyname(const char *name)
|
||||
{
|
||||
errno = ENOSYS;
|
||||
return NULL;
|
||||
}
|
46
ctdb/lib/replace/socketpair.c
Normal file
46
ctdb/lib/replace/socketpair.c
Normal file
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Unix SMB/CIFS implementation.
|
||||
* replacement routines for broken systems
|
||||
* Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2006
|
||||
* Copyright (C) Michael Adam <obnox@samba.org> 2008
|
||||
*
|
||||
* ** NOTE! The following LGPL license applies to the replace
|
||||
* ** library. This does NOT imply that all of Samba is released
|
||||
* ** under the LGPL
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "replace.h"
|
||||
#include "system/network.h"
|
||||
|
||||
int rep_socketpair(int d, int type, int protocol, int sv[2])
|
||||
{
|
||||
if (d != AF_UNIX) {
|
||||
errno = EAFNOSUPPORT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (protocol != 0) {
|
||||
errno = EPROTONOSUPPORT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (type != SOCK_STREAM) {
|
||||
errno = EOPNOTSUPP;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return pipe(sv);
|
||||
}
|
@ -9,5 +9,5 @@ AC_CACHE_CHECK([whether strptime is available and works],libreplace_cv_STRPTIME_
|
||||
])
|
||||
if test x"$libreplace_cv_STRPTIME_OK" != x"yes"; then
|
||||
AC_DEFINE(REPLACE_STRPTIME,1,[Whether strptime should be replaced])
|
||||
LIBREPLACEOBJ="${LIBREPLACEOBJ} strptime.o"
|
||||
LIBREPLACEOBJ="${LIBREPLACEOBJ} $libreplacedir/strptime.o"
|
||||
fi
|
||||
|
@ -1,14 +1,29 @@
|
||||
# filesys
|
||||
AC_HEADER_DIRENT
|
||||
AC_CHECK_HEADERS(fcntl.h sys/fcntl.h sys/resource.h sys/ioctl.h sys/mode.h sys/filio.h sys/fs/s5param.h sys/filsys.h)
|
||||
AC_CHECK_HEADERS(sys/acl.h acl/libacl.h)
|
||||
AC_CHECK_HEADERS(sys/acl.h acl/libacl.h sys/file.h)
|
||||
|
||||
# select
|
||||
AC_CHECK_HEADERS(sys/select.h)
|
||||
|
||||
# poll
|
||||
AC_CHECK_HEADERS(poll.h)
|
||||
AC_CHECK_FUNCS(poll,[],[LIBREPLACEOBJ="${LIBREPLACEOBJ} $libreplacedir/poll.o"])
|
||||
|
||||
# time
|
||||
AC_CHECK_HEADERS(sys/time.h utime.h)
|
||||
AC_HEADER_TIME
|
||||
AC_CHECK_FUNCS(utime utimes)
|
||||
|
||||
AC_CACHE_CHECK([if gettimeofday takes TZ argument],libreplace_cv_HAVE_GETTIMEOFDAY_TZ,[
|
||||
AC_TRY_RUN([
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
main() { struct timeval tv; exit(gettimeofday(&tv, NULL));}],
|
||||
libreplace_cv_HAVE_GETTIMEOFDAY_TZ=yes,libreplace_cv_HAVE_GETTIMEOFDAY_TZ=no,libreplace_cv_HAVE_GETTIMEOFDAY_TZ=yes)])
|
||||
if test x"$libreplace_cv_HAVE_GETTIMEOFDAY_TZ" = x"yes"; then
|
||||
AC_DEFINE(HAVE_GETTIMEOFDAY_TZ,1,[Whether gettimeofday() is available])
|
||||
fi
|
||||
|
||||
# wait
|
||||
AC_HEADER_SYS_WAIT
|
||||
@ -18,7 +33,7 @@ AC_CHECK_HEADERS(sys/capability.h)
|
||||
|
||||
case "$host_os" in
|
||||
*linux*)
|
||||
AC_CACHE_CHECK([for broken RedHat 7.2 system header files],samba_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS,[
|
||||
AC_CACHE_CHECK([for broken RedHat 7.2 system header files],libreplace_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS,[
|
||||
AC_TRY_COMPILE([
|
||||
#ifdef HAVE_SYS_VFS_H
|
||||
#include <sys/vfs.h>
|
||||
@ -29,14 +44,14 @@ AC_TRY_COMPILE([
|
||||
],[
|
||||
int i;
|
||||
],
|
||||
samba_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS=no,
|
||||
samba_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS=yes
|
||||
libreplace_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS=no,
|
||||
libreplace_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS=yes
|
||||
)])
|
||||
if test x"$samba_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS" = x"yes"; then
|
||||
if test x"$libreplace_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS" = x"yes"; then
|
||||
AC_DEFINE(BROKEN_REDHAT_7_SYSTEM_HEADERS,1,[Broken RedHat 7.2 system header files])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for broken RHEL5 sys/capability.h],samba_cv_BROKEN_RHEL5_SYS_CAP_HEADER,[
|
||||
AC_CACHE_CHECK([for broken RHEL5 sys/capability.h],libreplace_cv_BROKEN_RHEL5_SYS_CAP_HEADER,[
|
||||
AC_TRY_COMPILE([
|
||||
#ifdef HAVE_SYS_CAPABILITY_H
|
||||
#include <sys/capability.h>
|
||||
@ -45,10 +60,10 @@ AC_TRY_COMPILE([
|
||||
],[
|
||||
__s8 i;
|
||||
],
|
||||
samba_cv_BROKEN_RHEL5_SYS_CAP_HEADER=no,
|
||||
samba_cv_BROKEN_RHEL5_SYS_CAP_HEADER=yes
|
||||
libreplace_cv_BROKEN_RHEL5_SYS_CAP_HEADER=no,
|
||||
libreplace_cv_BROKEN_RHEL5_SYS_CAP_HEADER=yes
|
||||
)])
|
||||
if test x"$samba_cv_BROKEN_RHEL5_SYS_CAP_HEADER" = x"yes"; then
|
||||
if test x"$libreplace_cv_BROKEN_RHEL5_SYS_CAP_HEADER" = x"yes"; then
|
||||
AC_DEFINE(BROKEN_RHEL5_SYS_CAP_HEADER,1,[Broken RHEL5 sys/capability.h])
|
||||
fi
|
||||
;;
|
||||
@ -73,6 +88,18 @@ AC_VERIFY_C_PROTOTYPE([struct passwd *getpwent_r(struct passwd *src, char *buf,
|
||||
#include <unistd.h>
|
||||
#include <pwd.h>
|
||||
])
|
||||
AC_VERIFY_C_PROTOTYPE([struct passwd *getpwent_r(struct passwd *src, char *buf, size_t buflen)],
|
||||
[
|
||||
#ifndef HAVE_GETPWENT_R_DECL
|
||||
#error missing getpwent_r prototype
|
||||
#endif
|
||||
return NULL;
|
||||
],[
|
||||
AC_DEFINE(SOLARIS_GETPWENT_R, 1, [getpwent_r irix (similar to solaris) function prototype])
|
||||
],[],[
|
||||
#include <unistd.h>
|
||||
#include <pwd.h>
|
||||
])
|
||||
AC_CHECK_FUNCS(getgrnam_r getgrgid_r getgrent_r)
|
||||
AC_HAVE_DECL(getgrent_r, [
|
||||
#include <unistd.h>
|
||||
@ -91,8 +118,22 @@ AC_VERIFY_C_PROTOTYPE([struct group *getgrent_r(struct group *src, char *buf, in
|
||||
#include <grp.h>
|
||||
])
|
||||
|
||||
AC_VERIFY_C_PROTOTYPE([struct group *getgrent_r(struct group *src, char *buf, size_t buflen)],
|
||||
[
|
||||
#ifndef HAVE_GETGRENT_R_DECL
|
||||
#error missing getgrent_r prototype
|
||||
#endif
|
||||
return NULL;
|
||||
],[
|
||||
AC_DEFINE(SOLARIS_GETGRENT_R, 1, [getgrent_r irix (similar to solaris) function prototype])
|
||||
],[],[
|
||||
#include <unistd.h>
|
||||
#include <grp.h>
|
||||
])
|
||||
AC_CHECK_FUNCS(getgrouplist)
|
||||
|
||||
# locale
|
||||
AC_CHECK_HEADERS(ctype.h locale.h)
|
||||
AC_CHECK_HEADERS(ctype.h locale.h langinfo.h)
|
||||
|
||||
# glob
|
||||
AC_CHECK_HEADERS(fnmatch.h)
|
||||
|
@ -1,16 +1,16 @@
|
||||
#ifndef _system_filesys_h
|
||||
#define _system_filesys_h
|
||||
/*
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
|
||||
filesystem system include wrappers
|
||||
|
||||
Copyright (C) Andrew Tridgell 2004
|
||||
|
||||
|
||||
** NOTE! The following LGPL license applies to the replace
|
||||
** library. This does NOT imply that all of Samba is released
|
||||
** under the LGPL
|
||||
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
@ -53,23 +53,23 @@
|
||||
#include <acl/libacl.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_FS_S5PARAM_H
|
||||
#ifdef HAVE_SYS_FS_S5PARAM_H
|
||||
#include <sys/fs/s5param.h>
|
||||
#endif
|
||||
|
||||
#if defined (HAVE_SYS_FILSYS_H) && !defined (_CRAY)
|
||||
#include <sys/filsys.h>
|
||||
#include <sys/filsys.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_STATFS_H
|
||||
# include <sys/statfs.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_DUSTAT_H
|
||||
#ifdef HAVE_DUSTAT_H
|
||||
#include <sys/dustat.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_STATVFS_H
|
||||
#ifdef HAVE_SYS_STATVFS_H
|
||||
#include <sys/statvfs.h>
|
||||
#endif
|
||||
|
||||
@ -77,7 +77,9 @@
|
||||
#include <sys/filio.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_FILE_H
|
||||
#include <sys/file.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_FCNTL_H
|
||||
#include <fcntl.h>
|
||||
@ -98,6 +100,10 @@
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_UIO_H
|
||||
#include <sys/uio.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Veritas File System. Often in addition to native.
|
||||
* Quotas different.
|
||||
@ -123,7 +129,7 @@
|
||||
#endif
|
||||
|
||||
/* Some POSIX definitions for those without */
|
||||
|
||||
|
||||
#ifndef S_IFDIR
|
||||
#define S_IFDIR 0x4000
|
||||
#endif
|
||||
@ -179,4 +185,19 @@
|
||||
#define SEEK_SET 0
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#define mkdir(d,m) _mkdir(d)
|
||||
#endif
|
||||
|
||||
#ifdef UID_WRAPPER
|
||||
# ifndef UID_WRAPPER_DISABLE
|
||||
# ifndef UID_WRAPPER_NOT_REPLACE
|
||||
# define UID_WRAPPER_REPLACE
|
||||
# endif /* UID_WRAPPER_NOT_REPLACE */
|
||||
# include "../uid_wrapper/uid_wrapper.h"
|
||||
# endif /* UID_WRAPPER_DISABLE */
|
||||
#else /* UID_WRAPPER */
|
||||
# define uwrap_enabled() 0
|
||||
#endif /* UID_WRAPPER */
|
||||
|
||||
#endif
|
||||
|
@ -28,109 +28,28 @@
|
||||
*/
|
||||
|
||||
#ifdef HAVE_KRB5
|
||||
/* Whether the krb5_address struct has a addrtype property */
|
||||
/* #undef HAVE_ADDRTYPE_IN_KRB5_ADDRESS */
|
||||
/* Whether the krb5_address struct has a addr_type property */
|
||||
#define HAVE_ADDR_TYPE_IN_KRB5_ADDRESS 1
|
||||
/* Define to 1 if you have the `gsskrb5_extract_authz_data_from_sec_context' */
|
||||
#define HAVE_GSSKRB5_EXTRACT_AUTHZ_DATA_FROM_SEC_CONTEXT 1
|
||||
/* Define to 1 if you have the `gsskrb5_get_initiator_subkey' function. */
|
||||
#define HAVE_GSSKRB5_GET_INITIATOR_SUBKEY 1
|
||||
/* Define to 1 if you have the `gsskrb5_register_acceptor_identity' function. */
|
||||
#define HAVE_GSSKRB5_REGISTER_ACCEPTOR_IDENTITY 1
|
||||
/* Define to 1 if you have the `gss_krb5_ccache_name' function. */
|
||||
#define HAVE_GSS_KRB5_CCACHE_NAME 1
|
||||
/* Define to 1 if you have the `krb5_addlog_func' function. */
|
||||
#define HAVE_KRB5_ADDLOG_FUNC 1
|
||||
/* Define to 1 if you have the `krb5_auth_con_setkey' function. */
|
||||
#define HAVE_KRB5_AUTH_CON_SETKEY 1
|
||||
/* Define to 1 if you have the `krb5_auth_con_setuseruserkey' function. */
|
||||
/* #undef HAVE_KRB5_AUTH_CON_SETUSERUSERKEY */
|
||||
/* Define to 1 if you have the `krb5_c_enctype_compare' function. */
|
||||
#define HAVE_KRB5_C_ENCTYPE_COMPARE 1
|
||||
/* Define to 1 if you have the `krb5_c_verify_checksum' function. */
|
||||
#define HAVE_KRB5_C_VERIFY_CHECKSUM 1
|
||||
/* Whether the type krb5_encrypt_block exists */
|
||||
/* #undef HAVE_KRB5_ENCRYPT_BLOCK */
|
||||
/* Define to 1 if you have the `krb5_encrypt_data' function. */
|
||||
/* #undef HAVE_KRB5_ENCRYPT_DATA */
|
||||
/* Define to 1 if you have the `krb5_enctypes_compatible_keys' function. */
|
||||
#define HAVE_KRB5_ENCTYPES_COMPATIBLE_KEYS 1
|
||||
/* Define to 1 if you have the `krb5_free_data_contents' function. */
|
||||
#define HAVE_KRB5_FREE_DATA_CONTENTS 1
|
||||
/* Define to 1 if you have the `krb5_free_error_string' function. */
|
||||
#define HAVE_KRB5_FREE_ERROR_STRING 1
|
||||
/* Define to 1 if you have the `krb5_free_keytab_entry_contents' function. */
|
||||
/* #undef HAVE_KRB5_FREE_KEYTAB_ENTRY_CONTENTS */
|
||||
/* Define to 1 if you have the `krb5_free_ktypes' function. */
|
||||
/* #undef HAVE_KRB5_FREE_KTYPES */
|
||||
/* Define to 1 if you have the `krb5_free_unparsed_name' function. */
|
||||
/* #undef HAVE_KRB5_FREE_UNPARSED_NAME */
|
||||
/* Define to 1 if you have the `krb5_get_default_in_tkt_etypes' function. */
|
||||
#define HAVE_KRB5_GET_DEFAULT_IN_TKT_ETYPES 1
|
||||
/* Define to 1 if you have the `krb5_get_error_string' function. */
|
||||
#define HAVE_KRB5_GET_ERROR_STRING 1
|
||||
/* Define to 1 if you have the `krb5_get_permitted_enctypes' function. */
|
||||
/* #undef HAVE_KRB5_GET_PERMITTED_ENCTYPES */
|
||||
/* Define to 1 if you have the `krb5_get_pw_salt' function. */
|
||||
#define HAVE_KRB5_GET_PW_SALT 1
|
||||
/* Define to 1 if you have the <krb5.h> header file. */
|
||||
#define HAVE_KRB5_H 1
|
||||
/* Define to 1 if you have the `krb5_initlog' function. */
|
||||
#define HAVE_KRB5_INITLOG 1
|
||||
/* Define to 1 if you have the `krb5_kdc_default_config' function. */
|
||||
#define HAVE_KRB5_KDC_DEFAULT_CONFIG 1
|
||||
/* Whether the krb5_creds struct has a keyblock property */
|
||||
/* #undef HAVE_KRB5_KEYBLOCK_IN_CREDS */
|
||||
/* Whether the krb5_keyblock struct has a keyvalue property */
|
||||
#define HAVE_KRB5_KEYBLOCK_KEYVALUE 1
|
||||
/* Whether krb5_keytab_entry has key member */
|
||||
/* #undef HAVE_KRB5_KEYTAB_ENTRY_KEY */
|
||||
/* Whether krb5_keytab_entry has keyblock member */
|
||||
#define HAVE_KRB5_KEYTAB_ENTRY_KEYBLOCK 1
|
||||
/* Define to 1 if you have the `krb5_krbhst_get_addrinfo' function. */
|
||||
#define HAVE_KRB5_KRBHST_GET_ADDRINFO 1
|
||||
/* Define to 1 if you have the `krb5_kt_compare' function. */
|
||||
#define HAVE_KRB5_KT_COMPARE 1
|
||||
/* Define to 1 if you have the `krb5_kt_free_entry' function. */
|
||||
#define HAVE_KRB5_KT_FREE_ENTRY 1
|
||||
/* Whether the type krb5_log_facility exists */
|
||||
#define HAVE_KRB5_LOG_FACILITY 1
|
||||
/* Define to 1 if you have the `krb5_mk_req_extended' function. */
|
||||
#define HAVE_KRB5_MK_REQ_EXTENDED 1
|
||||
/* Define to 1 if you have the `krb5_principal2salt' function. */
|
||||
/* #undef HAVE_KRB5_PRINCIPAL2SALT */
|
||||
/* Define to 1 if you have the `krb5_principal_get_comp_string' function. */
|
||||
#define HAVE_KRB5_PRINCIPAL_GET_COMP_STRING 1
|
||||
/* Whether krb5_princ_component is available */
|
||||
/* #undef HAVE_KRB5_PRINC_COMPONENT */
|
||||
/* Whether the krb5_creds struct has a session property */
|
||||
#define HAVE_KRB5_SESSION_IN_CREDS 1
|
||||
/* Define to 1 if you have the `krb5_set_default_in_tkt_etypes' function. */
|
||||
#define HAVE_KRB5_SET_DEFAULT_IN_TKT_ETYPES 1
|
||||
/* Define to 1 if you have the `krb5_set_default_tgs_ktypes' function. */
|
||||
/* #undef HAVE_KRB5_SET_DEFAULT_TGS_KTYPES */
|
||||
/* Define to 1 if you have the `krb5_set_real_time' function. */
|
||||
#define HAVE_KRB5_SET_REAL_TIME 1
|
||||
/* Define to 1 if you have the `krb5_set_warn_dest' function. */
|
||||
#define HAVE_KRB5_SET_WARN_DEST 1
|
||||
/* Define to 1 if you have the `krb5_string_to_key' function. */
|
||||
#define HAVE_KRB5_STRING_TO_KEY 1
|
||||
/* Define to 1 if you have the `krb5_string_to_key_salt' function. */
|
||||
#define HAVE_KRB5_STRING_TO_KEY_SALT 1
|
||||
/* Define to 1 if you have the `krb5_ticket_get_authorization_data_type' */
|
||||
#define HAVE_KRB5_TICKET_GET_AUTHORIZATION_DATA_TYPE 1
|
||||
/* Whether the krb5_ticket struct has a enc_part2 property */
|
||||
/* #undef HAVE_KRB5_TKT_ENC_PART2 */
|
||||
/* Define to 1 if you have the `krb5_use_enctype' function. */
|
||||
/* #undef HAVE_KRB5_USE_ENCTYPE */
|
||||
/* Define to 1 if you have the `krb5_verify_checksum' function. */
|
||||
#define HAVE_KRB5_VERIFY_CHECKSUM 1
|
||||
/* Whether krb5_princ_realm returns krb5_realm or krb5_data */
|
||||
#define KRB5_PRINC_REALM_RETURNS_REALM 1
|
||||
|
||||
#include "heimdal/lib/krb5/krb5.h"
|
||||
#include "heimdal/lib/com_err/com_err.h"
|
||||
#if HAVE_KRB5_H
|
||||
#include <krb5.h>
|
||||
#endif
|
||||
|
||||
#if HAVE_COM_ERR_H
|
||||
#include <com_err.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_GSSAPI_GSSAPI_EXT_H
|
||||
#include <gssapi/gssapi_ext.h>
|
||||
#elif HAVE_GSSAPI_GSSAPI_H
|
||||
#include <gssapi/gssapi.h>
|
||||
#elif HAVE_GSSAPI_GSSAPI_GENERIC_H
|
||||
#include <gssapi/gssapi_generic.h>
|
||||
#elif HAVE_GSSAPI_H
|
||||
#include <gssapi.h>
|
||||
#endif
|
||||
|
||||
#if HAVE_GSSAPI_GSSAPI_KRB5_H
|
||||
#include <gssapi/gssapi_krb5.h>
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
@ -35,4 +35,8 @@
|
||||
#include <locale.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LANGINFO_H
|
||||
#include <langinfo.h>
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -27,6 +27,12 @@
|
||||
|
||||
*/
|
||||
|
||||
#ifndef LIBREPLACE_NETWORK_CHECKS
|
||||
#error "AC_LIBREPLACE_NETWORK_CHECKS missing in configure"
|
||||
#endif
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
@ -79,7 +85,20 @@
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#ifdef REPLACE_INET_NTOA
|
||||
#ifdef HAVE_SYS_UIO_H
|
||||
#include <sys/uio.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STROPTS_H
|
||||
#include <stropts.h>
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SOCKLEN_T
|
||||
#define HAVE_SOCKLEN_T
|
||||
typedef int socklen_t;
|
||||
#endif
|
||||
|
||||
#if !defined (HAVE_INET_NTOA) || defined(REPLACE_INET_NTOA)
|
||||
/* define is in "replace.h" */
|
||||
char *rep_inet_ntoa(struct in_addr ip);
|
||||
#endif
|
||||
@ -94,6 +113,21 @@ int rep_inet_pton(int af, const char *src, void *dst);
|
||||
const char *rep_inet_ntop(int af, const void *src, char *dst, socklen_t size);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_INET_ATON
|
||||
/* define is in "replace.h" */
|
||||
int rep_inet_aton(const char *src, struct in_addr *dst);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_CONNECT
|
||||
/* define is in "replace.h" */
|
||||
int rep_connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_GETHOSTBYNAME
|
||||
/* define is in "replace.h" */
|
||||
struct hostent *rep_gethostbyname(const char *name);
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_IFADDRS_H
|
||||
#include <ifaddrs.h>
|
||||
#endif
|
||||
@ -119,6 +153,11 @@ int rep_getifaddrs(struct ifaddrs **);
|
||||
void rep_freeifaddrs(struct ifaddrs *);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SOCKETPAIR
|
||||
/* define is in "replace.h" */
|
||||
int rep_socketpair(int d, int type, int protocol, int sv[2]);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Some systems have getaddrinfo but not the
|
||||
* defines needed to use it.
|
||||
@ -158,9 +197,30 @@ void rep_freeifaddrs(struct ifaddrs *);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Some of the functions in source3/lib/util_sock.c use AI_ADDRCONFIG. On QNX
|
||||
* 6.3.0, this macro is defined but, if it's used, getaddrinfo will fail. This
|
||||
* prevents smbd from opening any sockets.
|
||||
*
|
||||
* If I undefine AI_ADDRCONFIG on such systems and define it to be 0,
|
||||
* this works around the issue.
|
||||
*/
|
||||
#ifdef __QNX__
|
||||
#include <sys/neutrino.h>
|
||||
#if _NTO_VERSION == 630
|
||||
#undef AI_ADDRCONFIG
|
||||
#endif
|
||||
#endif
|
||||
#ifndef AI_ADDRCONFIG
|
||||
/*
|
||||
* logic copied from AI_NUMERICHOST
|
||||
*/
|
||||
#if defined(HAVE_STRUCT_ADDRINFO) && defined(HAVE_GETADDRINFO)
|
||||
#define AI_ADDRCONFIG 0
|
||||
#else
|
||||
#define AI_ADDRCONFIG 0x0020
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef AI_NUMERICSERV
|
||||
/*
|
||||
@ -231,12 +291,11 @@ void rep_freeifaddrs(struct ifaddrs *);
|
||||
#endif
|
||||
|
||||
#ifndef HOST_NAME_MAX
|
||||
#define HOST_NAME_MAX 256
|
||||
#define HOST_NAME_MAX 255
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SOCKLEN_T
|
||||
#define HAVE_SOCKLEN_T
|
||||
typedef int socklen_t;
|
||||
#ifndef MAXHOSTNAMELEN
|
||||
#define MAXHOSTNAMELEN HOST_NAME_MAX
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SA_FAMILY_T
|
||||
@ -250,12 +309,12 @@ typedef unsigned short int sa_family_t;
|
||||
#define sockaddr_storage sockaddr_in6
|
||||
#define ss_family sin6_family
|
||||
#define HAVE_SS_FAMILY 1
|
||||
#else
|
||||
#else /*HAVE_STRUCT_SOCKADDR_IN6*/
|
||||
#define sockaddr_storage sockaddr_in
|
||||
#define ss_family sin_family
|
||||
#define HAVE_SS_FAMILY 1
|
||||
#endif
|
||||
#endif
|
||||
#endif /*HAVE_STRUCT_SOCKADDR_IN6*/
|
||||
#endif /*HAVE_STRUCT_SOCKADDR_STORAGE*/
|
||||
|
||||
#ifndef HAVE_SS_FAMILY
|
||||
#ifdef HAVE___SS_FAMILY
|
||||
@ -264,6 +323,20 @@ typedef unsigned short int sa_family_t;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef IOV_MAX
|
||||
# ifdef UIO_MAXIOV
|
||||
# define IOV_MAX UIO_MAXIOV
|
||||
# else
|
||||
# ifdef __sgi
|
||||
/*
|
||||
* IRIX 6.5 has sysconf(_SC_IOV_MAX)
|
||||
* which might return 512 or bigger
|
||||
*/
|
||||
# define IOV_MAX 512
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRUCT_ADDRINFO
|
||||
#define HAVE_STRUCT_ADDRINFO
|
||||
struct addrinfo {
|
||||
@ -284,14 +357,34 @@ struct addrinfo {
|
||||
|
||||
/* Needed for some systems that don't define it (Solaris). */
|
||||
#ifndef ifr_netmask
|
||||
#define ifr_netmask ifr_addrs
|
||||
#define ifr_netmask ifr_addr
|
||||
#endif
|
||||
|
||||
/* Some old Linux systems have broken header files */
|
||||
#ifdef HAVE_IPV6
|
||||
#ifdef HAVE_LINUX_IPV6_V6ONLY_26
|
||||
#define IPV6_V6ONLY 26
|
||||
#endif /* HAVE_LINUX_IPV6_V6ONLY_26 */
|
||||
#endif /* HAVE_IPV6 */
|
||||
|
||||
#ifdef SOCKET_WRAPPER
|
||||
#ifndef SOCKET_WRAPPER_DISABLE
|
||||
#ifndef SOCKET_WRAPPER_NOT_REPLACE
|
||||
#define SOCKET_WRAPPER_REPLACE
|
||||
#endif
|
||||
#include "lib/socket_wrapper/socket_wrapper.h"
|
||||
#endif
|
||||
#endif /* SOCKET_WRAPPER_NOT_REPLACE */
|
||||
#include "../socket_wrapper/socket_wrapper.h"
|
||||
#endif /* SOCKET_WRAPPER_DISABLE */
|
||||
#endif /* SOCKET_WRAPPER */
|
||||
|
||||
#ifdef UID_WRAPPER
|
||||
# ifndef UID_WRAPPER_DISABLE
|
||||
# ifndef UID_WRAPPER_NOT_REPLACE
|
||||
# define UID_WRAPPER_REPLACE
|
||||
# endif /* UID_WRAPPER_NOT_REPLACE */
|
||||
# include "../uid_wrapper/uid_wrapper.h"
|
||||
# endif /* UID_WRAPPER_DISABLE */
|
||||
#else /* UID_WRAPPER */
|
||||
# define uwrap_enabled() 0
|
||||
#endif /* UID_WRAPPER */
|
||||
|
||||
#endif
|
||||
|
@ -1,17 +1,17 @@
|
||||
#ifndef _system_passwd_h
|
||||
#define _system_passwd_h
|
||||
|
||||
/*
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
|
||||
passwd system include wrappers
|
||||
|
||||
Copyright (C) Andrew Tridgell 2004
|
||||
|
||||
|
||||
** NOTE! The following LGPL license applies to the replace
|
||||
** library. This does NOT imply that all of Samba is released
|
||||
** under the LGPL
|
||||
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
@ -68,15 +68,19 @@
|
||||
#endif
|
||||
|
||||
#ifdef REPLACE_GETPASS
|
||||
#if defined(REPLACE_GETPASS_BY_GETPASSPHRASE)
|
||||
#define getpass(prompt) getpassphrase(prompt)
|
||||
#else
|
||||
#define getpass(prompt) rep_getpass(prompt)
|
||||
char *rep_getpass(const char *prompt);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef NGROUPS_MAX
|
||||
#define NGROUPS_MAX 32 /* Guess... */
|
||||
#endif
|
||||
|
||||
/* what is the longest significant password available on your system?
|
||||
/* what is the longest significant password available on your system?
|
||||
Knowing this speeds up password searches a lot */
|
||||
#ifndef PASSWORD_LENGTH
|
||||
#define PASSWORD_LENGTH 8
|
||||
@ -97,10 +101,23 @@ char *rep_getpass(const char *prompt);
|
||||
#endif
|
||||
|
||||
#ifdef NSS_WRAPPER
|
||||
#ifndef NSS_WRAPPER_DISABLE
|
||||
#ifndef NSS_WRAPPER_NOT_REPLACE
|
||||
#define NSS_WRAPPER_REPLACE
|
||||
#endif
|
||||
#include "lib/nss_wrapper/nss_wrapper.h"
|
||||
#endif
|
||||
#endif /* NSS_WRAPPER_NOT_REPLACE */
|
||||
#include "../nss_wrapper/nss_wrapper.h"
|
||||
#endif /* NSS_WRAPPER_DISABLE */
|
||||
#endif /* NSS_WRAPPER */
|
||||
|
||||
#ifdef UID_WRAPPER
|
||||
# ifndef UID_WRAPPER_DISABLE
|
||||
# ifndef UID_WRAPPER_NOT_REPLACE
|
||||
# define UID_WRAPPER_REPLACE
|
||||
# endif /* UID_WRAPPER_NOT_REPLACE */
|
||||
# include "../uid_wrapper/uid_wrapper.h"
|
||||
# endif /* UID_WRAPPER_DISABLE */
|
||||
#else /* UID_WRAPPER */
|
||||
# define uwrap_enabled() 0
|
||||
#endif /* UID_WRAPPER */
|
||||
|
||||
#endif
|
||||
|
@ -43,7 +43,13 @@
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_NEW_LIBREADLINE
|
||||
# define RL_COMPLETION_CAST (rl_completion_func_t *)
|
||||
#ifdef HAVE_CPPFUNCTION
|
||||
# define RL_COMPLETION_CAST (CPPFunction *)
|
||||
#elif HAVE_RL_COMPLETION_T
|
||||
# define RL_COMPLETION_CAST (rl_completion_t *)
|
||||
#else
|
||||
# define RL_COMPLETION_CAST
|
||||
#endif
|
||||
#else
|
||||
/* This type is missing from libreadline<4.0 (approximately) */
|
||||
# define RL_COMPLETION_CAST
|
||||
|
@ -38,4 +38,40 @@
|
||||
#define SELECT_CAST
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_POLL
|
||||
|
||||
#include <poll.h>
|
||||
|
||||
#else
|
||||
|
||||
/* Type used for the number of file descriptors. */
|
||||
typedef unsigned long int nfds_t;
|
||||
|
||||
/* Data structure describing a polling request. */
|
||||
struct pollfd
|
||||
{
|
||||
int fd; /* File descriptor to poll. */
|
||||
short int events; /* Types of events poller cares about. */
|
||||
short int revents; /* Types of events that actually occurred. */
|
||||
};
|
||||
|
||||
/* Event types that can be polled for. These bits may be set in `events'
|
||||
to indicate the interesting event types; they will appear in `revents'
|
||||
to indicate the status of the file descriptor. */
|
||||
#define POLLIN 0x001 /* There is data to read. */
|
||||
#define POLLPRI 0x002 /* There is urgent data to read. */
|
||||
#define POLLOUT 0x004 /* Writing now will not block. */
|
||||
#define POLLRDNORM 0x040 /* Normal data may be read. */
|
||||
#define POLLRDBAND 0x080 /* Priority data may be read. */
|
||||
#define POLLWRNORM 0x100 /* Writing now will not block. */
|
||||
#define POLLWRBAND 0x200 /* Priority data may be written. */
|
||||
#define POLLERR 0x008 /* Error condition. */
|
||||
#define POLLHUP 0x010 /* Hung up. */
|
||||
#define POLLNVAL 0x020 /* Invalid polling request. */
|
||||
|
||||
/* define is in "replace.h" */
|
||||
int rep_poll(struct pollfd *fds, nfds_t nfds, int timeout);
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -39,6 +39,18 @@
|
||||
|
||||
#ifdef HAVE_UTIME_H
|
||||
#include <utime.h>
|
||||
#else
|
||||
struct utimbuf {
|
||||
time_t actime; /* access time */
|
||||
time_t modtime; /* modification time */
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRUCT_TIMESPEC
|
||||
struct timespec {
|
||||
time_t tv_sec; /* Seconds. */
|
||||
long tv_nsec; /* Nanoseconds. */
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_MKTIME
|
||||
@ -51,4 +63,29 @@ time_t rep_mktime(struct tm *t);
|
||||
time_t rep_timegm(struct tm *tm);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_UTIME
|
||||
/* define is in "replace.h" */
|
||||
int rep_utime(const char *filename, const struct utimbuf *buf);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_UTIMES
|
||||
/* define is in "replace.h" */
|
||||
int rep_utimes(const char *filename, const struct timeval tv[2]);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_CLOCK_GETTIME
|
||||
/* CLOCK_REALTIME is required by POSIX */
|
||||
#define CLOCK_REALTIME 0
|
||||
typedef int clockid_t;
|
||||
int rep_clock_gettime(clockid_t clk_id, struct timespec *tp);
|
||||
#endif
|
||||
/* make sure we have a best effort CUSTOM_CLOCK_MONOTONIC we can rely on */
|
||||
#if defined(CLOCK_MONOTONIC)
|
||||
#define CUSTOM_CLOCK_MONOTONIC CLOCK_MONOTONIC
|
||||
#elif defined(CLOCK_HIGHRES)
|
||||
#define CUSTOM_CLOCK_MONOTONIC CLOCK_HIGHRES
|
||||
#else
|
||||
#define CUSTOM_CLOCK_MONOTONIC CLOCK_REALTIME
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -36,20 +36,16 @@
|
||||
#define SIGCLD SIGCHLD
|
||||
#endif
|
||||
|
||||
#ifndef SIGNAL_CAST
|
||||
#define SIGNAL_CAST (RETSIGTYPE (*)(int))
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SETJMP_H
|
||||
#include <setjmp.h>
|
||||
#endif
|
||||
|
||||
#ifndef SA_RESETHAND
|
||||
#define SA_RESETHAND SA_ONESHOT
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_SIG_ATOMIC_T_TYPE)
|
||||
typedef int sig_atomic_t;
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_WAITPID) && defined(HAVE_WAIT4)
|
||||
int rep_waitpid(pid_t pid,int *status,int options)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
26
ctdb/lib/replace/system/wscript_configure
Normal file
26
ctdb/lib/replace/system/wscript_configure
Normal file
@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
conf.CHECK_HEADERS('sys/capability.h')
|
||||
conf.CHECK_FUNCS('getpwnam_r getpwuid_r getpwent_r')
|
||||
|
||||
# solaris varients of getXXent_r
|
||||
conf.CHECK_C_PROTOTYPE('getpwent_r',
|
||||
'struct passwd *getpwent_r(struct passwd *src, char *buf, int buflen)',
|
||||
define='SOLARIS_GETPWENT_R', headers='pwd.h')
|
||||
conf.CHECK_C_PROTOTYPE('getgrent_r',
|
||||
'struct group *getgrent_r(struct group *src, char *buf, int buflen)',
|
||||
define='SOLARIS_GETGRENT_R', headers='grp.h')
|
||||
|
||||
# the irix varients
|
||||
conf.CHECK_C_PROTOTYPE('getpwent_r',
|
||||
'struct passwd *getpwent_r(struct passwd *src, char *buf, size_t buflen)',
|
||||
define='SOLARIS_GETPWENT_R', headers='pwd.h')
|
||||
conf.CHECK_C_PROTOTYPE('getgrent_r',
|
||||
'struct group *getgrent_r(struct group *src, char *buf, size_t buflen)',
|
||||
define='SOLARIS_GETGRENT_R', headers='grp.h')
|
||||
|
||||
conf.CHECK_FUNCS('getgrouplist')
|
||||
conf.CHECK_HEADERS('ctype.h locale.h langinfo.h')
|
||||
conf.CHECK_HEADERS('fnmatch.h locale.h langinfo.h')
|
||||
conf.CHECK_HEADERS('sys/ipc.h sys/mman.h sys/shm.h')
|
||||
conf.CHECK_HEADERS('termios.h termio.h sys/termio.h')
|
101
ctdb/lib/replace/test/getifaddrs.c
Normal file
101
ctdb/lib/replace/test/getifaddrs.c
Normal file
@ -0,0 +1,101 @@
|
||||
/*
|
||||
* Unix SMB/CIFS implementation.
|
||||
*
|
||||
* libreplace getifaddrs test
|
||||
*
|
||||
* Copyright (C) Michael Adam <obnox@samba.org> 2008
|
||||
*
|
||||
* 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef AUTOCONF_TEST
|
||||
#include "replace.h"
|
||||
#include "system/network.h"
|
||||
#include "replace-test.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_INET_NTOP
|
||||
#define rep_inet_ntop inet_ntop
|
||||
#endif
|
||||
|
||||
static const char *format_sockaddr(struct sockaddr *addr,
|
||||
char *addrstring,
|
||||
socklen_t addrlen)
|
||||
{
|
||||
const char *result = NULL;
|
||||
|
||||
if (addr->sa_family == AF_INET) {
|
||||
result = rep_inet_ntop(AF_INET,
|
||||
&((struct sockaddr_in *)addr)->sin_addr,
|
||||
addrstring,
|
||||
addrlen);
|
||||
#ifdef HAVE_STRUCT_SOCKADDR_IN6
|
||||
} else if (addr->sa_family == AF_INET6) {
|
||||
result = rep_inet_ntop(AF_INET6,
|
||||
&((struct sockaddr_in6 *)addr)->sin6_addr,
|
||||
addrstring,
|
||||
addrlen);
|
||||
#endif
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int getifaddrs_test(void)
|
||||
{
|
||||
struct ifaddrs *ifs = NULL;
|
||||
struct ifaddrs *ifs_head = NULL;
|
||||
int ret;
|
||||
|
||||
ret = getifaddrs(&ifs);
|
||||
ifs_head = ifs;
|
||||
if (ret != 0) {
|
||||
fprintf(stderr, "getifaddrs() failed: %s\n", strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
|
||||
while (ifs) {
|
||||
printf("%-10s ", ifs->ifa_name);
|
||||
if (ifs->ifa_addr != NULL) {
|
||||
char addrstring[INET6_ADDRSTRLEN];
|
||||
const char *result;
|
||||
|
||||
result = format_sockaddr(ifs->ifa_addr,
|
||||
addrstring,
|
||||
sizeof(addrstring));
|
||||
if (result != NULL) {
|
||||
printf("IP=%s ", addrstring);
|
||||
}
|
||||
|
||||
if (ifs->ifa_netmask != NULL) {
|
||||
result = format_sockaddr(ifs->ifa_netmask,
|
||||
addrstring,
|
||||
sizeof(addrstring));
|
||||
if (result != NULL) {
|
||||
printf("NETMASK=%s", addrstring);
|
||||
}
|
||||
} else {
|
||||
printf("AF=%d ", ifs->ifa_addr->sa_family);
|
||||
}
|
||||
} else {
|
||||
printf("<no address>");
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
ifs = ifs->ifa_next;
|
||||
}
|
||||
|
||||
freeifaddrs(ifs_head);
|
||||
|
||||
return 0;
|
||||
}
|
37
ctdb/lib/replace/test/main.c
Normal file
37
ctdb/lib/replace/test/main.c
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
|
||||
libreplace tests
|
||||
|
||||
Copyright (C) Jelmer Vernooij 2006
|
||||
|
||||
** NOTE! The following LGPL license applies to the talloc
|
||||
** library. This does NOT imply that all of Samba is released
|
||||
** under the LGPL
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 3 of the License, or (at your option) any later version.
|
||||
|
||||
This library 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "replace.h"
|
||||
|
||||
struct torture_context;
|
||||
bool torture_local_replace(struct torture_context *ctx);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
bool ret = torture_local_replace(NULL);
|
||||
if (ret)
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
@ -12,6 +12,7 @@
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include "replace-test.h"
|
||||
|
||||
#define NUM_FILES 700
|
||||
#define READDIR_SIZE 100
|
||||
@ -27,10 +28,16 @@ static int test_readdir_os2_delete_ret;
|
||||
#define MIN(a,b) ((a)<(b)?(a):(b))
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#define mkdir(d,m) _mkdir(d)
|
||||
#endif
|
||||
|
||||
static void cleanup(void)
|
||||
{
|
||||
/* I'm a lazy bastard */
|
||||
system("rm -rf " TESTDIR);
|
||||
if (system("rm -rf " TESTDIR)) {
|
||||
FAILED("system");
|
||||
}
|
||||
mkdir(TESTDIR, 0700) == 0 || FAILED("mkdir");
|
||||
}
|
||||
|
||||
@ -39,8 +46,15 @@ static void create_files(void)
|
||||
int i;
|
||||
for (i=0;i<NUM_FILES;i++) {
|
||||
char fname[40];
|
||||
sprintf(fname, TESTDIR "/test%u.txt", i);
|
||||
close(open(fname, O_CREAT|O_RDWR, 0600)) == 0 || FAILED("close");
|
||||
int fd;
|
||||
snprintf(fname, sizeof(fname), TESTDIR "/test%u.txt", i);
|
||||
fd = open(fname, O_CREAT|O_RDWR, 0600);
|
||||
if (fd < 0) {
|
||||
FAILED("open");
|
||||
}
|
||||
if (close(fd) != 0) {
|
||||
FAILED("close");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -66,7 +80,7 @@ static int os2_delete(DIR *d)
|
||||
/* delete the first few */
|
||||
for (j=0; j<MIN(i, DELETE_SIZE); j++) {
|
||||
char fname[40];
|
||||
sprintf(fname, TESTDIR "/%s", names[j]);
|
||||
snprintf(fname, sizeof(fname), TESTDIR "/%s", names[j]);
|
||||
unlink(fname) == 0 || FAILED("unlink");
|
||||
}
|
||||
|
||||
@ -111,5 +125,9 @@ int test_readdir_os2_delete(void)
|
||||
|
||||
rmdir(TESTDIR) == 0 || FAILED("rmdir");
|
||||
|
||||
if (system("rm -rf " TESTDIR) == -1) {
|
||||
FAILED("system");
|
||||
}
|
||||
|
||||
return test_readdir_os2_delete_ret;
|
||||
}
|
||||
|
48
ctdb/lib/replace/test/shared_mremap.c
Normal file
48
ctdb/lib/replace/test/shared_mremap.c
Normal file
@ -0,0 +1,48 @@
|
||||
/* this tests whether we can use mremap */
|
||||
|
||||
#if defined(HAVE_UNISTD_H)
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <sys/mman.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#define DATA "conftest.mmap"
|
||||
|
||||
#ifndef MAP_FILE
|
||||
#define MAP_FILE 0
|
||||
#endif
|
||||
|
||||
#ifndef MAP_FAILED
|
||||
#define MAP_FAILED (int *)-1
|
||||
#endif
|
||||
|
||||
main()
|
||||
{
|
||||
int *buf;
|
||||
int fd;
|
||||
int err = 1;
|
||||
|
||||
fd = open(DATA, O_RDWR|O_CREAT|O_TRUNC, 0666);
|
||||
if (fd == -1) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
buf = (int *)mmap(NULL, 0x1000, PROT_READ | PROT_WRITE,
|
||||
MAP_FILE | MAP_SHARED, fd, 0);
|
||||
if (buf == MAP_FAILED) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
buf = mremap(buf, 0x1000, 0x2000, MREMAP_MAYMOVE);
|
||||
if (buf == MAP_FAILED) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
err = 0;
|
||||
done:
|
||||
close(fd);
|
||||
unlink(DATA);
|
||||
exit(err);
|
||||
}
|
29
ctdb/lib/replace/test/snprintf.c
Normal file
29
ctdb/lib/replace/test/snprintf.c
Normal file
@ -0,0 +1,29 @@
|
||||
void foo(const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int len;
|
||||
char buf[20];
|
||||
long long l = 1234567890;
|
||||
l *= 100;
|
||||
|
||||
va_start(ap, format);
|
||||
len = vsnprintf(buf, 0, format, ap);
|
||||
va_end(ap);
|
||||
if (len != 5) exit(1);
|
||||
|
||||
va_start(ap, format);
|
||||
len = vsnprintf(0, 0, format, ap);
|
||||
va_end(ap);
|
||||
if (len != 5) exit(2);
|
||||
|
||||
if (snprintf(buf, 3, "hello") != 5 || strcmp(buf, "he") != 0) exit(3);
|
||||
|
||||
if (snprintf(buf, 20, "%lld", l) != 12 || strcmp(buf, "123456789000") != 0) exit(4);
|
||||
if (snprintf(buf, 20, "%zu", 123456789) != 9 || strcmp(buf, "123456789") != 0) exit(5);
|
||||
if (snprintf(buf, 20, "%2\$d %1\$d", 3, 4) != 3 || strcmp(buf, "4 3") != 0) exit(6);
|
||||
if (snprintf(buf, 20, "%s", 0) < 3) exit(7);
|
||||
|
||||
printf("1");
|
||||
exit(0);
|
||||
}
|
||||
main() { foo("hello"); }
|
@ -37,7 +37,6 @@
|
||||
#include "system/locale.h"
|
||||
#include "system/network.h"
|
||||
#include "system/passwd.h"
|
||||
#include "system/printing.h"
|
||||
#include "system/readline.h"
|
||||
#include "system/select.h"
|
||||
#include "system/shmem.h"
|
||||
@ -49,6 +48,9 @@
|
||||
|
||||
#define TESTFILE "testfile.dat"
|
||||
|
||||
struct torture_context;
|
||||
bool torture_local_replace(struct torture_context *ctx);
|
||||
|
||||
/*
|
||||
test ftruncate() function
|
||||
*/
|
||||
@ -114,7 +116,27 @@ static int test_strlcpy(void)
|
||||
|
||||
static int test_strlcat(void)
|
||||
{
|
||||
/* FIXME */
|
||||
char tmp[10];
|
||||
printf("test: strlcat\n");
|
||||
strlcpy(tmp, "", sizeof(tmp));
|
||||
if (strlcat(tmp, "bla", 3) != 3) {
|
||||
printf("failure: strlcat [\ninvalid return code\n]\n");
|
||||
return false;
|
||||
}
|
||||
if (strcmp(tmp, "bl") != 0) {
|
||||
printf("failure: strlcat [\nexpected \"bl\", got \"%s\"\n]\n",
|
||||
tmp);
|
||||
return false;
|
||||
}
|
||||
|
||||
strlcpy(tmp, "da", sizeof(tmp));
|
||||
if (strlcat(tmp, "me", 4) != 4) {
|
||||
printf("failure: strlcat [\nexpected \"dam\", got \"%s\"\n]\n",
|
||||
tmp);
|
||||
return false;
|
||||
}
|
||||
|
||||
printf("success: strlcat\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -124,12 +146,6 @@ static int test_mktime(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
static int test_innetgr(void)
|
||||
{
|
||||
/* FIXME */
|
||||
return true;
|
||||
}
|
||||
|
||||
static int test_initgroups(void)
|
||||
{
|
||||
/* FIXME */
|
||||
@ -144,7 +160,16 @@ static int test_memmove(void)
|
||||
|
||||
static int test_strdup(void)
|
||||
{
|
||||
/* FIXME */
|
||||
char *x;
|
||||
printf("test: strdup\n");
|
||||
x = strdup("bla");
|
||||
if (strcmp("bla", x) != 0) {
|
||||
printf("failure: strdup [\nfailed: expected \"bla\", got \"%s\"\n]\n",
|
||||
x);
|
||||
return false;
|
||||
}
|
||||
free(x);
|
||||
printf("success: strdup\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -170,19 +195,109 @@ static int test_timegm(void)
|
||||
|
||||
static int test_setenv(void)
|
||||
{
|
||||
/* FIXME */
|
||||
#define TEST_SETENV(key, value, overwrite, result) do { \
|
||||
int _ret; \
|
||||
char *_v; \
|
||||
_ret = setenv(key, value, overwrite); \
|
||||
if (_ret != 0) { \
|
||||
printf("failure: setenv [\n" \
|
||||
"setenv(%s, %s, %d) failed\n" \
|
||||
"]\n", \
|
||||
key, value, overwrite); \
|
||||
return false; \
|
||||
} \
|
||||
_v=getenv(key); \
|
||||
if (!_v) { \
|
||||
printf("failure: setenv [\n" \
|
||||
"getenv(%s) returned NULL\n" \
|
||||
"]\n", \
|
||||
key); \
|
||||
return false; \
|
||||
} \
|
||||
if (strcmp(result, _v) != 0) { \
|
||||
printf("failure: setenv [\n" \
|
||||
"getenv(%s): '%s' != '%s'\n" \
|
||||
"]\n", \
|
||||
key, result, _v); \
|
||||
return false; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define TEST_UNSETENV(key) do { \
|
||||
char *_v; \
|
||||
unsetenv(key); \
|
||||
_v=getenv(key); \
|
||||
if (_v) { \
|
||||
printf("failure: setenv [\n" \
|
||||
"getenv(%s): NULL != '%s'\n" \
|
||||
"]\n", \
|
||||
SETENVTEST_KEY, _v); \
|
||||
return false; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define SETENVTEST_KEY "SETENVTESTKEY"
|
||||
#define SETENVTEST_VAL "SETENVTESTVAL"
|
||||
|
||||
printf("test: setenv\n");
|
||||
TEST_SETENV(SETENVTEST_KEY, SETENVTEST_VAL"1", 0, SETENVTEST_VAL"1");
|
||||
TEST_SETENV(SETENVTEST_KEY, SETENVTEST_VAL"2", 0, SETENVTEST_VAL"1");
|
||||
TEST_SETENV(SETENVTEST_KEY, SETENVTEST_VAL"3", 1, SETENVTEST_VAL"3");
|
||||
TEST_SETENV(SETENVTEST_KEY, SETENVTEST_VAL"4", 1, SETENVTEST_VAL"4");
|
||||
TEST_UNSETENV(SETENVTEST_KEY);
|
||||
TEST_UNSETENV(SETENVTEST_KEY);
|
||||
TEST_SETENV(SETENVTEST_KEY, SETENVTEST_VAL"5", 0, SETENVTEST_VAL"5");
|
||||
TEST_UNSETENV(SETENVTEST_KEY);
|
||||
TEST_UNSETENV(SETENVTEST_KEY);
|
||||
printf("success: setenv\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
static int test_strndup(void)
|
||||
{
|
||||
/* FIXME */
|
||||
char *x;
|
||||
printf("test: strndup\n");
|
||||
x = strndup("bla", 0);
|
||||
if (strcmp(x, "") != 0) {
|
||||
printf("failure: strndup [\ninvalid\n]\n");
|
||||
return false;
|
||||
}
|
||||
free(x);
|
||||
x = strndup("bla", 2);
|
||||
if (strcmp(x, "bl") != 0) {
|
||||
printf("failure: strndup [\ninvalid\n]\n");
|
||||
return false;
|
||||
}
|
||||
free(x);
|
||||
x = strndup("bla", 10);
|
||||
if (strcmp(x, "bla") != 0) {
|
||||
printf("failure: strndup [\ninvalid\n]\n");
|
||||
return false;
|
||||
}
|
||||
free(x);
|
||||
printf("success: strndup\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
static int test_strnlen(void)
|
||||
{
|
||||
/* FIXME */
|
||||
printf("test: strnlen\n");
|
||||
if (strnlen("bla", 2) != 2) {
|
||||
printf("failure: strnlen [\nunexpected length\n]\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (strnlen("some text\n", 0) != 0) {
|
||||
printf("failure: strnlen [\nunexpected length\n]\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (strnlen("some text", 20) != 9) {
|
||||
printf("failure: strnlen [\nunexpected length\n]\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
printf("success: strnlen\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -206,13 +321,43 @@ static int test_setegid(void)
|
||||
|
||||
static int test_asprintf(void)
|
||||
{
|
||||
/* FIXME */
|
||||
char *x;
|
||||
printf("test: asprintf\n");
|
||||
if (asprintf(&x, "%d", 9) != 1) {
|
||||
printf("failure: asprintf [\ngenerate asprintf\n]\n");
|
||||
return false;
|
||||
}
|
||||
if (strcmp(x, "9") != 0) {
|
||||
printf("failure: asprintf [\ngenerate asprintf\n]\n");
|
||||
return false;
|
||||
}
|
||||
if (asprintf(&x, "dat%s", "a") != 4) {
|
||||
printf("failure: asprintf [\ngenerate asprintf\n]\n");
|
||||
return false;
|
||||
}
|
||||
if (strcmp(x, "data") != 0) {
|
||||
printf("failure: asprintf [\ngenerate asprintf\n]\n");
|
||||
return false;
|
||||
}
|
||||
printf("success: asprintf\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
static int test_snprintf(void)
|
||||
{
|
||||
/* FIXME */
|
||||
char tmp[10];
|
||||
printf("test: snprintf\n");
|
||||
if (snprintf(tmp, 3, "foo%d", 9) != 4) {
|
||||
printf("failure: snprintf [\nsnprintf return code failed\n]\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (strcmp(tmp, "fo") != 0) {
|
||||
printf("failure: snprintf [\nsnprintf failed\n]\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
printf("success: snprintf\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -285,7 +430,14 @@ static int test_strerror(void)
|
||||
|
||||
static int test_errno(void)
|
||||
{
|
||||
/* FIXME */
|
||||
printf("test: errno\n");
|
||||
errno = 3;
|
||||
if (errno != 3) {
|
||||
printf("failure: errno [\nerrno failed\n]\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
printf("success: errno\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -325,15 +477,275 @@ static int test_inet_ntoa(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
#define TEST_STRTO_X(type,fmt,func,str,base,res,diff,rrnoo) do {\
|
||||
type _v; \
|
||||
char _s[64]; \
|
||||
char *_p = NULL;\
|
||||
char *_ep = NULL; \
|
||||
strlcpy(_s, str, sizeof(_s));\
|
||||
if (diff >= 0) { \
|
||||
_ep = &_s[diff]; \
|
||||
} \
|
||||
errno = 0; \
|
||||
_v = func(_s, &_p, base); \
|
||||
if (errno != rrnoo) { \
|
||||
printf("failure: %s [\n" \
|
||||
"\t%s\n" \
|
||||
"\t%s(\"%s\",%d,%d): " fmt " (=/!)= " fmt "\n" \
|
||||
"\terrno: %d != %d\n" \
|
||||
"]\n", \
|
||||
__STRING(func), __location__, __STRING(func), \
|
||||
str, diff, base, res, _v, rrnoo, errno); \
|
||||
return false; \
|
||||
} else if (_v != res) { \
|
||||
printf("failure: %s [\n" \
|
||||
"\t%s\n" \
|
||||
"\t%s(\"%s\",%d,%d): " fmt " != " fmt "\n" \
|
||||
"]\n", \
|
||||
__STRING(func), __location__, __STRING(func), \
|
||||
str, diff, base, res, _v); \
|
||||
return false; \
|
||||
} else if (_p != _ep) { \
|
||||
printf("failure: %s [\n" \
|
||||
"\t%s\n" \
|
||||
"\t%s(\"%s\",%d,%d): " fmt " (=/!)= " fmt "\n" \
|
||||
"\tptr: %p - %p = %d != %d\n" \
|
||||
"]\n", \
|
||||
__STRING(func), __location__, __STRING(func), \
|
||||
str, diff, base, res, _v, _ep, _p, (int)(diff - (_ep - _p)), diff); \
|
||||
return false; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
static int test_strtoll(void)
|
||||
{
|
||||
/* FIXME */
|
||||
printf("test: strtoll\n");
|
||||
|
||||
#define TEST_STRTOLL(str,base,res,diff,errnoo) TEST_STRTO_X(long long int, "%lld", strtoll,str,base,res,diff,errnoo)
|
||||
|
||||
TEST_STRTOLL("15", 10, 15LL, 2, 0);
|
||||
TEST_STRTOLL(" 15", 10, 15LL, 4, 0);
|
||||
TEST_STRTOLL("15", 0, 15LL, 2, 0);
|
||||
TEST_STRTOLL(" 15 ", 0, 15LL, 3, 0);
|
||||
TEST_STRTOLL("+15", 10, 15LL, 3, 0);
|
||||
TEST_STRTOLL(" +15", 10, 15LL, 5, 0);
|
||||
TEST_STRTOLL("+15", 0, 15LL, 3, 0);
|
||||
TEST_STRTOLL(" +15 ", 0, 15LL, 4, 0);
|
||||
TEST_STRTOLL("-15", 10, -15LL, 3, 0);
|
||||
TEST_STRTOLL(" -15", 10, -15LL, 5, 0);
|
||||
TEST_STRTOLL("-15", 0, -15LL, 3, 0);
|
||||
TEST_STRTOLL(" -15 ", 0, -15LL, 4, 0);
|
||||
TEST_STRTOLL("015", 10, 15LL, 3, 0);
|
||||
TEST_STRTOLL(" 015", 10, 15LL, 5, 0);
|
||||
TEST_STRTOLL("015", 0, 13LL, 3, 0);
|
||||
TEST_STRTOLL(" 015", 0, 13LL, 5, 0);
|
||||
TEST_STRTOLL("0x15", 10, 0LL, 1, 0);
|
||||
TEST_STRTOLL(" 0x15", 10, 0LL, 3, 0);
|
||||
TEST_STRTOLL("0x15", 0, 21LL, 4, 0);
|
||||
TEST_STRTOLL(" 0x15", 0, 21LL, 6, 0);
|
||||
|
||||
TEST_STRTOLL("10", 16, 16LL, 2, 0);
|
||||
TEST_STRTOLL(" 10 ", 16, 16LL, 4, 0);
|
||||
TEST_STRTOLL("0x10", 16, 16LL, 4, 0);
|
||||
TEST_STRTOLL("0x10", 0, 16LL, 4, 0);
|
||||
TEST_STRTOLL(" 0x10 ", 0, 16LL, 5, 0);
|
||||
TEST_STRTOLL("+10", 16, 16LL, 3, 0);
|
||||
TEST_STRTOLL(" +10 ", 16, 16LL, 5, 0);
|
||||
TEST_STRTOLL("+0x10", 16, 16LL, 5, 0);
|
||||
TEST_STRTOLL("+0x10", 0, 16LL, 5, 0);
|
||||
TEST_STRTOLL(" +0x10 ", 0, 16LL, 6, 0);
|
||||
TEST_STRTOLL("-10", 16, -16LL, 3, 0);
|
||||
TEST_STRTOLL(" -10 ", 16, -16LL, 5, 0);
|
||||
TEST_STRTOLL("-0x10", 16, -16LL, 5, 0);
|
||||
TEST_STRTOLL("-0x10", 0, -16LL, 5, 0);
|
||||
TEST_STRTOLL(" -0x10 ", 0, -16LL, 6, 0);
|
||||
TEST_STRTOLL("010", 16, 16LL, 3, 0);
|
||||
TEST_STRTOLL(" 010 ", 16, 16LL, 5, 0);
|
||||
TEST_STRTOLL("-010", 16, -16LL, 4, 0);
|
||||
|
||||
TEST_STRTOLL("11", 8, 9LL, 2, 0);
|
||||
TEST_STRTOLL("011", 8, 9LL, 3, 0);
|
||||
TEST_STRTOLL("011", 0, 9LL, 3, 0);
|
||||
TEST_STRTOLL("-11", 8, -9LL, 3, 0);
|
||||
TEST_STRTOLL("-011", 8, -9LL, 4, 0);
|
||||
TEST_STRTOLL("-011", 0, -9LL, 4, 0);
|
||||
|
||||
TEST_STRTOLL("011", 8, 9LL, 3, 0);
|
||||
TEST_STRTOLL("011", 0, 9LL, 3, 0);
|
||||
TEST_STRTOLL("-11", 8, -9LL, 3, 0);
|
||||
TEST_STRTOLL("-011", 8, -9LL, 4, 0);
|
||||
TEST_STRTOLL("-011", 0, -9LL, 4, 0);
|
||||
|
||||
TEST_STRTOLL("Text", 0, 0LL, 0, 0);
|
||||
|
||||
TEST_STRTOLL("9223372036854775807", 10, 9223372036854775807LL, 19, 0);
|
||||
TEST_STRTOLL("9223372036854775807", 0, 9223372036854775807LL, 19, 0);
|
||||
TEST_STRTOLL("9223372036854775808", 0, 9223372036854775807LL, 19, ERANGE);
|
||||
TEST_STRTOLL("9223372036854775808", 10, 9223372036854775807LL, 19, ERANGE);
|
||||
TEST_STRTOLL("0x7FFFFFFFFFFFFFFF", 0, 9223372036854775807LL, 18, 0);
|
||||
TEST_STRTOLL("0x7FFFFFFFFFFFFFFF", 16, 9223372036854775807LL, 18, 0);
|
||||
TEST_STRTOLL("7FFFFFFFFFFFFFFF", 16, 9223372036854775807LL, 16, 0);
|
||||
TEST_STRTOLL("0x8000000000000000", 0, 9223372036854775807LL, 18, ERANGE);
|
||||
TEST_STRTOLL("0x8000000000000000", 16, 9223372036854775807LL, 18, ERANGE);
|
||||
TEST_STRTOLL("80000000000000000", 16, 9223372036854775807LL, 17, ERANGE);
|
||||
TEST_STRTOLL("0777777777777777777777", 0, 9223372036854775807LL, 22, 0);
|
||||
TEST_STRTOLL("0777777777777777777777", 8, 9223372036854775807LL, 22, 0);
|
||||
TEST_STRTOLL("777777777777777777777", 8, 9223372036854775807LL, 21, 0);
|
||||
TEST_STRTOLL("01000000000000000000000", 0, 9223372036854775807LL, 23, ERANGE);
|
||||
TEST_STRTOLL("01000000000000000000000", 8, 9223372036854775807LL, 23, ERANGE);
|
||||
TEST_STRTOLL("1000000000000000000000", 8, 9223372036854775807LL, 22, ERANGE);
|
||||
|
||||
TEST_STRTOLL("-9223372036854775808", 10, -9223372036854775807LL -1, 20, 0);
|
||||
TEST_STRTOLL("-9223372036854775808", 0, -9223372036854775807LL -1, 20, 0);
|
||||
TEST_STRTOLL("-9223372036854775809", 0, -9223372036854775807LL -1, 20, ERANGE);
|
||||
TEST_STRTOLL("-9223372036854775809", 10, -9223372036854775807LL -1, 20, ERANGE);
|
||||
TEST_STRTOLL("-0x8000000000000000", 0, -9223372036854775807LL -1, 19, 0);
|
||||
TEST_STRTOLL("-0x8000000000000000", 16, -9223372036854775807LL -1, 19, 0);
|
||||
TEST_STRTOLL("-8000000000000000", 16, -9223372036854775807LL -1, 17, 0);
|
||||
TEST_STRTOLL("-0x8000000000000001", 0, -9223372036854775807LL -1, 19, ERANGE);
|
||||
TEST_STRTOLL("-0x8000000000000001", 16, -9223372036854775807LL -1, 19, ERANGE);
|
||||
TEST_STRTOLL("-80000000000000001", 16, -9223372036854775807LL -1, 18, ERANGE);
|
||||
TEST_STRTOLL("-01000000000000000000000",0, -9223372036854775807LL -1, 24, 0);
|
||||
TEST_STRTOLL("-01000000000000000000000",8, -9223372036854775807LL -1, 24, 0);
|
||||
TEST_STRTOLL("-1000000000000000000000", 8, -9223372036854775807LL -1, 23, 0);
|
||||
TEST_STRTOLL("-01000000000000000000001",0, -9223372036854775807LL -1, 24, ERANGE);
|
||||
TEST_STRTOLL("-01000000000000000000001",8, -9223372036854775807LL -1, 24, ERANGE);
|
||||
TEST_STRTOLL("-1000000000000000000001", 8, -9223372036854775807LL -1, 23, ERANGE);
|
||||
|
||||
printf("success: strtoll\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
static int test_strtoull(void)
|
||||
{
|
||||
/* FIXME */
|
||||
printf("test: strtoull\n");
|
||||
|
||||
#define TEST_STRTOULL(str,base,res,diff,errnoo) TEST_STRTO_X(long long unsigned int,"%llu",strtoull,str,base,res,diff,errnoo)
|
||||
|
||||
TEST_STRTOULL("15", 10, 15LLU, 2, 0);
|
||||
TEST_STRTOULL(" 15", 10, 15LLU, 4, 0);
|
||||
TEST_STRTOULL("15", 0, 15LLU, 2, 0);
|
||||
TEST_STRTOULL(" 15 ", 0, 15LLU, 3, 0);
|
||||
TEST_STRTOULL("+15", 10, 15LLU, 3, 0);
|
||||
TEST_STRTOULL(" +15", 10, 15LLU, 5, 0);
|
||||
TEST_STRTOULL("+15", 0, 15LLU, 3, 0);
|
||||
TEST_STRTOULL(" +15 ", 0, 15LLU, 4, 0);
|
||||
TEST_STRTOULL("-15", 10, 18446744073709551601LLU, 3, 0);
|
||||
TEST_STRTOULL(" -15", 10, 18446744073709551601LLU, 5, 0);
|
||||
TEST_STRTOULL("-15", 0, 18446744073709551601LLU, 3, 0);
|
||||
TEST_STRTOULL(" -15 ", 0, 18446744073709551601LLU, 4, 0);
|
||||
TEST_STRTOULL("015", 10, 15LLU, 3, 0);
|
||||
TEST_STRTOULL(" 015", 10, 15LLU, 5, 0);
|
||||
TEST_STRTOULL("015", 0, 13LLU, 3, 0);
|
||||
TEST_STRTOULL(" 015", 0, 13LLU, 5, 0);
|
||||
TEST_STRTOULL("0x15", 10, 0LLU, 1, 0);
|
||||
TEST_STRTOULL(" 0x15", 10, 0LLU, 3, 0);
|
||||
TEST_STRTOULL("0x15", 0, 21LLU, 4, 0);
|
||||
TEST_STRTOULL(" 0x15", 0, 21LLU, 6, 0);
|
||||
|
||||
TEST_STRTOULL("10", 16, 16LLU, 2, 0);
|
||||
TEST_STRTOULL(" 10 ", 16, 16LLU, 4, 0);
|
||||
TEST_STRTOULL("0x10", 16, 16LLU, 4, 0);
|
||||
TEST_STRTOULL("0x10", 0, 16LLU, 4, 0);
|
||||
TEST_STRTOULL(" 0x10 ", 0, 16LLU, 5, 0);
|
||||
TEST_STRTOULL("+10", 16, 16LLU, 3, 0);
|
||||
TEST_STRTOULL(" +10 ", 16, 16LLU, 5, 0);
|
||||
TEST_STRTOULL("+0x10", 16, 16LLU, 5, 0);
|
||||
TEST_STRTOULL("+0x10", 0, 16LLU, 5, 0);
|
||||
TEST_STRTOULL(" +0x10 ", 0, 16LLU, 6, 0);
|
||||
TEST_STRTOULL("-10", 16, -16LLU, 3, 0);
|
||||
TEST_STRTOULL(" -10 ", 16, -16LLU, 5, 0);
|
||||
TEST_STRTOULL("-0x10", 16, -16LLU, 5, 0);
|
||||
TEST_STRTOULL("-0x10", 0, -16LLU, 5, 0);
|
||||
TEST_STRTOULL(" -0x10 ", 0, -16LLU, 6, 0);
|
||||
TEST_STRTOULL("010", 16, 16LLU, 3, 0);
|
||||
TEST_STRTOULL(" 010 ", 16, 16LLU, 5, 0);
|
||||
TEST_STRTOULL("-010", 16, -16LLU, 4, 0);
|
||||
|
||||
TEST_STRTOULL("11", 8, 9LLU, 2, 0);
|
||||
TEST_STRTOULL("011", 8, 9LLU, 3, 0);
|
||||
TEST_STRTOULL("011", 0, 9LLU, 3, 0);
|
||||
TEST_STRTOULL("-11", 8, -9LLU, 3, 0);
|
||||
TEST_STRTOULL("-011", 8, -9LLU, 4, 0);
|
||||
TEST_STRTOULL("-011", 0, -9LLU, 4, 0);
|
||||
|
||||
TEST_STRTOULL("011", 8, 9LLU, 3, 0);
|
||||
TEST_STRTOULL("011", 0, 9LLU, 3, 0);
|
||||
TEST_STRTOULL("-11", 8, -9LLU, 3, 0);
|
||||
TEST_STRTOULL("-011", 8, -9LLU, 4, 0);
|
||||
TEST_STRTOULL("-011", 0, -9LLU, 4, 0);
|
||||
|
||||
TEST_STRTOULL("Text", 0, 0LLU, 0, 0);
|
||||
|
||||
TEST_STRTOULL("9223372036854775807", 10, 9223372036854775807LLU, 19, 0);
|
||||
TEST_STRTOULL("9223372036854775807", 0, 9223372036854775807LLU, 19, 0);
|
||||
TEST_STRTOULL("9223372036854775808", 0, 9223372036854775808LLU, 19, 0);
|
||||
TEST_STRTOULL("9223372036854775808", 10, 9223372036854775808LLU, 19, 0);
|
||||
TEST_STRTOULL("0x7FFFFFFFFFFFFFFF", 0, 9223372036854775807LLU, 18, 0);
|
||||
TEST_STRTOULL("0x7FFFFFFFFFFFFFFF", 16, 9223372036854775807LLU, 18, 0);
|
||||
TEST_STRTOULL("7FFFFFFFFFFFFFFF", 16, 9223372036854775807LLU, 16, 0);
|
||||
TEST_STRTOULL("0x8000000000000000", 0, 9223372036854775808LLU, 18, 0);
|
||||
TEST_STRTOULL("0x8000000000000000", 16, 9223372036854775808LLU, 18, 0);
|
||||
TEST_STRTOULL("8000000000000000", 16, 9223372036854775808LLU, 16, 0);
|
||||
TEST_STRTOULL("0777777777777777777777", 0, 9223372036854775807LLU, 22, 0);
|
||||
TEST_STRTOULL("0777777777777777777777", 8, 9223372036854775807LLU, 22, 0);
|
||||
TEST_STRTOULL("777777777777777777777", 8, 9223372036854775807LLU, 21, 0);
|
||||
TEST_STRTOULL("01000000000000000000000",0, 9223372036854775808LLU, 23, 0);
|
||||
TEST_STRTOULL("01000000000000000000000",8, 9223372036854775808LLU, 23, 0);
|
||||
TEST_STRTOULL("1000000000000000000000", 8, 9223372036854775808LLU, 22, 0);
|
||||
|
||||
TEST_STRTOULL("-9223372036854775808", 10, 9223372036854775808LLU, 20, 0);
|
||||
TEST_STRTOULL("-9223372036854775808", 0, 9223372036854775808LLU, 20, 0);
|
||||
TEST_STRTOULL("-9223372036854775809", 0, 9223372036854775807LLU, 20, 0);
|
||||
TEST_STRTOULL("-9223372036854775809", 10, 9223372036854775807LLU, 20, 0);
|
||||
TEST_STRTOULL("-0x8000000000000000", 0, 9223372036854775808LLU, 19, 0);
|
||||
TEST_STRTOULL("-0x8000000000000000", 16, 9223372036854775808LLU, 19, 0);
|
||||
TEST_STRTOULL("-8000000000000000", 16, 9223372036854775808LLU, 17, 0);
|
||||
TEST_STRTOULL("-0x8000000000000001", 0, 9223372036854775807LLU, 19, 0);
|
||||
TEST_STRTOULL("-0x8000000000000001", 16, 9223372036854775807LLU, 19, 0);
|
||||
TEST_STRTOULL("-8000000000000001", 16, 9223372036854775807LLU, 17, 0);
|
||||
TEST_STRTOULL("-01000000000000000000000",0, 9223372036854775808LLU, 24, 0);
|
||||
TEST_STRTOULL("-01000000000000000000000",8, 9223372036854775808LLU, 24, 0);
|
||||
TEST_STRTOULL("-1000000000000000000000",8, 9223372036854775808LLU, 23, 0);
|
||||
TEST_STRTOULL("-01000000000000000000001",0, 9223372036854775807LLU, 24, 0);
|
||||
TEST_STRTOULL("-01000000000000000000001",8, 9223372036854775807LLU, 24, 0);
|
||||
TEST_STRTOULL("-1000000000000000000001",8, 9223372036854775807LLU, 23, 0);
|
||||
|
||||
TEST_STRTOULL("18446744073709551615", 0, 18446744073709551615LLU, 20, 0);
|
||||
TEST_STRTOULL("18446744073709551615", 10, 18446744073709551615LLU, 20, 0);
|
||||
TEST_STRTOULL("18446744073709551616", 0, 18446744073709551615LLU, 20, ERANGE);
|
||||
TEST_STRTOULL("18446744073709551616", 10, 18446744073709551615LLU, 20, ERANGE);
|
||||
TEST_STRTOULL("0xFFFFFFFFFFFFFFFF", 0, 18446744073709551615LLU, 18, 0);
|
||||
TEST_STRTOULL("0xFFFFFFFFFFFFFFFF", 16, 18446744073709551615LLU, 18, 0);
|
||||
TEST_STRTOULL("FFFFFFFFFFFFFFFF", 16, 18446744073709551615LLU, 16, 0);
|
||||
TEST_STRTOULL("0x10000000000000000", 0, 18446744073709551615LLU, 19, ERANGE);
|
||||
TEST_STRTOULL("0x10000000000000000", 16, 18446744073709551615LLU, 19, ERANGE);
|
||||
TEST_STRTOULL("10000000000000000", 16, 18446744073709551615LLU, 17, ERANGE);
|
||||
TEST_STRTOULL("01777777777777777777777",0, 18446744073709551615LLU, 23, 0);
|
||||
TEST_STRTOULL("01777777777777777777777",8, 18446744073709551615LLU, 23, 0);
|
||||
TEST_STRTOULL("1777777777777777777777", 8, 18446744073709551615LLU, 22, 0);
|
||||
TEST_STRTOULL("02000000000000000000000",0, 18446744073709551615LLU, 23, ERANGE);
|
||||
TEST_STRTOULL("02000000000000000000000",8, 18446744073709551615LLU, 23, ERANGE);
|
||||
TEST_STRTOULL("2000000000000000000000", 8, 18446744073709551615LLU, 22, ERANGE);
|
||||
|
||||
TEST_STRTOULL("-18446744073709551615", 0, 1LLU, 21, 0);
|
||||
TEST_STRTOULL("-18446744073709551615", 10, 1LLU, 21, 0);
|
||||
TEST_STRTOULL("-18446744073709551616", 0, 18446744073709551615LLU, 21, ERANGE);
|
||||
TEST_STRTOULL("-18446744073709551616", 10, 18446744073709551615LLU, 21, ERANGE);
|
||||
TEST_STRTOULL("-0xFFFFFFFFFFFFFFFF", 0, 1LLU, 19, 0);
|
||||
TEST_STRTOULL("-0xFFFFFFFFFFFFFFFF", 16, 1LLU, 19, 0);
|
||||
TEST_STRTOULL("-FFFFFFFFFFFFFFFF", 16, 1LLU, 17, 0);
|
||||
TEST_STRTOULL("-0x10000000000000000", 0, 18446744073709551615LLU, 20, ERANGE);
|
||||
TEST_STRTOULL("-0x10000000000000000", 16, 18446744073709551615LLU, 20, ERANGE);
|
||||
TEST_STRTOULL("-10000000000000000", 16, 18446744073709551615LLU, 18, ERANGE);
|
||||
TEST_STRTOULL("-01777777777777777777777",0, 1LLU, 24, 0);
|
||||
TEST_STRTOULL("-01777777777777777777777",8, 1LLU, 24, 0);
|
||||
TEST_STRTOULL("-1777777777777777777777",8, 1LLU, 23, 0);
|
||||
TEST_STRTOULL("-02000000000000000000000",0, 18446744073709551615LLU, 24, ERANGE);
|
||||
TEST_STRTOULL("-02000000000000000000000",8, 18446744073709551615LLU, 24, ERANGE);
|
||||
TEST_STRTOULL("-2000000000000000000000",8, 18446744073709551615LLU, 23, ERANGE);
|
||||
|
||||
printf("success: strtoull\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -342,7 +754,6 @@ FIXME:
|
||||
Types:
|
||||
bool
|
||||
socklen_t
|
||||
uint_t
|
||||
uint{8,16,32,64}_t
|
||||
int{8,16,32,64}_t
|
||||
intptr_t
|
||||
@ -361,19 +772,42 @@ static int test_va_copy(void)
|
||||
|
||||
static int test_FUNCTION(void)
|
||||
{
|
||||
/* FIXME: test __FUNCTION__ macro */
|
||||
printf("test: FUNCTION\n");
|
||||
if (strcmp(__FUNCTION__, "test_FUNCTION") != 0) {
|
||||
printf("failure: FUNCTION [\nFUNCTION invalid\n]\n");
|
||||
return false;
|
||||
}
|
||||
printf("success: FUNCTION\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
static int test_MIN(void)
|
||||
{
|
||||
/* FIXME */
|
||||
printf("test: MIN\n");
|
||||
if (MIN(20, 1) != 1) {
|
||||
printf("failure: MIN [\nMIN invalid\n]\n");
|
||||
return false;
|
||||
}
|
||||
if (MIN(1, 20) != 1) {
|
||||
printf("failure: MIN [\nMIN invalid\n]\n");
|
||||
return false;
|
||||
}
|
||||
printf("success: MIN\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
static int test_MAX(void)
|
||||
{
|
||||
/* FIXME */
|
||||
printf("test: MAX\n");
|
||||
if (MAX(20, 1) != 20) {
|
||||
printf("failure: MAX [\nMAX invalid\n]\n");
|
||||
return false;
|
||||
}
|
||||
if (MAX(1, 20) != 20) {
|
||||
printf("failure: MAX [\nMAX invalid\n]\n");
|
||||
return false;
|
||||
}
|
||||
printf("success: MAX\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -417,7 +851,210 @@ static int test_socketpair(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
struct torture_context;
|
||||
extern int libreplace_test_strptime(void);
|
||||
|
||||
static int test_strptime(void)
|
||||
{
|
||||
return libreplace_test_strptime();
|
||||
}
|
||||
|
||||
extern int getifaddrs_test(void);
|
||||
|
||||
static int test_getifaddrs(void)
|
||||
{
|
||||
|
||||
printf("test: getifaddrs\n");
|
||||
|
||||
if (getifaddrs_test() != 0) {
|
||||
printf("failure: getifaddrs\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
printf("success: getifaddrs\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
static int test_utime(void)
|
||||
{
|
||||
struct utimbuf u;
|
||||
struct stat st1, st2, st3;
|
||||
int fd;
|
||||
|
||||
printf("test: utime\n");
|
||||
unlink(TESTFILE);
|
||||
|
||||
fd = open(TESTFILE, O_RDWR|O_CREAT, 0600);
|
||||
if (fd == -1) {
|
||||
printf("failure: utime [\n"
|
||||
"creating '%s' failed - %s\n]\n",
|
||||
TESTFILE, strerror(errno));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (fstat(fd, &st1) != 0) {
|
||||
printf("failure: utime [\n"
|
||||
"fstat (1) failed - %s\n]\n",
|
||||
strerror(errno));
|
||||
return false;
|
||||
}
|
||||
|
||||
u.actime = st1.st_atime + 300;
|
||||
u.modtime = st1.st_mtime - 300;
|
||||
if (utime(TESTFILE, &u) != 0) {
|
||||
printf("failure: utime [\n"
|
||||
"utime(&u) failed - %s\n]\n",
|
||||
strerror(errno));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (fstat(fd, &st2) != 0) {
|
||||
printf("failure: utime [\n"
|
||||
"fstat (2) failed - %s\n]\n",
|
||||
strerror(errno));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (utime(TESTFILE, NULL) != 0) {
|
||||
printf("failure: utime [\n"
|
||||
"utime(NULL) failed - %s\n]\n",
|
||||
strerror(errno));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (fstat(fd, &st3) != 0) {
|
||||
printf("failure: utime [\n"
|
||||
"fstat (3) failed - %s\n]\n",
|
||||
strerror(errno));
|
||||
return false;
|
||||
}
|
||||
|
||||
#define CMP_VAL(a,c,b) do { \
|
||||
if (a c b) { \
|
||||
printf("failure: utime [\n" \
|
||||
"%s: %s(%d) %s %s(%d)\n]\n", \
|
||||
__location__, \
|
||||
#a, (int)a, #c, #b, (int)b); \
|
||||
return false; \
|
||||
} \
|
||||
} while(0)
|
||||
#define EQUAL_VAL(a,b) CMP_VAL(a,!=,b)
|
||||
#define GREATER_VAL(a,b) CMP_VAL(a,<=,b)
|
||||
#define LESSER_VAL(a,b) CMP_VAL(a,>=,b)
|
||||
|
||||
EQUAL_VAL(st2.st_atime, st1.st_atime + 300);
|
||||
EQUAL_VAL(st2.st_mtime, st1.st_mtime - 300);
|
||||
LESSER_VAL(st3.st_atime, st2.st_atime);
|
||||
GREATER_VAL(st3.st_mtime, st2.st_mtime);
|
||||
|
||||
#undef CMP_VAL
|
||||
#undef EQUAL_VAL
|
||||
#undef GREATER_VAL
|
||||
#undef LESSER_VAL
|
||||
|
||||
unlink(TESTFILE);
|
||||
printf("success: utime\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
static int test_utimes(void)
|
||||
{
|
||||
struct timeval tv[2];
|
||||
struct stat st1, st2;
|
||||
int fd;
|
||||
|
||||
printf("test: utimes\n");
|
||||
unlink(TESTFILE);
|
||||
|
||||
fd = open(TESTFILE, O_RDWR|O_CREAT, 0600);
|
||||
if (fd == -1) {
|
||||
printf("failure: utimes [\n"
|
||||
"creating '%s' failed - %s\n]\n",
|
||||
TESTFILE, strerror(errno));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (fstat(fd, &st1) != 0) {
|
||||
printf("failure: utimes [\n"
|
||||
"fstat (1) failed - %s\n]\n",
|
||||
strerror(errno));
|
||||
return false;
|
||||
}
|
||||
|
||||
ZERO_STRUCT(tv);
|
||||
tv[0].tv_sec = st1.st_atime + 300;
|
||||
tv[1].tv_sec = st1.st_mtime - 300;
|
||||
if (utimes(TESTFILE, tv) != 0) {
|
||||
printf("failure: utimes [\n"
|
||||
"utimes(tv) failed - %s\n]\n",
|
||||
strerror(errno));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (fstat(fd, &st2) != 0) {
|
||||
printf("failure: utimes [\n"
|
||||
"fstat (2) failed - %s\n]\n",
|
||||
strerror(errno));
|
||||
return false;
|
||||
}
|
||||
|
||||
#define EQUAL_VAL(a,b) do { \
|
||||
if (a != b) { \
|
||||
printf("failure: utimes [\n" \
|
||||
"%s: %s(%d) != %s(%d)\n]\n", \
|
||||
__location__, \
|
||||
#a, (int)a, #b, (int)b); \
|
||||
return false; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
EQUAL_VAL(st2.st_atime, st1.st_atime + 300);
|
||||
EQUAL_VAL(st2.st_mtime, st1.st_mtime - 300);
|
||||
|
||||
#undef EQUAL_VAL
|
||||
|
||||
unlink(TESTFILE);
|
||||
printf("success: utimes\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
static int test_memmem(void)
|
||||
{
|
||||
char *s;
|
||||
|
||||
printf("test: memmem\n");
|
||||
|
||||
s = (char *)memmem("foo", 3, "fo", 2);
|
||||
if (strcmp(s, "foo") != 0) {
|
||||
printf(__location__ ": Failed memmem\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
s = (char *)memmem("foo", 3, "", 0);
|
||||
/* it is allowable for this to return NULL (as happens on
|
||||
FreeBSD) */
|
||||
if (s && strcmp(s, "foo") != 0) {
|
||||
printf(__location__ ": Failed memmem\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
s = (char *)memmem("foo", 4, "o", 1);
|
||||
if (strcmp(s, "oo") != 0) {
|
||||
printf(__location__ ": Failed memmem\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
s = (char *)memmem("foobarfodx", 11, "fod", 3);
|
||||
if (strcmp(s, "fodx") != 0) {
|
||||
printf(__location__ ": Failed memmem\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
printf("success: memmem\n");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool torture_local_replace(struct torture_context *ctx)
|
||||
{
|
||||
bool ret = true;
|
||||
@ -425,7 +1062,6 @@ bool torture_local_replace(struct torture_context *ctx)
|
||||
ret &= test_strlcpy();
|
||||
ret &= test_strlcat();
|
||||
ret &= test_mktime();
|
||||
ret &= test_innetgr();
|
||||
ret &= test_initgroups();
|
||||
ret &= test_memmove();
|
||||
ret &= test_strdup();
|
||||
@ -458,23 +1094,17 @@ bool torture_local_replace(struct torture_context *ctx)
|
||||
ret &= test_getpass();
|
||||
ret &= test_inet_ntoa();
|
||||
ret &= test_strtoll();
|
||||
ret &= test_strtoll();
|
||||
ret &= test_strtoull();
|
||||
ret &= test_va_copy();
|
||||
ret &= test_FUNCTION();
|
||||
ret &= test_MIN();
|
||||
ret &= test_MAX();
|
||||
ret &= test_socketpair();
|
||||
ret &= test_strptime();
|
||||
ret &= test_getifaddrs();
|
||||
ret &= test_utime();
|
||||
ret &= test_utimes();
|
||||
ret &= test_memmem();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if _SAMBA_BUILD_<4
|
||||
int main(void)
|
||||
{
|
||||
bool ret = torture_local_replace(NULL);
|
||||
if (ret)
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
@ -1 +1 @@
|
||||
AC_CHECK_FUNCS(timegm,[],[LIBREPLACEOBJ="${LIBREPLACEOBJ} timegm.o"])
|
||||
AC_CHECK_FUNCS(timegm,[],[LIBREPLACEOBJ="${LIBREPLACEOBJ} $libreplacedir/timegm.o"])
|
||||
|
@ -2,7 +2,7 @@ AC_CHECK_HEADERS(direct.h windows.h winsock2.h ws2tcpip.h)
|
||||
|
||||
#######################################
|
||||
# Check for mkdir mode
|
||||
AC_CACHE_CHECK( [whether mkdir supports mode], ac_cv_mkdir_has_mode,
|
||||
AC_CACHE_CHECK( [whether mkdir supports mode], libreplace_cv_mkdir_has_mode,
|
||||
AC_TRY_COMPILE([
|
||||
#include <stdio.h>
|
||||
#ifdef HAVE_DIRECT_H
|
||||
@ -11,10 +11,10 @@ AC_CACHE_CHECK( [whether mkdir supports mode], ac_cv_mkdir_has_mode,
|
||||
mkdir("foo",0777);
|
||||
return 0;
|
||||
],
|
||||
ac_cv_mkdir_has_mode="yes",
|
||||
ac_cv_mkdir_has_mode="no") )
|
||||
libreplace_cv_mkdir_has_mode="yes",
|
||||
libreplace_cv_mkdir_has_mode="no") )
|
||||
|
||||
if test "$ac_cv_mkdir_has_mode" = "yes"
|
||||
if test "$libreplace_cv_mkdir_has_mode" = "yes"
|
||||
then
|
||||
AC_DEFINE(HAVE_MKDIR_MODE, 1, [Define if target mkdir supports mode option])
|
||||
fi
|
||||
|
466
ctdb/lib/replace/wscript
Normal file
466
ctdb/lib/replace/wscript
Normal file
@ -0,0 +1,466 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
APPNAME = 'libreplace'
|
||||
VERSION = '1.2.1'
|
||||
|
||||
blddir = 'bin'
|
||||
|
||||
import sys, os, Utils
|
||||
|
||||
# find the buildtools directory
|
||||
srcdir = '.'
|
||||
while not os.path.exists(srcdir+'/buildtools') and len(srcdir.split('/')) < 5:
|
||||
srcdir = '../' + srcdir
|
||||
sys.path.insert(0, srcdir + '/buildtools/wafsamba')
|
||||
|
||||
import wafsamba, samba_dist
|
||||
import Options, os, preproc
|
||||
|
||||
samba_dist.DIST_DIRS('lib/replace buildtools:buildtools')
|
||||
|
||||
def set_options(opt):
|
||||
opt.BUILTIN_DEFAULT('NONE')
|
||||
opt.PRIVATE_EXTENSION_DEFAULT('')
|
||||
opt.RECURSE('buildtools/wafsamba')
|
||||
|
||||
@wafsamba.runonce
|
||||
def configure(conf):
|
||||
conf.RECURSE('buildtools/wafsamba')
|
||||
|
||||
conf.env.standalone_replace = conf.IN_LAUNCH_DIR()
|
||||
|
||||
conf.DEFINE('HAVE_LIBREPLACE', 1)
|
||||
conf.DEFINE('LIBREPLACE_NETWORK_CHECKS', 1)
|
||||
|
||||
# on Tru64 certain features are only available with _OSF_SOURCE set to 1
|
||||
# and _XOPEN_SOURCE set to 600
|
||||
if conf.env['SYSTEM_UNAME_SYSNAME'] == 'OSF1':
|
||||
conf.DEFINE('_OSF_SOURCE', 1, add_to_cflags=True)
|
||||
conf.DEFINE('_XOPEN_SOURCE', 600, add_to_cflags=True)
|
||||
|
||||
conf.CHECK_HEADERS('linux/types.h crypt.h locale.h acl/libacl.h compat.h')
|
||||
conf.CHECK_HEADERS('acl/libacl.h attr/xattr.h compat.h ctype.h dustat.h')
|
||||
conf.CHECK_HEADERS('fcntl.h fnmatch.h glob.h history.h krb5.h langinfo.h')
|
||||
conf.CHECK_HEADERS('libaio.h locale.h ndir.h pwd.h')
|
||||
conf.CHECK_HEADERS('shadow.h sys/acl.h')
|
||||
conf.CHECK_HEADERS('sys/attributes.h sys/capability.h sys/dir.h sys/epoll.h')
|
||||
conf.CHECK_HEADERS('sys/fcntl.h sys/filio.h sys/filsys.h sys/fs/s5param.h sys/fs/vx/quota.h')
|
||||
conf.CHECK_HEADERS('sys/id.h sys/ioctl.h sys/ipc.h sys/mman.h sys/mode.h sys/ndir.h sys/priv.h')
|
||||
conf.CHECK_HEADERS('sys/resource.h sys/security.h sys/shm.h sys/statfs.h sys/statvfs.h sys/termio.h')
|
||||
conf.CHECK_HEADERS('sys/vfs.h sys/xattr.h termio.h termios.h sys/file.h')
|
||||
conf.CHECK_HEADERS('sys/wait.h sys/stat.h malloc.h grp.h')
|
||||
conf.CHECK_HEADERS('sys/select.h setjmp.h utime.h sys/syslog.h syslog.h')
|
||||
conf.CHECK_HEADERS('stdarg.h vararg.h sys/mount.h mntent.h')
|
||||
conf.CHECK_HEADERS('stropts.h unix.h string.h strings.h sys/param.h limits.h')
|
||||
conf.CHECK_HEADERS('''sys/socket.h netinet/in.h netdb.h arpa/inet.h netinet/in_systm.h
|
||||
netinet/ip.h netinet/tcp.h netinet/in_ip.h
|
||||
sys/sockio.h sys/un.h''', together=True)
|
||||
conf.CHECK_HEADERS('sys/uio.h ifaddrs.h direct.h dirent.h')
|
||||
conf.CHECK_HEADERS('windows.h winsock2.h ws2tcpip.h')
|
||||
conf.CHECK_HEADERS('libintl.h errno.h')
|
||||
conf.CHECK_HEADERS('gcrypt.h getopt.h iconv.h')
|
||||
conf.CHECK_HEADERS('sys/inotify.h memory.h nss.h sasl/sasl.h')
|
||||
conf.CHECK_HEADERS('security/pam_appl.h sys/inotify.h zlib.h asm/unistd.h')
|
||||
conf.CHECK_HEADERS('aio.h sys/unistd.h rpc/rpc.h rpc/nettype.h alloca.h float.h')
|
||||
|
||||
conf.CHECK_HEADERS('rpcsvc/nis.h rpcsvc/ypclnt.h sys/prctl.h sys/sysctl.h')
|
||||
conf.CHECK_HEADERS('sys/fileio.h sys/filesys.h sys/dustat.h sys/sysmacros.h')
|
||||
conf.CHECK_HEADERS('xfs/libxfs.h netgroup.h rpcsvc/yp_prot.h')
|
||||
conf.CHECK_HEADERS('valgrind.h valgrind/valgrind.h valgrind/memcheck.h')
|
||||
conf.CHECK_HEADERS('nss_common.h nsswitch.h ns_api.h')
|
||||
conf.CHECK_HEADERS('sys/extattr.h sys/ea.h sys/proplist.h sys/cdefs.h')
|
||||
conf.CHECK_HEADERS('utmp.h utmpx.h lastlog.h')
|
||||
conf.CHECK_HEADERS('syscall.h sys/syscall.h inttypes.h')
|
||||
|
||||
conf.CHECK_TYPES('"long long" intptr_t uintptr_t ptrdiff_t comparison_fn_t')
|
||||
conf.CHECK_TYPE('_Bool', define='HAVE__Bool')
|
||||
conf.CHECK_TYPE('bool', define='HAVE_BOOL')
|
||||
|
||||
conf.CHECK_TYPE('int8_t', 'char')
|
||||
conf.CHECK_TYPE('uint8_t', 'unsigned char')
|
||||
conf.CHECK_TYPE('int16_t', 'short')
|
||||
conf.CHECK_TYPE('uint16_t', 'unsigned short')
|
||||
conf.CHECK_TYPE('int32_t', 'int')
|
||||
conf.CHECK_TYPE('uint32_t', 'unsigned')
|
||||
conf.CHECK_TYPE('int64_t', 'long long')
|
||||
conf.CHECK_TYPE('uint64_t', 'unsigned long long')
|
||||
conf.CHECK_TYPE('size_t', 'unsigned int')
|
||||
conf.CHECK_TYPE('ssize_t', 'int')
|
||||
conf.CHECK_TYPE('ino_t', 'unsigned')
|
||||
conf.CHECK_TYPE('loff_t', 'off_t')
|
||||
conf.CHECK_TYPE('offset_t', 'loff_t')
|
||||
conf.CHECK_TYPE('volatile int', define='HAVE_VOLATILE')
|
||||
conf.CHECK_TYPE('uint_t', 'unsigned int')
|
||||
|
||||
conf.CHECK_SIZEOF('bool char int "long long" long short size_t ssize_t')
|
||||
conf.CHECK_SIZEOF('int8_t uint8_t int16_t uint16_t int32_t uint32_t int64_t uint64_t')
|
||||
conf.CHECK_SIZEOF('void*', define='SIZEOF_VOID_P')
|
||||
conf.CHECK_SIZEOF('off_t dev_t ino_t time_t')
|
||||
|
||||
conf.CHECK_TYPES('socklen_t', headers='sys/socket.h')
|
||||
conf.CHECK_TYPE_IN('struct ifaddrs', 'ifaddrs.h')
|
||||
conf.CHECK_TYPE_IN('struct addrinfo', 'netdb.h')
|
||||
conf.CHECK_TYPE_IN('struct sockaddr', 'sys/socket.h')
|
||||
conf.CHECK_CODE('struct sockaddr_in6 x', define='HAVE_STRUCT_SOCKADDR_IN6',
|
||||
headers='sys/socket.h netdb.h netinet/in.h')
|
||||
conf.CHECK_TYPE_IN('struct sockaddr_storage', 'sys/socket.h')
|
||||
conf.CHECK_TYPE_IN('sa_family_t', 'sys/socket.h')
|
||||
|
||||
conf.CHECK_TYPE_IN('sig_atomic_t', 'signal.h', define='HAVE_SIG_ATOMIC_T_TYPE')
|
||||
|
||||
conf.CHECK_FUNCS_IN('''inet_ntoa inet_aton inet_ntop inet_pton connect gethostbyname
|
||||
getaddrinfo getnameinfo freeaddrinfo gai_strerror socketpair''',
|
||||
'socket nsl', checklibc=True,
|
||||
headers='sys/socket.h netinet/in.h arpa/inet.h netdb.h')
|
||||
|
||||
# Some old Linux systems have broken header files and
|
||||
# miss the IPV6_V6ONLY define in netinet/in.h,
|
||||
# but have it in linux/in6.h.
|
||||
# We can't include both files so we just check if the value
|
||||
# if defined and do the replacement in system/network.h
|
||||
if not conf.CHECK_VARIABLE('IPV6_V6ONLY',
|
||||
headers='sys/socket.h netdb.h netinet/in.h'):
|
||||
conf.CHECK_CODE('''
|
||||
#include <linux/in6.h>
|
||||
#if (IPV6_V6ONLY != 26)
|
||||
#error no IPV6_V6ONLY support on linux
|
||||
#endif
|
||||
int main(void) { return IPV6_V6ONLY; }
|
||||
''',
|
||||
define='HAVE_LINUX_IPV6_V6ONLY_26',
|
||||
addmain=False,
|
||||
msg='Checking for IPV6_V6ONLY in linux/in6.h',
|
||||
local_include=False)
|
||||
|
||||
conf.CHECK_CODE('''
|
||||
struct sockaddr_storage sa_store;
|
||||
struct addrinfo *ai = NULL;
|
||||
struct in6_addr in6addr;
|
||||
int idx = if_nametoindex("iface1");
|
||||
int s = socket(AF_INET6, SOCK_STREAM, 0);
|
||||
int ret = getaddrinfo(NULL, NULL, NULL, &ai);
|
||||
if (ret != 0) {
|
||||
const char *es = gai_strerror(ret);
|
||||
}
|
||||
freeaddrinfo(ai);
|
||||
{
|
||||
int val = 1;
|
||||
#ifdef HAVE_LINUX_IPV6_V6ONLY_26
|
||||
#define IPV6_V6ONLY 26
|
||||
#endif
|
||||
ret = setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY,
|
||||
(const void *)&val, sizeof(val));
|
||||
}
|
||||
''',
|
||||
define='HAVE_IPV6',
|
||||
lib='nsl socket',
|
||||
headers='sys/socket.h netdb.h netinet/in.h')
|
||||
|
||||
# these may be builtins, so we need the link=False strategy
|
||||
conf.CHECK_FUNCS('strdup memmem printf memset memcpy memmove strcpy strncpy bzero', link=False)
|
||||
|
||||
conf.CHECK_FUNCS('shl_load shl_unload shl_findsym')
|
||||
conf.CHECK_FUNCS('pipe strftime srandom random srand rand usleep setbuffer')
|
||||
conf.CHECK_FUNCS('lstat getpgrp utime utimes seteuid setreuid setresuid setegid')
|
||||
conf.CHECK_FUNCS('setregid setresgid chroot strerror vsyslog setlinebuf mktime')
|
||||
conf.CHECK_FUNCS('ftruncate chsize rename waitpid wait4 strlcpy strlcat')
|
||||
conf.CHECK_FUNCS('initgroups pread pwrite strndup strcasestr')
|
||||
conf.CHECK_FUNCS('strtok_r mkdtemp dup2 dprintf vdprintf isatty chown lchown')
|
||||
conf.CHECK_FUNCS('link readlink symlink realpath snprintf vsnprintf')
|
||||
conf.CHECK_FUNCS('asprintf vasprintf setenv unsetenv strnlen strtoull __strtoull')
|
||||
conf.CHECK_FUNCS('strtouq strtoll __strtoll strtoq')
|
||||
#Some OS (ie. freebsd) return EINVAL if the convertion could not be done, it's not what we expect
|
||||
#Let's detect those cases
|
||||
if conf.CONFIG_SET('HAVE_STRTOLL'):
|
||||
conf.CHECK_CODE('''
|
||||
long long nb = strtoll("Text", NULL, 0);
|
||||
if (errno == EINVAL) {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
''',
|
||||
msg="Checking correct behavior of strtoll",
|
||||
headers = 'errno.h',
|
||||
execute = True,
|
||||
define_ret = True,
|
||||
define = 'HAVE_BSD_STRTOLL',
|
||||
)
|
||||
conf.CHECK_FUNCS('if_nametoindex strerror_r')
|
||||
conf.CHECK_FUNCS('getdirentries getdents syslog')
|
||||
conf.CHECK_FUNCS('gai_strerror get_current_dir_name')
|
||||
conf.CHECK_FUNCS('timegm getifaddrs freeifaddrs mmap setgroups setsid')
|
||||
conf.CHECK_FUNCS('getgrent_r getgrgid_r getgrnam_r getgrouplist getpagesize')
|
||||
conf.CHECK_FUNCS('getpwent_r getpwnam_r getpwuid_r epoll_create')
|
||||
|
||||
conf.CHECK_FUNCS_IN('dlopen dlsym dlerror dlclose', 'dl',
|
||||
checklibc=True, headers='dlfcn.h dl.h')
|
||||
|
||||
conf.CHECK_C_PROTOTYPE('dlopen', 'void *dlopen(const char* filename, unsigned int flags)',
|
||||
define='DLOPEN_TAKES_UNSIGNED_FLAGS', headers='dlfcn.h dl.h')
|
||||
|
||||
if conf.CHECK_FUNCS_IN('fdatasync', 'rt', checklibc=True):
|
||||
# some systems are missing the declaration
|
||||
conf.CHECK_DECLS('fdatasync')
|
||||
|
||||
if conf.CHECK_FUNCS_IN('clock_gettime', 'rt', checklibc=True):
|
||||
for c in ['CLOCK_MONOTONIC', 'CLOCK_PROCESS_CPUTIME_ID', 'CLOCK_REALTIME']:
|
||||
conf.CHECK_CODE('''
|
||||
#if TIME_WITH_SYS_TIME
|
||||
# include <sys/time.h>
|
||||
# include <time.h>
|
||||
#else
|
||||
# if HAVE_SYS_TIME_H
|
||||
# include <sys/time.h>
|
||||
# else
|
||||
# include <time.h>
|
||||
# endif
|
||||
#endif
|
||||
clockid_t clk = %s''' % c,
|
||||
'HAVE_%s' % c,
|
||||
msg='Checking whether the clock_gettime clock ID %s is available' % c)
|
||||
|
||||
conf.CHECK_TYPE('struct timespec', headers='sys/time.h time.h')
|
||||
|
||||
# these headers need to be tested as a group on freebsd
|
||||
conf.CHECK_HEADERS(headers='sys/socket.h net/if.h', together=True)
|
||||
conf.CHECK_HEADERS(headers='netinet/in.h arpa/nameser.h resolv.h', together=True)
|
||||
conf.CHECK_FUNCS_IN('res_search', 'resolv', checklibc=True,
|
||||
headers='netinet/in.h arpa/nameser.h resolv.h')
|
||||
|
||||
|
||||
if not conf.CHECK_FUNCS_IN('gettext', 'intl', checklibc=True, headers='libintl.h'):
|
||||
# Some hosts need lib iconv for linking with lib intl
|
||||
# So we try with flags just in case it helps.
|
||||
oldflags = conf.env['LDFLAGS_INTL']
|
||||
conf.env['LDFLAGS_INTL'] = "-liconv"
|
||||
if not conf.CHECK_LIB('intl'):
|
||||
conf.env['LDFLAGS_INTL'] = oldflags
|
||||
else:
|
||||
conf.CHECK_FUNCS_IN('gettext', 'intl', checklibc=True, headers='libintl.h')
|
||||
|
||||
conf.CHECK_FUNCS_IN('dgettext gettext', 'intl', headers='libintl.h')
|
||||
conf.CHECK_FUNCS_IN('pthread_create', 'pthread', checklibc=True, headers='pthread.h')
|
||||
|
||||
conf.CHECK_FUNCS_IN('crypt', 'crypt', checklibc=True)
|
||||
|
||||
conf.CHECK_VARIABLE('rl_event_hook', define='HAVE_DECL_RL_EVENT_HOOK', always=True,
|
||||
headers='readline.h readline/readline.h readline/history.h')
|
||||
|
||||
conf.CHECK_DECLS('snprintf vsnprintf asprintf vasprintf')
|
||||
|
||||
conf.CHECK_DECLS('errno', headers='errno.h', reverse=True)
|
||||
conf.CHECK_DECLS('environ getgrent_r getpwent_r', reverse=True, headers='pwd.h grp.h')
|
||||
conf.CHECK_DECLS('pread pwrite setenv setresgid setresuid', reverse=True)
|
||||
|
||||
if conf.CONFIG_SET('HAVE_EPOLL_CREATE') and conf.CONFIG_SET('HAVE_SYS_EPOLL_H'):
|
||||
conf.DEFINE('HAVE_EPOLL', 1)
|
||||
|
||||
conf.CHECK_HEADERS('poll.h')
|
||||
conf.CHECK_FUNCS('poll')
|
||||
|
||||
if not conf.CHECK_CODE('''#define LIBREPLACE_CONFIGURE_TEST_STRPTIME
|
||||
#include "test/strptime.c"''',
|
||||
define='HAVE_STRPTIME',
|
||||
addmain=False,
|
||||
msg='Checking for working strptime'):
|
||||
conf.DEFINE('REPLACE_STRPTIME', 1)
|
||||
else:
|
||||
conf.CHECK_CODE('''
|
||||
const char *s = "20070414101546Z";
|
||||
char *ret;
|
||||
struct tm t;
|
||||
memset(&t, 0, sizeof(t));
|
||||
ret = strptime(s, "%Y%m%d%H%M%S", &t);
|
||||
if (ret == NULL || t.tm_wday != 6) {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
''',
|
||||
msg="Checking correct behavior of strptime",
|
||||
headers = 'time.h',
|
||||
execute = True,
|
||||
define_ret = True,
|
||||
define = 'REPLACE_STRPTIME',
|
||||
)
|
||||
|
||||
conf.CHECK_CODE('gettimeofday(NULL, NULL)', 'HAVE_GETTIMEOFDAY_TZ', execute=False)
|
||||
|
||||
conf.CHECK_CODE('#include "test/snprintf.c"',
|
||||
define="HAVE_C99_VSNPRINTF",
|
||||
execute=1,
|
||||
addmain=False,
|
||||
msg="Checking for C99 vsnprintf")
|
||||
|
||||
conf.SAMBA_BUILD_ENV()
|
||||
|
||||
conf.CHECK_CODE('''
|
||||
typedef struct {unsigned x;} FOOBAR;
|
||||
#define X_FOOBAR(x) ((FOOBAR) { x })
|
||||
#define FOO_ONE X_FOOBAR(1)
|
||||
FOOBAR f = FOO_ONE;
|
||||
static const struct {
|
||||
FOOBAR y;
|
||||
} f2[] = {
|
||||
{FOO_ONE}
|
||||
};
|
||||
static const FOOBAR f3[] = {FOO_ONE};
|
||||
''',
|
||||
define='HAVE_IMMEDIATE_STRUCTURES')
|
||||
|
||||
conf.CHECK_CODE('mkdir("foo",0777)', define='HAVE_MKDIR_MODE', headers='sys/stat.h')
|
||||
|
||||
conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_mtim.tv_nsec', define='HAVE_STAT_TV_NSEC',
|
||||
headers='sys/stat.h')
|
||||
# we need the st_rdev test under two names
|
||||
conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_rdev',
|
||||
define='HAVE_STRUCT_STAT_ST_RDEV',
|
||||
headers='sys/stat.h')
|
||||
conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_rdev', define='HAVE_ST_RDEV',
|
||||
headers='sys/stat.h')
|
||||
conf.CHECK_STRUCTURE_MEMBER('struct sockaddr_storage', 'ss_family',
|
||||
headers='sys/socket.h netinet/in.h')
|
||||
conf.CHECK_STRUCTURE_MEMBER('struct sockaddr_storage', '__ss_family',
|
||||
headers='sys/socket.h netinet/in.h')
|
||||
|
||||
|
||||
if conf.CHECK_STRUCTURE_MEMBER('struct sockaddr', 'sa_len',
|
||||
headers='sys/socket.h netinet/in.h',
|
||||
define='HAVE_SOCKADDR_SA_LEN'):
|
||||
# the old build system produced both defines
|
||||
conf.DEFINE('HAVE_STRUCT_SOCKADDR_SA_LEN', 1)
|
||||
|
||||
conf.CHECK_STRUCTURE_MEMBER('struct sockaddr_in', 'sin_len',
|
||||
headers='sys/socket.h netinet/in.h',
|
||||
define='HAVE_SOCK_SIN_LEN')
|
||||
|
||||
conf.CHECK_CODE('struct sockaddr_un sunaddr; sunaddr.sun_family = AF_UNIX;',
|
||||
define='HAVE_UNIXSOCKET', headers='sys/socket.h sys/un.h')
|
||||
|
||||
|
||||
conf.CHECK_CODE('''
|
||||
struct stat st;
|
||||
char tpl[20]="/tmp/test.XXXXXX";
|
||||
int fd = mkstemp(tpl);
|
||||
if (fd == -1) exit(1);
|
||||
unlink(tpl);
|
||||
if (fstat(fd, &st) != 0) exit(1);
|
||||
if ((st.st_mode & 0777) != 0600) exit(1);
|
||||
exit(0);
|
||||
''',
|
||||
define='HAVE_SECURE_MKSTEMP',
|
||||
execute=True,
|
||||
mandatory=True) # lets see if we get a mandatory failure for this one
|
||||
|
||||
if conf.CHECK_CFLAGS('-fvisibility=hidden'):
|
||||
conf.env.VISIBILITY_CFLAGS = '-fvisibility=hidden'
|
||||
conf.CHECK_CODE('''void vis_foo1(void) {}
|
||||
__attribute__((visibility("default"))) void vis_foo2(void) {}''',
|
||||
cflags=conf.env.VISIBILITY_CFLAGS,
|
||||
define='HAVE_VISIBILITY_ATTR')
|
||||
|
||||
# look for a method of finding the list of network interfaces
|
||||
for method in ['HAVE_IFACE_GETIFADDRS', 'HAVE_IFACE_AIX', 'HAVE_IFACE_IFCONF', 'HAVE_IFACE_IFREQ']:
|
||||
if conf.CHECK_CODE('''
|
||||
#define %s 1
|
||||
#define NO_CONFIG_H 1
|
||||
#define AUTOCONF_TEST 1
|
||||
#define SOCKET_WRAPPER_NOT_REPLACE
|
||||
#include "replace.c"
|
||||
#include "inet_ntop.c"
|
||||
#include "snprintf.c"
|
||||
#include "getifaddrs.c"
|
||||
#define getifaddrs_test main
|
||||
#include "test/getifaddrs.c"
|
||||
''' % method,
|
||||
method,
|
||||
lib='nsl socket',
|
||||
addmain=False,
|
||||
execute=True):
|
||||
break
|
||||
|
||||
if conf.CHECK_FUNCS('getpass getpassphrase'):
|
||||
# if we have both, then we prefer getpassphrase
|
||||
conf.DEFINE('REPLACE_GETPASS_BY_GETPASSPHRASE', 1)
|
||||
conf.DEFINE('REPLACE_GETPASS', 1)
|
||||
else:
|
||||
conf.CHECK_CODE('''#include "getpass.c"
|
||||
int main(void) { return 0; }''',
|
||||
addmain=False,
|
||||
define='REPLACE_GETPASS',
|
||||
cflags='-DNO_CONFIG_H')
|
||||
|
||||
conf.RECURSE('system')
|
||||
conf.SAMBA_CONFIG_H()
|
||||
|
||||
|
||||
def build(bld):
|
||||
bld.RECURSE('buildtools/wafsamba')
|
||||
|
||||
REPLACE_HOSTCC_SOURCE = 'replace.c snprintf.c'
|
||||
|
||||
if bld.CONFIG_SET('REPLACE_STRPTIME'): REPLACE_HOSTCC_SOURCE += ' strptime.c'
|
||||
if not bld.CONFIG_SET('HAVE_TIMEGM'): REPLACE_HOSTCC_SOURCE += ' timegm.c'
|
||||
|
||||
bld.SAMBA_SUBSYSTEM('LIBREPLACE_HOSTCC',
|
||||
REPLACE_HOSTCC_SOURCE,
|
||||
use_hostcc=True,
|
||||
use_global_deps=False,
|
||||
cflags='-DSOCKET_WRAPPER_DISABLE=1 -DNSS_WRAPPER_DISABLE=1 -DUID_WRAPPER_DISABLE=1 -D_SAMBA_HOSTCC_',
|
||||
group='compiler_libraries'
|
||||
)
|
||||
|
||||
REPLACE_SOURCE = REPLACE_HOSTCC_SOURCE
|
||||
|
||||
if bld.CONFIG_SET('REPLACE_GETPASS'): REPLACE_SOURCE += ' getpass.c'
|
||||
if not bld.CONFIG_SET('HAVE_CRYPT'): REPLACE_SOURCE += ' crypt.c'
|
||||
if not bld.CONFIG_SET('HAVE_DLOPEN'): REPLACE_SOURCE += ' dlfcn.c'
|
||||
if not bld.CONFIG_SET('HAVE_POLL'): REPLACE_SOURCE += ' poll.c'
|
||||
|
||||
if not bld.CONFIG_SET('HAVE_SOCKETPAIR'): REPLACE_SOURCE += ' socketpair.c'
|
||||
if not bld.CONFIG_SET('HAVE_CONNECT'): REPLACE_SOURCE += ' socket.c'
|
||||
if not bld.CONFIG_SET('HAVE_GETIFADDRS'): REPLACE_SOURCE += ' getifaddrs.c'
|
||||
if not bld.CONFIG_SET('HAVE_GETADDRINFO'): REPLACE_SOURCE += ' getaddrinfo.c'
|
||||
if not bld.CONFIG_SET('HAVE_INET_NTOA'): REPLACE_SOURCE += ' inet_ntoa.c'
|
||||
if not bld.CONFIG_SET('HAVE_INET_ATON'): REPLACE_SOURCE += ' inet_aton.c'
|
||||
if not bld.CONFIG_SET('HAVE_INET_NTOP'): REPLACE_SOURCE += ' inet_ntop.c'
|
||||
if not bld.CONFIG_SET('HAVE_INET_PTON'): REPLACE_SOURCE += ' inet_pton.c'
|
||||
|
||||
bld.SAMBA_LIBRARY('replace',
|
||||
source=REPLACE_SOURCE,
|
||||
group='base_libraries',
|
||||
# FIXME: Ideally symbols should be hidden here so they
|
||||
# don't appear in the global namespace when Samba
|
||||
# libraries are loaded, but this doesn't appear to work
|
||||
# at the moment:
|
||||
# hide_symbols=bld.BUILTIN_LIBRARY('replace'),
|
||||
private_library=True,
|
||||
deps='crypt dl nsl socket rt')
|
||||
|
||||
bld.SAMBA_SUBSYSTEM('replace-test',
|
||||
source='''test/testsuite.c test/strptime.c
|
||||
test/os2_delete.c test/getifaddrs.c''',
|
||||
deps='replace')
|
||||
|
||||
if bld.env.standalone_replace:
|
||||
bld.SAMBA_BINARY('replace_testsuite',
|
||||
source='test/main.c',
|
||||
deps='replace replace-test',
|
||||
install=False)
|
||||
|
||||
# build replacements for stdint.h and stdbool.h if needed
|
||||
bld.SAMBA_GENERATOR('replace_stdint_h',
|
||||
rule='cp ${SRC} ${TGT}',
|
||||
source='hdr_replace.h',
|
||||
target='stdint.h',
|
||||
enabled = not bld.CONFIG_SET('HAVE_STDINT_H'))
|
||||
bld.SAMBA_GENERATOR('replace_stdbool_h',
|
||||
rule='cp ${SRC} ${TGT}',
|
||||
source='hdr_replace.h',
|
||||
target='stdbool.h',
|
||||
enabled = not bld.CONFIG_SET('HAVE_STDBOOL_H'))
|
||||
|
||||
def dist():
|
||||
'''makes a tarball for distribution'''
|
||||
samba_dist.dist()
|
Loading…
x
Reference in New Issue
Block a user