summaryrefslogtreecommitdiff
path: root/source4/lib/replace
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/replace
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/replace')
-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.c72
15 files changed, 916 insertions, 112 deletions
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/replace/timegm.c b/source4/lib/replace/timegm.c
new file mode 100644
index 0000000000..5fb15475f3
--- /dev/null
+++ b/source4/lib/replace/timegm.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 1997 Kungliga Tekniska Högskolan
+ * (Royal Institute of Technology, Stockholm, Sweden).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the Institute nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ adapted for Samba4 by Andrew Tridgell
+*/
+
+#include "includes.h"
+#include "ldb/include/includes.h"
+
+#ifndef 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 /* HAVE_TIMEGM */