1
0
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:
Michael Adam 2011-11-25 16:36:40 +01:00
parent 5d94dff27e
commit 2c0abf2dcf
56 changed files with 4317 additions and 556 deletions

63
ctdb/lib/replace/Makefile Normal file
View 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:

View File

@ -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

View File

@ -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)

View File

@ -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
])

View 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

View 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)
])

View File

@ -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:*:*)

View File

@ -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
View 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

View File

@ -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
View 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

View 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" ])

View File

@ -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;

View File

@ -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"

View File

@ -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);

View File

@ -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

View File

@ -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");

View File

@ -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

View File

@ -0,0 +1,2 @@
/* this is a replacement header for a missing system header */
#include "replace.h"

View 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;
}

View 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;
}

View File

@ -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)])

View File

@ -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,

View File

@ -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)

View File

@ -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,

View 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
View 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;
}

View File

@ -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

View 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__ */

View File

@ -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

View File

@ -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 */

View File

@ -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])])

View File

@ -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
View 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;
}

View 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);
}

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -35,4 +35,8 @@
#include <locale.h>
#endif
#ifdef HAVE_LANGINFO_H
#include <langinfo.h>
#endif
#endif

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View 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')

View 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;
}

View 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;
}

View File

@ -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;
}

View 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);
}

View 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"); }

View File

@ -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

View File

@ -1 +1 @@
AC_CHECK_FUNCS(timegm,[],[LIBREPLACEOBJ="${LIBREPLACEOBJ} timegm.o"])
AC_CHECK_FUNCS(timegm,[],[LIBREPLACEOBJ="${LIBREPLACEOBJ} $libreplacedir/timegm.o"])

View File

@ -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
View 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()