summaryrefslogtreecommitdiff
path: root/source4/lib
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2006-09-04 12:21:42 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:17:05 -0500
commit38fdde5d9bf15b10caa60ee216d278ba8d870c2e (patch)
treef5da0712c3bd704a0af17aa6d12d8c616a2d6e1b /source4/lib
parentf6f4d868ea7d3a01ec28c6855240882911cae039 (diff)
downloadsamba-38fdde5d9bf15b10caa60ee216d278ba8d870c2e.tar.gz
samba-38fdde5d9bf15b10caa60ee216d278ba8d870c2e.tar.bz2
samba-38fdde5d9bf15b10caa60ee216d278ba8d870c2e.zip
r18031: Merge my replace fixes:
* libreplace can now build stand-alone * add stub testsuite for libreplace * make talloc/tdb/ldb use libreplace (This used to be commit fe7ca4b1454e01a33ed0d53791ebffdd349298b4)
Diffstat (limited to 'source4/lib')
-rw-r--r--source4/lib/ldb/Makefile.in24
-rwxr-xr-xsource4/lib/ldb/autogen.sh2
-rw-r--r--source4/lib/ldb/config.mk30
-rw-r--r--source4/lib/ldb/configure.in3
-rw-r--r--source4/lib/ldb/include/includes.h14
-rw-r--r--source4/lib/ldb/replace/config.m412
-rw-r--r--source4/lib/ldb/replace/replace.c100
-rw-r--r--source4/lib/replace/Makefile.in37
-rw-r--r--source4/lib/replace/README9
-rwxr-xr-xsource4/lib/replace/autogen.sh10
-rw-r--r--source4/lib/replace/config.m418
-rw-r--r--source4/lib/replace/config.mk1
-rw-r--r--source4/lib/replace/configure.ac52
-rw-r--r--source4/lib/replace/dlfcn.c31
-rw-r--r--source4/lib/replace/getpass.c35
-rw-r--r--source4/lib/replace/repdir/repdir.c28
-rw-r--r--source4/lib/replace/replace.c200
-rw-r--r--source4/lib/replace/replace.h105
-rw-r--r--source4/lib/replace/replace.m458
-rw-r--r--source4/lib/replace/snprintf.c6
-rw-r--r--source4/lib/replace/test/testsuite.c366
-rw-r--r--source4/lib/replace/timegm.c (renamed from source4/lib/ldb/replace/timegm.c)0
-rw-r--r--source4/lib/talloc/config.mk1
-rw-r--r--source4/lib/talloc/configure.ac (renamed from source4/lib/talloc/configure.in)0
-rw-r--r--source4/lib/tdb/Makefile.in23
-rw-r--r--source4/lib/tdb/configure.ac (renamed from source4/lib/tdb/configure.in)0
26 files changed, 893 insertions, 272 deletions
diff --git a/source4/lib/ldb/Makefile.in b/source4/lib/ldb/Makefile.in
index c13d3b4fe6..bc00c6b656 100644
--- a/source4/lib/ldb/Makefile.in
+++ b/source4/lib/ldb/Makefile.in
@@ -6,6 +6,7 @@ XSLTPROC = @XSLTPROC@
DOXYGEN = @DOXYGEN@
prefix = @prefix@
exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
includedir = @includedir@
libdir = @libdir@
bindir = @bindir@
@@ -21,20 +22,7 @@ CFLAGS=-I$(srcdir)/include -Iinclude -I$(srcdir) -I$(srcdir)/.. \
-I$(srcdir)/../tdb/include -I$(srcdir)/../tdb -I$(srcdir)/../talloc \
-DLIBDIR=\"$(libdir)\" -DSHLIBEXT=\"@SHLIBEXT@\" -DUSE_MMAP=1 @CFLAGS@
-LIB_FLAGS=-Llib -lldb @LIBS@
-
-REPDIR=replace
-REPLACE_OBJ=$(REPDIR)/replace.o $(REPDIR)/timegm.o
-
-TDBDIR=tdb
-TDB_OBJ=$(TDBDIR)/common/tdb.o $(TDBDIR)/common/dump.o \
- $(TDBDIR)/common/io.o $(TDBDIR)/common/lock.o \
- $(TDBDIR)/common/open.o $(TDBDIR)/common/traverse.o \
- $(TDBDIR)/common/freelist.o $(TDBDIR)/common/error.o \
- $(TDBDIR)/common/transaction.o
-
-TALLOCDIR=talloc
-TALLOC_OBJ=$(TALLOCDIR)/talloc.o
+LIB_FLAGS=-L$(srcdir)/../tdb -L$(srcdir)/../talloc -Llib -lldb -ltdb -ltalloc @LIBS@ @REPLACE_LIB@
LDB_TDB_DIR=ldb_tdb
LDB_TDB_OBJ=$(LDB_TDB_DIR)/ldb_tdb.o \
@@ -53,7 +41,7 @@ MODULES_OBJ=$(MODDIR)/operational.o $(MODDIR)/schema.o $(MODDIR)/rdn_name.o \
$(MODDIR)/objectclass.o \
$(MODDIR)/paged_results.o $(MODDIR)/sort.o $(MODDIR)/asq.o
-OBJS = $(MODULES_OBJ) $(COMMON_OBJ) $(LDB_TDB_OBJ) $(TDB_OBJ) $(TALLOC_OBJ) $(EXTRA_OBJ) $(REPLACE_OBJ)
+OBJS = $(MODULES_OBJ) $(COMMON_OBJ) $(LDB_TDB_OBJ) $(TDB_OBJ) $(TALLOC_OBJ) $(EXTRA_OBJ)
LDB_LIB = lib/libldb.a
@@ -63,7 +51,7 @@ LIBS = $(LDB_LIB)
EXAMPLES = examples/ldbreader examples/ldifreader
-DIRS = lib bin common replace ldb_tdb ldb_ldap ldb_sqlite3 modules tools examples tdb talloc
+DIRS = lib bin common ldb_tdb ldb_ldap ldb_sqlite3 modules tools examples tdb talloc
all: dirs $(OBJS) $(LDB_LIB) $(BINS) $(EXAMPLES) manpages
@@ -159,3 +147,7 @@ etags:
ctags:
ctags `find $(srcdir) -name "*.[ch]"`
+
+@REPLACE_LIB@:
+ cd @REPLACE_DIR@ && ./autogen.sh && ./configure
+ $(MAKE) -C @REPLACE_DIR@
diff --git a/source4/lib/ldb/autogen.sh b/source4/lib/ldb/autogen.sh
index 89053ad9f8..6050abce39 100755
--- a/source4/lib/ldb/autogen.sh
+++ b/source4/lib/ldb/autogen.sh
@@ -1,5 +1,7 @@
#!/bin/sh
+rm -rf autom4te.cache/
+
autoheader || exit 1
autoconf || exit 1
diff --git a/source4/lib/ldb/config.mk b/source4/lib/ldb/config.mk
index 1f92cd5d62..8dff4df2dc 100644
--- a/source4/lib/ldb/config.mk
+++ b/source4/lib/ldb/config.mk
@@ -1,6 +1,7 @@
################################################
# Start MODULE ldb_asq
[MODULE::ldb_asq]
+PRIVATE_DEPENDENCIES = LIBTALLOC
INIT_FUNCTION = ldb_asq_init
SUBSYSTEM = ldb
OBJ_FILES = \
@@ -11,6 +12,7 @@ OBJ_FILES = \
################################################
# Start MODULE ldb_server_sort
[MODULE::ldb_server_sort]
+PRIVATE_DEPENDENCIES = LIBTALLOC
INIT_FUNCTION = ldb_sort_init
SUBSYSTEM = ldb
OBJ_FILES = \
@@ -22,6 +24,7 @@ OBJ_FILES = \
# Start MODULE ldb_paged_results
[MODULE::ldb_paged_results]
INIT_FUNCTION = ldb_paged_results_init
+PRIVATE_DEPENDENCIES = LIBTALLOC
SUBSYSTEM = ldb
OBJ_FILES = \
modules/paged_results.o
@@ -32,6 +35,7 @@ OBJ_FILES = \
# Start MODULE ldb_paged_results
[MODULE::ldb_paged_searches]
INIT_FUNCTION = ldb_paged_searches_init
+PRIVATE_DEPENDENCIES = LIBTALLOC
SUBSYSTEM = ldb
OBJ_FILES = \
modules/paged_searches.o
@@ -42,6 +46,7 @@ OBJ_FILES = \
# Start MODULE ldb_operational
[MODULE::ldb_operational]
SUBSYSTEM = ldb
+PRIVATE_DEPENDENCIES = LIBTALLOC
INIT_FUNCTION = ldb_operational_init
OBJ_FILES = \
modules/operational.o
@@ -52,6 +57,7 @@ OBJ_FILES = \
# Start MODULE ldb_objectclass
[MODULE::ldb_objectclass]
INIT_FUNCTION = ldb_objectclass_init
+PRIVATE_DEPENDENCIES = LIBTALLOC
SUBSYSTEM = ldb
OBJ_FILES = \
modules/objectclass.o
@@ -62,6 +68,7 @@ OBJ_FILES = \
# Start MODULE ldb_rdn_name
[MODULE::ldb_rdn_name]
SUBSYSTEM = ldb
+PRIVATE_DEPENDENCIES = LIBTALLOC
INIT_FUNCTION = ldb_rdn_name_init
OBJ_FILES = \
modules/rdn_name.o
@@ -82,6 +89,7 @@ OBJ_FILES = \
# Start MODULE ldb_ildap
[MODULE::ldb_ildap]
SUBSYSTEM = ldb
+PRIVATE_DEPENDENCIES = LIBTALLOC
INIT_FUNCTION = ldb_ildap_init
ALIASES = ldapi ldaps ldap
OBJ_FILES = \
@@ -94,6 +102,7 @@ PUBLIC_DEPENDENCIES = \
################################################
# Start MODULE ldb_map
[MODULE::ldb_map]
+PRIVATE_DEPENDENCIES = LIBTALLOC
SUBSYSTEM = ldb
OBJ_FILES = \
modules/ldb_map_inbound.o \
@@ -106,6 +115,7 @@ OBJ_FILES = \
# Start MODULE ldb_skel
[MODULE::ldb_skel]
SUBSYSTEM = ldb
+PRIVATE_DEPENDENCIES = LIBTALLOC
INIT_FUNCTION = ldb_skel_init
OBJ_FILES = modules/skel.o
# End MODULE ldb_skel
@@ -115,11 +125,12 @@ OBJ_FILES = modules/skel.o
# Start MODULE ldb_sqlite3
[MODULE::ldb_sqlite3]
SUBSYSTEM = ldb
+PRIVATE_DEPENDENCIES = LIBTALLOC
INIT_FUNCTION = ldb_sqlite3_init
OBJ_FILES = \
ldb_sqlite3/ldb_sqlite3.o
PUBLIC_DEPENDENCIES = \
- SQLITE3
+ SQLITE3 LIBTALLOC
# End MODULE ldb_sqlite3
################################################
@@ -136,23 +147,13 @@ OBJ_FILES = \
ldb_tdb/ldb_cache.o \
ldb_tdb/ldb_tdb_wrap.o
PUBLIC_DEPENDENCIES = \
- LIBTDB
+ LIBTDB LIBTALLOC
# End MODULE ldb_tdb
################################################
-################################################
-# Start MODULE ldb_replace
-[MODULE::ldb_replace]
-SUBSYSTEM = ldb
-OBJ_FILES = \
- replace/timegm.o \
- replace/replace.o
-# End MODULE ldb_replace
-################################################
-
./lib/ldb/common/ldb_modules.o: lib/ldb/common/ldb_modules.c Makefile
@echo Compiling $<
- @$(CC) $(CFLAGS) $(PICFLAG) -DMODULESDIR=\"$(MODULESDIR)/ldb\" -DSHLIBEXT=\"$(SHLIBEXT)\" -c $< -o $@
+ @$(CC) -Iinclude $(CFLAGS) -Ilib/talloc -Ilib/ldb $(PICFLAG) -DLDBMODULESDIR=\"$(MODULESDIR)/ldb\" -DSHLIBEXT=\"$(SHLIBEXT)\" -c $< -o $@
################################################
# Start SUBSYSTEM ldb
@@ -186,6 +187,7 @@ PUBLIC_HEADERS = include/ldb.h include/ldb_errors.h
################################################
# Start SUBSYSTEM LDBSAMBA
[SUBSYSTEM::LDBSAMBA]
+PRIVATE_DEPENDENCIES = ldb
PRIVATE_PROTO_HEADER = samba/ldif_handlers.h
PUBLIC_DEPENDENCIES = LIBSECURITY SAMDB
OBJ_FILES = \
@@ -199,7 +201,7 @@ OBJ_FILES = \
OBJ_FILES= \
tools/cmdline.o
PUBLIC_DEPENDENCIES = ldb LIBSAMBA-UTIL LIBPOPT POPT_SAMBA POPT_CREDENTIALS
-PRIVATE_DEPENDENCIES = gensec
+PRIVATE_DEPENDENCIES = gensec
# End SUBSYSTEM LIBLDB_CMDLINE
################################################
diff --git a/source4/lib/ldb/configure.in b/source4/lib/ldb/configure.in
index 4f8640ec67..5ef3d1cc96 100644
--- a/source4/lib/ldb/configure.in
+++ b/source4/lib/ldb/configure.in
@@ -70,6 +70,9 @@ fi
AC_SUBST(TESTS)
AC_SUBST(EXTRA_OBJ)
+sinclude(replace.m4)
+SMB_REPLACE_FUNCS(strtoll)
+
sinclude(config.m4)
sinclude(../talloc/config.m4)
sinclude(../tdb/config.m4)
diff --git a/source4/lib/ldb/include/includes.h b/source4/lib/ldb/include/includes.h
index 31997d6008..0a73f7728f 100644
--- a/source4/lib/ldb/include/includes.h
+++ b/source4/lib/ldb/include/includes.h
@@ -6,19 +6,19 @@
#ifdef _SAMBA_BUILD_
-#include "system/filesys.h"
-#include "system/locale.h"
-#include "system/time.h"
-
/* tell ldb we have the internal ldap code */
#define HAVE_ILDAP 1
-#else /*_SAMBA_BUILD_*/
+#else
+#include "config.h"
+#endif /*_SAMBA_BUILD_*/
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
-#include "config.h"
+#ifdef HAVE_REPLACE_H
+#include "replace.h"
+#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@@ -51,8 +51,6 @@ typedef int (*comparison_fn_t)(const void *, const void *);
#include "talloc.h"
-#endif /*_SAMBA_BUILD_*/
-
#include "ldb.h"
#include "ldb_errors.h"
#include "ldb_private.h"
diff --git a/source4/lib/ldb/replace/config.m4 b/source4/lib/ldb/replace/config.m4
deleted file mode 100644
index 2d21d1b315..0000000000
--- a/source4/lib/ldb/replace/config.m4
+++ /dev/null
@@ -1,12 +0,0 @@
-AC_CHECK_HEADERS([stdint.h inttypes.h])
-AC_CHECK_TYPE(uint8_t, unsigned char)
-AC_CHECK_TYPE(int64_t, long long)
-AC_CHECK_TYPE(uint64_t, unsigned long long)
-AC_CHECK_TYPE(comparison_fn_t,
-[AC_DEFINE(HAVE_COMPARISON_FN_T, 1,[Whether or not we have comparison_fn_t])])
-
-AC_CHECK_FUNCS(strerror timegm strnlen setenv)
-AC_CHECK_FUNCS(strtoull __strtoull strtouq strtoll __strtoll strtoq)
-AC_HAVE_DECL(errno, [#include <errno.h>])
-
-AC_CHECK_HEADERS(strings.h)
diff --git a/source4/lib/ldb/replace/replace.c b/source4/lib/ldb/replace/replace.c
deleted file mode 100644
index a63613fc10..0000000000
--- a/source4/lib/ldb/replace/replace.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
-
- replacement routines for broken systems
-
- Copyright (C) Andrew Tridgell 1992-2006
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-#include "ldb/include/includes.h"
-
-#if !defined(HAVE_STRNLEN) && !defined(_SAMBA_BUILD_)
-/**
- Some platforms don't have strnlen
-**/
- size_t strnlen(const char *s, size_t n)
-{
- int i;
- for (i=0; s[i] && i<n; i++)
- /* noop */ ;
- return i;
-}
-#endif
-
-#ifndef HAVE_STRTOLL
- long long int strtoll(const char *str, char **endptr, int base)
-{
-#ifdef HAVE_STRTOQ
- return strtoq(str, endptr, base);
-#elif defined(HAVE___STRTOLL)
- return __strtoll(str, endptr, base);
-#elif SIZEOF_LONG == SIZEOF_LONG_LONG
- return (long long int) strtol(str, endptr, base);
-#else
-# error "You need a strtoll function"
-#endif
-}
-#endif
-
-
-#ifndef HAVE_STRTOULL
- unsigned long long int strtoull(const char *str, char **endptr, int base)
-{
-#ifdef HAVE_STRTOUQ
- return strtouq(str, endptr, base);
-#elif defined(HAVE___STRTOULL)
- return __strtoull(str, endptr, base);
-#elif SIZEOF_LONG == SIZEOF_LONG_LONG
- return (unsigned long long int) strtoul(str, endptr, base);
-#else
-# error "You need a strtoull function"
-#endif
-}
-#endif
-
-#ifndef HAVE_SETENV
- int setenv(const char *name, const char *value, int overwrite)
-{
- char *p;
- size_t l1, l2;
- int ret;
-
- if (!overwrite && getenv(name)) {
- return 0;
- }
-
- l1 = strlen(name);
- l2 = strlen(value);
-
- p = malloc(l1+l2+2);
- if (p == NULL) {
- return -1;
- }
- memcpy(p, name, l1);
- p[l1] = '=';
- memcpy(p+l1+1, value, l2);
- p[l1+l2+1] = 0;
-
- ret = putenv(p);
- if (ret != 0) {
- free(p);
- }
-
- return ret;
-}
-#endif
diff --git a/source4/lib/replace/Makefile.in b/source4/lib/replace/Makefile.in
new file mode 100644
index 0000000000..916b5df3d9
--- /dev/null
+++ b/source4/lib/replace/Makefile.in
@@ -0,0 +1,37 @@
+CC = @CC@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+includedir = @includedir@
+libdir = @libdir@
+VPATH = @srcdir@
+srcdir = @srcdir@
+builddir = @builddir@
+INSTALL = @INSTALL@
+
+OBJS = dlfcn.o getpass.o replace.o snprintf.o
+
+all: libreplace.a
+
+install: all
+ $(INSTALL) libreplace.a $(libdir)
+
+libreplace.a: $(OBJS)
+ ar -rv $@ $(OBJS)
+ @-ranlib $@
+
+test: testsuite
+ ./testsuite
+
+TEST_OBJS = test/testsuite.o
+
+testsuite: libreplace.a $(TEST_OBJS)
+ $(CC) -o testsuite $(TEST_OBJS)
+
+.c.o:
+ @echo Compiling $*.c
+ @mkdir -p `dirname $@`
+ $(CC) $(CFLAGS) -c $< -o $@
+
+clean:
+ rm -f *.o
diff --git a/source4/lib/replace/README b/source4/lib/replace/README
index 271713247a..fd630ddc45 100644
--- a/source4/lib/replace/README
+++ b/source4/lib/replace/README
@@ -2,10 +2,10 @@ This subsystem ensures that we can always use a certain core set of
functions and types, that are either provided by the OS or by replacement
functions / definitions in this subsystem. The aim is to try to stick
to POSIX functions in here as much as possible. Convenience functions
-that are available on no platform at all belong in different subsystems
+that are available on no platform at all belong in other subsystems
(such as LIBUTIL).
-The following functions are guarenteed:
+The following functions are guaranteed:
ftruncate
strlcpy
@@ -21,8 +21,6 @@ setlinebuf
vsyslog
timegm
setenv
-strtoull
-strtoll
strndup
strnlen
waitpid
@@ -52,6 +50,8 @@ pwrite
getpass
readline (the library)
inet_ntoa
+strtoll
+strtoull
Types:
bool
@@ -59,6 +59,7 @@ socklen_t
uint_t
uint{8,16,32,64}_t
int{8,16,32,64}_t
+intptr_t
Constants:
PATH_NAME_MAX
diff --git a/source4/lib/replace/autogen.sh b/source4/lib/replace/autogen.sh
new file mode 100755
index 0000000000..5b4c37cf96
--- /dev/null
+++ b/source4/lib/replace/autogen.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+rm -rf autom4te.cache
+
+autoheader || exit 1
+autoconf || exit 1
+
+echo "Now run ./configure and then make."
+exit 0
+
diff --git a/source4/lib/replace/config.m4 b/source4/lib/replace/config.m4
index 93f0bb34a7..c2e0e5e6f4 100644
--- a/source4/lib/replace/config.m4
+++ b/source4/lib/replace/config.m4
@@ -1,8 +1,11 @@
AC_CHECK_HEADERS([stdint.h inttypes.h])
AC_CHECK_TYPE(uint_t, unsigned int)
+AC_CHECK_TYPE(uint8_t, unsigned char)
+AC_CHECK_TYPE(int8_t, char)
AC_CHECK_TYPE(int16_t, short)
AC_CHECK_TYPE(uint16_t, unsigned short)
AC_CHECK_TYPE(int32_t, long)
+AC_CHECK_TYPE(intptr_t, unsigned long long)
AC_CHECK_TYPE(uint32_t, unsigned long)
AC_CHECK_TYPE(ssize_t, int)
@@ -170,3 +173,18 @@ else
fi
AC_CHECK_HEADERS([sys/param.h limits.h])
+
+AC_CHECK_TYPE(comparison_fn_t,
+[AC_DEFINE(HAVE_COMPARISON_FN_T, 1,[Whether or not we have comparison_fn_t])])
+
+AC_CHECK_FUNCS(timegm strnlen setenv)
+AC_CHECK_FUNCS(strtoull __strtoull strtouq strtoll __strtoll strtoq)
+
+AC_TRY_CPP([
+#define eprintf(...) fprintf(stderr, __VA_ARGS__)
+eprintf("bla", "bar");
+], [], [AC_MSG_ERROR([__VA_ARGS__ is required])])
+
+# Check prerequisites
+AC_CHECK_FUNCS([memset printf syslog], [],
+ [ AC_MSG_ERROR([Required function not found])])
diff --git a/source4/lib/replace/config.mk b/source4/lib/replace/config.mk
index 9f6bc0ce53..49a1e7fe1b 100644
--- a/source4/lib/replace/config.mk
+++ b/source4/lib/replace/config.mk
@@ -9,6 +9,7 @@ OBJ_FILES = \
##############################
# Start SUBSYSTEM LIBREPLACE
[SUBSYSTEM::LIBREPLACE]
+CFLAGS = -Ilib/replace
OBJ_FILES = replace.o \
snprintf.o \
dlfcn.o \
diff --git a/source4/lib/replace/configure.ac b/source4/lib/replace/configure.ac
new file mode 100644
index 0000000000..a05a9cbfe7
--- /dev/null
+++ b/source4/lib/replace/configure.ac
@@ -0,0 +1,52 @@
+AC_DEFUN([SMB_EXT_LIB], [echo -n ""])
+AC_DEFUN([SMB_ENABLE], [echo -n ""])
+
+dnl see if a declaration exists for a function or variable
+dnl defines HAVE_function_DECL if it exists
+dnl AC_HAVE_DECL(var, includes)
+AC_DEFUN(AC_HAVE_DECL,
+[
+ AC_CACHE_CHECK([for $1 declaration],ac_cv_have_$1_decl,[
+ AC_TRY_COMPILE([$2],[int i = (int)$1],
+ ac_cv_have_$1_decl=yes,ac_cv_have_$1_decl=no)])
+ if test x"$ac_cv_have_$1_decl" = x"yes"; then
+ AC_DEFINE([HAVE_]translit([$1], [a-z], [A-Z])[_DECL],1,[Whether $1() is available])
+ fi
+])
+
+dnl AC_SEARCH_LIBS_EXT(FUNCTION, SEARCH-LIBS, EXT_LIBS,
+dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND],
+dnl [OTHER-LIBRARIES])
+dnl --------------------------------------------------------
+dnl Search for a library defining FUNC, if it's not already available.
+AC_DEFUN([AC_SEARCH_LIBS_EXT],
+[AC_CACHE_CHECK([for library containing $1], [ac_cv_search_ext_$1],
+[
+ac_func_search_ext_save_LIBS=$LIBS
+ac_cv_search_ext_$1=no
+AC_LINK_IFELSE([AC_LANG_CALL([], [$1])],
+ [ac_cv_search_ext_$1="none required"])
+if test "$ac_cv_search_ext_$1" = no; then
+ for ac_lib in $2; do
+ LIBS="-l$ac_lib $$3 $6 $ac_func_search_save_ext_LIBS"
+ AC_LINK_IFELSE([AC_LANG_CALL([], [$1])],
+ [ac_cv_search_ext_$1="-l$ac_lib"
+break])
+ done
+fi
+LIBS=$ac_func_search_ext_save_LIBS])
+AS_IF([test "$ac_cv_search_ext_$1" != no],
+ [test "$ac_cv_search_ext_$1" = "none required" || $3="$ac_cv_search_ext_$1 $$3"
+ $4],
+ [$5])dnl
+])
+
+AC_PREREQ(2.50)
+AC_INIT(dlfcn.c)
+AC_CONFIG_SRCDIR([dlfcn.c])
+AC_CONFIG_HEADER(replace_config.h)
+AC_PROG_INSTALL
+sinclude(config.m4)
+sinclude(win32/config.m4)
+sinclude(repdir/config.m4)
+AC_OUTPUT(Makefile)
diff --git a/source4/lib/replace/dlfcn.c b/source4/lib/replace/dlfcn.c
index 6df57cd60c..79005c0d2b 100644
--- a/source4/lib/replace/dlfcn.c
+++ b/source4/lib/replace/dlfcn.c
@@ -3,23 +3,28 @@
Samba system utilities
Copyright (C) Andrew Tridgell 1992-1998
Copyright (C) Jeremy Allison 1998-2002
+
+ ** NOTE! The following LGPL license applies to the replace
+ ** library. This does NOT imply that all of Samba is released
+ ** under the LGPL
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
+ 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 2 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include "includes.h"
+#include "replace.h"
+#include <stdlib.h>
#ifndef HAVE_DLOPEN
void *dlopen(const char *name, int flags)
diff --git a/source4/lib/replace/getpass.c b/source4/lib/replace/getpass.c
index 4ffcde8dfd..1aac7c61ab 100644
--- a/source4/lib/replace/getpass.c
+++ b/source4/lib/replace/getpass.c
@@ -18,9 +18,38 @@ Cambridge, MA 02139, USA. */
/* Modified to use with samba by Jeremy Allison, 8th July 1995. */
-#include "includes.h"
-#include "system/terminal.h"
-#include "system/wait.h"
+#include "replace.h"
+#include <stdlib.h>
+
+#if defined(HAVE_TERMIOS_H)
+/* POSIX terminal handling. */
+#include <termios.h>
+#elif defined(HAVE_TERMIO_H)
+/* Older SYSV terminal handling - don't use if we can avoid it. */
+#include <termio.h>
+#elif defined(HAVE_SYS_TERMIO_H)
+/* Older SYSV terminal handling - don't use if we can avoid it. */
+#include <sys/termio.h>
+#endif
+
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+
+/*
+ * Define additional missing types
+ */
+#ifndef HAVE_SIG_ATOMIC_T_TYPE
+typedef int sig_atomic_t;
+#endif
+
+#ifndef SIGCLD
+#define SIGCLD SIGCHLD
+#endif
+
+#ifndef SIGNAL_CAST
+#define SIGNAL_CAST (RETSIGTYPE (*)(int))
+#endif
#ifdef REPLACE_GETPASS
diff --git a/source4/lib/replace/repdir/repdir.c b/source4/lib/replace/repdir/repdir.c
index b536ed6587..07b9568dc1 100644
--- a/source4/lib/replace/repdir/repdir.c
+++ b/source4/lib/replace/repdir/repdir.c
@@ -2,20 +2,24 @@
Unix SMB/CIFS implementation.
Copyright (C) Andrew Tridgell 2005
+
+ ** NOTE! The following LGPL license applies to the replace
+ ** library. This does NOT imply that all of Samba is released
+ ** under the LGPL
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
+ 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 2 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
a replacement for opendir/readdir/telldir/seekdir/closedir for BSD systems
diff --git a/source4/lib/replace/replace.c b/source4/lib/replace/replace.c
index 4048fe558e..5333c6a9fe 100644
--- a/source4/lib/replace/replace.c
+++ b/source4/lib/replace/replace.c
@@ -2,38 +2,41 @@
Unix SMB/CIFS implementation.
replacement routines for broken systems
Copyright (C) Andrew Tridgell 1992-1998
+
+ ** NOTE! The following LGPL license applies to the replace
+ ** library. This does NOT imply that all of Samba is released
+ ** under the LGPL
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
+ 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 2 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include "includes.h"
-#include "system/locale.h"
-#include "system/wait.h"
-#include "system/time.h"
-#include "system/network.h"
-#include "system/filesys.h"
-#include "system/syslog.h"
+#include "replace.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <string.h>
- void replace_dummy(void);
- void replace_dummy(void) {}
+void replace_dummy(void);
+void replace_dummy(void) {}
#ifndef HAVE_FTRUNCATE
/*******************************************************************
ftruncate for operating systems that don't have it
********************************************************************/
- int ftruncate(int f,off_t l)
+int rep_ftruncate(int f, off_t l)
{
#ifdef HAVE_CHSIZE
return chsize(f,l);
@@ -53,7 +56,7 @@ ftruncate for operating systems that don't have it
#ifndef HAVE_STRLCPY
/* like strncpy but does not 0 fill the buffer and always null
terminates. bufsize is the size of the destination buffer */
- size_t strlcpy(char *d, const char *s, size_t bufsize)
+size_t rep_strlcpy(char *d, const char *s, size_t bufsize)
{
size_t len = strlen(s);
size_t ret = len;
@@ -69,7 +72,7 @@ ftruncate for operating systems that don't have it
/* like strncat but does not 0 fill the buffer and always null
terminates. bufsize is the length of the buffer, which should
be one more than the maximum resulting string length */
- size_t strlcat(char *d, const char *s, size_t bufsize)
+size_t rep_strlcat(char *d, const char *s, size_t bufsize)
{
size_t len1 = strlen(d);
size_t len2 = strlen(s);
@@ -97,7 +100,7 @@ Corrections by richard.kettlewell@kewill.com
#define HOUR 60*MINUTE
#define DAY 24*HOUR
#define YEAR 365*DAY
- time_t mktime(struct tm *t)
+time_t rep_mktime(struct tm *t)
{
struct tm *u;
time_t epoch = 0;
@@ -149,7 +152,7 @@ Corrections by richard.kettlewell@kewill.com
#ifndef HAVE_RENAME
/* Rename a file. (from libiberty in GNU binutils) */
- int rename(const char *zfrom, const char *zto)
+int rep_rename(const char *zfrom, const char *zto)
{
if (link (zfrom, zto) < 0)
{
@@ -169,7 +172,8 @@ Corrections by richard.kettlewell@kewill.com
/*
* Search for a match in a netgroup. This replaces it on broken systems.
*/
- int innetgr(const char *group,const char *host,const char *user,const char *dom)
+int rep_innetgr(const char *group, const char *host, const char *user,
+ const char *dom)
{
char *hst, *usr, *dm;
@@ -194,7 +198,7 @@ Corrections by richard.kettlewell@kewill.com
/****************************************************************************
some systems don't have an initgroups call
****************************************************************************/
- int initgroups(char *name, gid_t id)
+int rep_initgroups(char *name, gid_t id)
{
#ifndef HAVE_SETGROUPS
/* yikes! no SETGROUPS or INITGROUPS? how can this work? */
@@ -246,7 +250,7 @@ Corrections by richard.kettlewell@kewill.com
/* This is needed due to needing the nap() function but we don't want
to include the Xenix libraries since that will break other things...
BTW: system call # 0x0c28 is the same as calling nap() */
- long nap(long milliseconds) {
+long nap(long milliseconds) {
return syscall(0x0c28, milliseconds);
}
#endif
@@ -259,7 +263,7 @@ this is only used if the machine does not have it's own memmove().
this is not the fastest algorithm in town, but it will do for our
needs.
********************************************************************/
- void *memmove(void *dest,const void *src,int size)
+void *rep_memmove(void *dest,const void *src,int size)
{
unsigned long d,s;
int i;
@@ -317,7 +321,7 @@ needs.
/****************************************************************************
duplicate a string
****************************************************************************/
- char *strdup(const char *s)
+char *rep_strdup(const char *s)
{
size_t len;
char *ret;
@@ -335,7 +339,7 @@ duplicate a string
#ifndef WITH_PTHREADS
/* REWRITE: not thread safe */
#ifdef REPLACE_INET_NTOA
- char *rep_inet_ntoa(struct in_addr ip)
+char *rep_inet_ntoa(struct in_addr ip)
{
uint8_t *p = (uint8_t *)&ip.s_addr;
static char buf[18];
@@ -347,7 +351,7 @@ duplicate a string
#endif
#ifndef HAVE_SETLINEBUF
- int setlinebuf(FILE *stream)
+int rep_setlinebuf(FILE *stream)
{
return setvbuf(stream, (char *)NULL, _IOLBF, 0);
}
@@ -355,7 +359,7 @@ duplicate a string
#ifndef HAVE_VSYSLOG
#ifdef HAVE_SYSLOG
- void vsyslog (int facility_priority, char *format, va_list arglist)
+void rep_vsyslog (int facility_priority, char *format, va_list arglist)
{
char *msg = NULL;
vasprintf(&msg, format, arglist);
@@ -388,7 +392,7 @@ duplicate a string
/**
Some platforms don't have strndup.
**/
- char *strndup(const char *s, size_t n)
+char *rep_strndup(const char *s, size_t n)
{
char *ret;
@@ -404,14 +408,14 @@ duplicate a string
#endif
#ifndef HAVE_WAITPID
-int waitpid(pid_t pid,int *status,int options)
+int rep_waitpid(pid_t pid,int *status,int options)
{
return wait4(pid, status, options, NULL);
}
#endif
#ifndef HAVE_SETEUID
- int seteuid(uid_t euid)
+int rep_seteuid(uid_t euid)
{
#ifdef HAVE_SETRESUID
return setresuid(-1, euid, -1);
@@ -422,7 +426,7 @@ int waitpid(pid_t pid,int *status,int options)
#endif
#ifndef HAVE_SETEGID
- int setegid(gid_t egid)
+int rep_setegid(gid_t egid)
{
#ifdef HAVE_SETRESGID
return setresgid(-1, egid, -1);
@@ -436,7 +440,7 @@ int waitpid(pid_t pid,int *status,int options)
os/2 also doesn't have chroot
********************************************************************/
#ifndef HAVE_CHROOT
-int chroot(const char *dname)
+int rep_chroot(const char *dname)
{
errno = ENOSYS;
return -1;
@@ -460,7 +464,7 @@ int rep_mkstemp(char *template)
#endif
#ifndef HAVE_MKDTEMP
-char * mkdtemp(char *template)
+char *rep_mkdtemp(char *template)
{
char *dname;
@@ -475,7 +479,7 @@ char * mkdtemp(char *template)
#endif
#ifndef HAVE_PREAD
-static ssize_t pread(int __fd, void *__buf, size_t __nbytes, off_t __offset)
+static ssize_t rep_pread(int __fd, void *__buf, size_t __nbytes, off_t __offset)
{
if (lseek(__fd, __offset, SEEK_SET) != __offset) {
return -1;
@@ -485,7 +489,7 @@ static ssize_t pread(int __fd, void *__buf, size_t __nbytes, off_t __offset)
#endif
#ifndef HAVE_PWRITE
-static ssize_t pwrite(int __fd, const void *__buf, size_t __nbytes, off_t __offset)
+static ssize_t rep_pwrite(int __fd, const void *__buf, size_t __nbytes, off_t __offset)
{
if (lseek(__fd, __offset, SEEK_SET) != __offset) {
return -1;
@@ -495,7 +499,7 @@ static ssize_t pwrite(int __fd, const void *__buf, size_t __nbytes, off_t __offs
#endif
#ifndef HAVE_STRCASESTR
-char *strcasestr(const char *haystack, const char *needle)
+char *rep_strcasestr(const char *haystack, const char *needle)
{
const char *s;
size_t nlen = strlen(needle);
@@ -511,7 +515,7 @@ char *strcasestr(const char *haystack, const char *needle)
#ifndef HAVE_STRTOK_R
/* based on GLIBC version, copyright Free Software Foundation */
-char *strtok_r(char *s, const char *delim, char **save_ptr)
+char *rep_strtok_r(char *s, const char *delim, char **save_ptr)
{
char *token;
@@ -535,3 +539,111 @@ char *strtok_r(char *s, const char *delim, char **save_ptr)
return token;
}
#endif
+
+#ifndef HAVE_STRNLEN
+/**
+ Some platforms don't have strnlen
+**/
+size_t rep_strnlen(const char *s, size_t n)
+{
+ int i;
+ for (i=0; s[i] && i<n; i++)
+ /* noop */ ;
+ return i;
+}
+#endif
+
+#ifndef HAVE_STRTOLL
+long long int rep_strtoll(const char *str, char **endptr, int base)
+{
+#ifdef HAVE_STRTOQ
+ return strtoq(str, endptr, base);
+#elif defined(HAVE___STRTOLL)
+ return __strtoll(str, endptr, base);
+#elif SIZEOF_LONG == SIZEOF_LONG_LONG
+ return (long long int) strtol(str, endptr, base);
+#else
+# error "You need a strtoll function"
+#endif
+}
+#endif
+
+
+#ifndef HAVE_STRTOULL
+unsigned long long int rep_strtoull(const char *str, char **endptr, int base)
+{
+#ifdef HAVE_STRTOUQ
+ return strtouq(str, endptr, base);
+#elif defined(HAVE___STRTOULL)
+ return __strtoull(str, endptr, base);
+#elif SIZEOF_LONG == SIZEOF_LONG_LONG
+ return (unsigned long long int) strtoul(str, endptr, base);
+#else
+# error "You need a strtoull function"
+#endif
+}
+#endif
+
+#ifndef HAVE_SETENV
+int rep_setenv(const char *name, const char *value, int overwrite)
+{
+ char *p;
+ size_t l1, l2;
+ int ret;
+
+ if (!overwrite && getenv(name)) {
+ return 0;
+ }
+
+ l1 = strlen(name);
+ l2 = strlen(value);
+
+ p = malloc(l1+l2+2);
+ if (p == NULL) {
+ return -1;
+ }
+ memcpy(p, name, l1);
+ p[l1] = '=';
+ memcpy(p+l1+1, value, l2);
+ p[l1+l2+1] = 0;
+
+ ret = putenv(p);
+ if (ret != 0) {
+ free(p);
+ }
+
+ return ret;
+}
+#endif
+
+#if !defined(HAVE_TIMEGM)
+
+static int is_leap(unsigned y)
+{
+ y += 1900;
+ return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0);
+}
+
+time_t timegm(struct tm *tm)
+{
+ static const unsigned ndays[2][12] ={
+ {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
+ {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
+ time_t res = 0;
+ unsigned i;
+
+ for (i = 70; i < tm->tm_year; ++i)
+ res += is_leap(i) ? 366 : 365;
+
+ for (i = 0; i < tm->tm_mon; ++i)
+ res += ndays[is_leap(tm->tm_year)][i];
+ res += tm->tm_mday - 1;
+ res *= 24;
+ res += tm->tm_hour;
+ res *= 60;
+ res += tm->tm_min;
+ res *= 60;
+ res += tm->tm_sec;
+ return res;
+}
+#endif
diff --git a/source4/lib/replace/replace.h b/source4/lib/replace/replace.h
index e59ba43206..827777983f 100644
--- a/source4/lib/replace/replace.h
+++ b/source4/lib/replace/replace.h
@@ -4,25 +4,39 @@
macros to go along with the lib/replace/ portability layer code
Copyright (C) Andrew Tridgell 2005
+ 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
+ ** under the LGPL
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
+ 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 2 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _replace_h
#define _replace_h
+#ifdef _SAMBA_BUILD_
+#include "config.h"
+#else
+#include "replace_config.h"
+#endif /* _SAMBA_BUILD_ */
+
+#include <stdlib.h>
+#include <stdarg.h>
+
#if defined(_MSC_VER) || defined(__MINGW32__)
#include "lib/replace/win32/replace.h"
#endif
@@ -53,59 +67,78 @@ extern int errno;
#endif
#ifndef HAVE_STRDUP
-char *strdup(const char *s);
+#define strdup rep_strdup
+char *rep_strdup(const char *s);
#endif
#ifndef HAVE_MEMMOVE
-void *memmove(void *dest,const void *src,int size);
+#define memmove rep_memmove
+void *rep_memmove(void *dest,const void *src,int size);
#endif
#ifndef HAVE_MKTIME
-time_t mktime(struct tm *t);
+#define mktime rep_mktime
+time_t rep_mktime(struct tm *t);
#endif
#ifndef HAVE_STRLCPY
-size_t strlcpy(char *d, const char *s, size_t bufsize);
+#define strlcpy rep_strlcpy
+size_t rep_strlcpy(char *d, const char *s, size_t bufsize);
#endif
#ifndef HAVE_STRLCAT
-size_t strlcat(char *d, const char *s, size_t bufsize);
+#define strlcat rep_strlcat
+size_t rep_strlcat(char *d, const char *s, size_t bufsize);
#endif
#ifndef HAVE_STRNDUP
-char *strndup(const char *s, size_t n);
+#define strndup rep_strndup
+char *rep_strndup(const char *s, size_t n);
#endif
#ifndef HAVE_STRNLEN
-size_t strnlen(const char *s, size_t n);
-#endif
-
-#ifndef HAVE_STRTOUL
-unsigned long strtoul(const char *nptr, char **endptr, int base);
+#define strnlen rep_strnlen
+size_t rep_strnlen(const char *s, size_t n);
#endif
#ifndef HAVE_SETENV
-int setenv(const char *name, const char *value, int overwrite);
+#define setenv rep_setenv
+int rep_setenv(const char *name, const char *value, int overwrite);
#endif
#ifndef HAVE_RENAME
-int rename(const char *zfrom, const char *zto);
+#define rename rep_rename
+int rep_rename(const char *zfrom, const char *zto);
#endif
#ifndef HAVE_STRCASESTR
-char *strcasestr(const char *haystack, const char *needle);
+#define strcasestr rep_strcasestr
+char *rep_strcasestr(const char *haystack, const char *needle);
#endif
#ifndef HAVE_STRTOK_R
-char *strtok_r(char *s, const char *delim, char **save_ptr);
+#define strtok_r rep_strtok_r
+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);
+#endif
+
+#ifndef HAVE_STRTOULL
+#define strtoull rep_strtoull
+unsigned long long int rep_strtoull(const char *str, char **endptr, int base);
#endif
#ifndef HAVE_FTRUNCATE
-int ftruncate(int f,long l);
+#define ftruncate rep_ftruncate
+int rep_ftruncate(int f,long l);
#endif
#ifndef HAVE_VASPRINTF_DECL
-int vasprintf(char **ptr, const char *format, va_list ap);
+#define vasprintf rep_vasprintf
+int rep_vasprintf(char **ptr, const char *format, va_list ap);
#endif
#if !defined(HAVE_BZERO) && defined(HAVE_MEMSET)
@@ -114,7 +147,8 @@ int vasprintf(char **ptr, const char *format, va_list ap);
#ifndef HAVE_TIMEGM
struct tm;
-time_t timegm(struct tm *tm);
+#define timegm rep_timegm
+time_t rep_timegm(struct tm *tm);
#endif
#ifndef PRINTF_ATTRIBUTE
@@ -131,10 +165,12 @@ time_t timegm(struct tm *tm);
/* add varargs prototypes with printf checking */
#ifndef HAVE_SNPRINTF_DECL
-int snprintf(char *,size_t ,const char *, ...) PRINTF_ATTRIBUTE(3,4);
+#define snprintf rep_snprintf
+int rep_snprintf(char *,size_t ,const char *, ...) PRINTF_ATTRIBUTE(3,4);
#endif
#ifndef HAVE_ASPRINTF_DECL
-int asprintf(char **,const char *, ...) PRINTF_ATTRIBUTE(2,3);
+#define asprintf rep_asprintf
+int rep_asprintf(char **,const char *, ...) PRINTF_ATTRIBUTE(2,3);
#endif
@@ -174,7 +210,8 @@ int rep_mkstemp(char *temp);
#endif
#ifndef HAVE_MKDTEMP
-char *mkdtemp(char *template);
+#define mkdtemp rep_mkdtemp
+char *rep_mkdtemp(char *template);
#endif
#ifdef HAVE_LIMITS_H
@@ -248,4 +285,6 @@ typedef int bool;
#define __STRING(x) #x
#endif
+
+
#endif
diff --git a/source4/lib/replace/replace.m4 b/source4/lib/replace/replace.m4
new file mode 100644
index 0000000000..829f4db6f6
--- /dev/null
+++ b/source4/lib/replace/replace.m4
@@ -0,0 +1,58 @@
+dnl Try to find a replacement library
+dnl Will define HAVE_REPLACE_H if replace.h can be found
+AC_DEFUN([SMB_LIBREPLACE], [
+AC_ARG_WITH(libreplace,
+[ --with-libreplace Specify location to libreplace],
+[
+ # Check whether libreplace can actually be found in this location
+ if ! test -f "$withval/replace.h"
+ then
+ AC_MSG_ERROR([Unable to find replace.h in $withval])
+ fi
+ replacedir=$withval
+],
+[
+ # Check if we can find libreplace in a common location
+ for dir in . replace ../replace
+ do
+ AC_MSG_CHECKING([for libreplace in $dir])
+ if test -f "$dir/replace.h"
+ then
+ replacedir="$dir"
+ AC_MSG_RESULT(yes)
+ break
+ fi
+ AC_MSG_RESULT(no)
+ done
+])
+
+AC_SUBST(REPLACE_LIBS)
+
+if test "$replacedir" != ""
+then
+ REPLACE_LIBS="$replacedir/libreplace.a"
+ CFLAGS="$CFLAGS -I$replacedir"
+ AC_DEFINE(HAVE_REPLACE_H, 1,
+ [Whether replace.h is present and should be used])
+fi
+])
+
+dnl Try to find the specified functions in the system, or
+dnl in Samba's replacement library. In the future, this may also
+dnl try to find these functions in libroken or GNUlib if libreplace can't be
+dnl found.
+AC_DEFUN(SMB_REPLACE_FUNCS, [
+ AC_REQUIRE([SMB_LIBREPLACE])dnl
+
+ if test -z "$replacedir" || test -f "$replacedir/libreplace.a"
+ then
+ LIBS="$LIBS $REPLACE_LIBS"
+ for f in $1
+ do
+ AC_CHECK_FUNC($f, [], [
+ AC_MSG_ERROR([Unable to find $f in the system. Consider
+ specifying the path to the replacement library])
+ ])
+ done
+ fi
+])
diff --git a/source4/lib/replace/snprintf.c b/source4/lib/replace/snprintf.c
index eaa5eec405..8182f83751 100644
--- a/source4/lib/replace/snprintf.c
+++ b/source4/lib/replace/snprintf.c
@@ -103,11 +103,11 @@
*
**************************************************************/
-#ifndef NO_CONFIG_H
+#ifdef _SAMBA_BUILD_
#include "config.h"
#else
-#define NULL 0
-#endif
+#include "replace_config.h"
+#endif
#ifdef TEST_SNPRINTF /* need math library headers for testing */
diff --git a/source4/lib/replace/test/testsuite.c b/source4/lib/replace/test/testsuite.c
new file mode 100644
index 0000000000..2c68fd6664
--- /dev/null
+++ b/source4/lib/replace/test/testsuite.c
@@ -0,0 +1,366 @@
+/*
+ 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 2 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "../replace.h"
+#include <stdio.h>
+
+int test_ftruncate()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_strlcpy()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_strlcat()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_mktime()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_rename()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_innetgr()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_initgroups()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_memmove()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_strdup()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_setlinebuf()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_vsyslog()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_timegm()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_setenv()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_strndup()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_strnlen()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_waitpid()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_seteuid()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_setegid()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_asprintf()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_snprintf()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_vasprintf()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_vsnprintf()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_opendir()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_readdir()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_telldir()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_seekdir()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_dlopen()
+{
+ /* FIXME: test dlopen, dlsym, dlclose, dlerror */
+ return true;
+}
+
+
+int test_chroot()
+{
+ /* FIXME: chroot() */
+ return true;
+}
+
+int test_bzero()
+{
+ /* FIXME: bzero */
+ return true;
+}
+
+int test_strerror()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_errno()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_mkdtemp()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_mkstemp()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_pread()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_pwrite()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_getpass()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_inet_ntoa()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_strtoll()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_strtoull()
+{
+ /* FIXME */
+ return true;
+}
+
+/*
+FIXME:
+Types:
+bool
+socklen_t
+uint_t
+uint{8,16,32,64}_t
+int{8,16,32,64}_t
+intptr_t
+
+Constants:
+PATH_NAME_MAX
+UINT{16,32,64}_MAX
+INT32_MAX
+*/
+
+int test_va_copy()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_FUNCTION()
+{
+ /* FIXME: test __FUNCTION__ macro */
+ return true;
+}
+
+int test_MIN()
+{
+ /* FIXME */
+ return true;
+}
+
+int test_MAX()
+{
+ /* FIXME */
+ return true;
+}
+
+int torture_local_replace()
+{
+ int ret = true;
+;
+ ret &= test_ftruncate();
+ ret &= test_strlcpy();
+ ret &= test_strlcat();
+ ret &= test_mktime();
+ ret &= test_rename();
+ ret &= test_innetgr();
+ ret &= test_initgroups();
+ ret &= test_memmove();
+ ret &= test_strdup();
+ ret &= test_setlinebuf();
+ ret &= test_vsyslog();
+ ret &= test_timegm();
+ ret &= test_setenv();
+ ret &= test_strndup();
+ ret &= test_strnlen();
+ ret &= test_waitpid();
+ ret &= test_seteuid();
+ ret &= test_setegid();
+ ret &= test_asprintf();
+ ret &= test_snprintf();
+ ret &= test_vasprintf();
+ ret &= test_vsnprintf();
+ ret &= test_opendir();
+ ret &= test_readdir() ;
+ ret &= test_telldir();
+ ret &= test_seekdir();
+ ret &= test_dlopen();
+ ret &= test_chroot();
+ ret &= test_bzero();
+ ret &= test_strerror();
+ ret &= test_errno();
+ ret &= test_mkdtemp();
+ ret &= test_mkstemp();
+ ret &= test_pread();
+ ret &= test_pwrite();
+ 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();
+
+ return ret;
+}
+
+#if !defined(_SAMBA_BUILD_) || ((SAMBA_VERSION_MAJOR==3)&&(SAMBA_VERSION_MINOR<9))
+int main(void)
+{
+ if (!torture_local_replace(NULL)) {
+ printf("ERROR: TESTSUITE FAILED\n");
+ return -1;
+ }
+ return 0;
+}
+#endif
diff --git a/source4/lib/ldb/replace/timegm.c b/source4/lib/replace/timegm.c
index 5fb15475f3..5fb15475f3 100644
--- a/source4/lib/ldb/replace/timegm.c
+++ b/source4/lib/replace/timegm.c
diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk
index 8c704520f5..dc523d4ede 100644
--- a/source4/lib/talloc/config.mk
+++ b/source4/lib/talloc/config.mk
@@ -6,6 +6,7 @@ SO_VERSION = 0
OBJ_FILES = talloc.o
PUBLIC_DEPENDENCIES = LIBREPLACE
MANPAGE = talloc.3
+CFLAGS = -Ilib/talloc
PUBLIC_HEADERS = talloc.h
DESCRIPTION = A hierarchical pool based memory system with destructors
#
diff --git a/source4/lib/talloc/configure.in b/source4/lib/talloc/configure.ac
index 253992cb1a..253992cb1a 100644
--- a/source4/lib/talloc/configure.in
+++ b/source4/lib/talloc/configure.ac
diff --git a/source4/lib/tdb/Makefile.in b/source4/lib/tdb/Makefile.in
index 3969995db3..e68f7eb8c3 100644
--- a/source4/lib/tdb/Makefile.in
+++ b/source4/lib/tdb/Makefile.in
@@ -40,20 +40,23 @@ install: all
cp $(srcdir)/include/tdb.h $(includedir)
cp tdb.pc $(libdir)/pkgconfig
-bin/tdbtest: tools/tdbtest.o $(TDB_OBJ)
- $(CC) $(CFLAGS) -o bin/tdbtest tools/tdbtest.o $(TDB_OBJ) -lgdbm
+libtdb.a: $(TDB_OBJ)
+ ar -rv libtdb.a $(TDB_OBJ)
-bin/tdbtool: tools/tdbtool.o $(TDB_OBJ)
- $(CC) $(CFLAGS) -o bin/tdbtool tools/tdbtool.o $(TDB_OBJ)
+bin/tdbtest: tools/tdbtest.o libtdb.a
+ $(CC) $(CFLAGS) -o bin/tdbtest tools/tdbtest.o -L. -ltdb -lgdbm
-bin/tdbtorture: tools/tdbtorture.o $(TDB_OBJ)
- $(CC) $(CFLAGS) -o bin/tdbtorture tools/tdbtorture.o $(TDB_OBJ)
+bin/tdbtool: tools/tdbtool.o libtdb.a
+ $(CC) $(CFLAGS) -o bin/tdbtool tools/tdbtool.o -L. -ltdb
-bin/tdbdump: tools/tdbdump.o $(TDB_OBJ)
- $(CC) $(CFLAGS) -o bin/tdbdump tools/tdbdump.o $(TDB_OBJ)
+bin/tdbtorture: tools/tdbtorture.o libtdb.a
+ $(CC) $(CFLAGS) -o bin/tdbtorture tools/tdbtorture.o -L. -ltdb
-bin/tdbbackup: tools/tdbbackup.o $(TDB_OBJ)
- $(CC) $(CFLAGS) -o bin/tdbbackup tools/tdbbackup.o $(TDB_OBJ)
+bin/tdbdump: tools/tdbdump.o libtdb.a
+ $(CC) $(CFLAGS) -o bin/tdbdump tools/tdbdump.o -L. -ltdb
+
+bin/tdbbackup: tools/tdbbackup.o libtdb.a
+ $(CC) $(CFLAGS) -o bin/tdbbackup tools/tdbbackup.o -L. -ltdb
clean:
rm -f $(PROGS) common/*.o tools/*.o *~ *.bak */*~ */*.bak *% core test.db test.tdb test.gdbm
diff --git a/source4/lib/tdb/configure.in b/source4/lib/tdb/configure.ac
index b067940781..b067940781 100644
--- a/source4/lib/tdb/configure.in
+++ b/source4/lib/tdb/configure.ac