diff options
Diffstat (limited to 'source4/lib/replace')
-rw-r--r-- | source4/lib/replace/Makefile.in | 37 | ||||
-rw-r--r-- | source4/lib/replace/README | 9 | ||||
-rwxr-xr-x | source4/lib/replace/autogen.sh | 10 | ||||
-rw-r--r-- | source4/lib/replace/config.m4 | 18 | ||||
-rw-r--r-- | source4/lib/replace/config.mk | 1 | ||||
-rw-r--r-- | source4/lib/replace/configure.ac | 52 | ||||
-rw-r--r-- | source4/lib/replace/dlfcn.c | 31 | ||||
-rw-r--r-- | source4/lib/replace/getpass.c | 35 | ||||
-rw-r--r-- | source4/lib/replace/repdir/repdir.c | 28 | ||||
-rw-r--r-- | source4/lib/replace/replace.c | 200 | ||||
-rw-r--r-- | source4/lib/replace/replace.h | 105 | ||||
-rw-r--r-- | source4/lib/replace/replace.m4 | 58 | ||||
-rw-r--r-- | source4/lib/replace/snprintf.c | 6 | ||||
-rw-r--r-- | source4/lib/replace/test/testsuite.c | 366 | ||||
-rw-r--r-- | source4/lib/replace/timegm.c | 72 |
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 */ |