mirror of
https://github.com/samba-team/samba.git
synced 2025-03-29 02:50:28 +03:00
r10438: Move portability functions to lib/replace/; replace now simply ensures
that a given set of (working) POSIX functions are available (without prefixes to their names, etc). See lib/replace/README for a list. Functions that behave different from their POSIX specification (such as sys_select, sys_read, etc) have kept the sys_ prefix. (This used to be commit 29919a71059b29fa27a49b1f5b84bb8881de65fc)
This commit is contained in:
parent
92d74c3408
commit
f3b412fbd6
@ -9,8 +9,6 @@
|
||||
|
||||
import cPickle, string, os
|
||||
|
||||
# We don't care about NFS builds...
|
||||
|
||||
opts = Options(None, ARGUMENTS)
|
||||
opts.AddOptions(
|
||||
BoolOption('developer','enable developer flags', False),
|
||||
@ -26,6 +24,7 @@ hostenv = Environment(
|
||||
CPPDEFINES={'_SAMBA_BUILD_': None},
|
||||
)
|
||||
|
||||
# We don't care about NFS builds...
|
||||
hostenv.SetOption('max_drift', 1)
|
||||
|
||||
if hostenv['developer']:
|
||||
|
@ -53,19 +53,14 @@ AC_HEADER_DIRENT
|
||||
AC_HEADER_TIME
|
||||
AC_HEADER_SYS_WAIT
|
||||
AC_CHECK_HEADERS(sys/select.h fcntl.h sys/fcntl.h sys/time.h)
|
||||
AC_CHECK_HEADERS(utime.h grp.h sys/id.h limits.h memory.h)
|
||||
AC_CHECK_HEADERS(compat.h math.h)
|
||||
AC_CHECK_HEADERS(utime.h grp.h sys/id.h limits.h memory.h compat.h math.h)
|
||||
AC_CHECK_HEADERS(sys/param.h ctype.h sys/wait.h sys/resource.h sys/ioctl.h sys/ipc.h sys/mode.h)
|
||||
AC_CHECK_HEADERS(sys/mman.h sys/filio.h sys/priv.h sys/shm.h string.h strings.h stdlib.h)
|
||||
AC_CHECK_HEADERS(sys/vfs.h sys/fs/s5param.h sys/filsys.h termios.h termio.h)
|
||||
AC_CHECK_HEADERS(fnmatch.h pwd.h sys/termio.h sys/time.h sys/statfs.h sys/statvfs.h stdarg.h)
|
||||
AC_CHECK_HEADERS(security/pam_modules.h security/_pam_macros.h dlfcn.h)
|
||||
AC_CHECK_HEADERS(sys/syslog.h syslog.h)
|
||||
AC_CHECK_HEADERS(stdint.h inttypes.h locale.h)
|
||||
AC_CHECK_HEADERS(shadow.h)
|
||||
AC_CHECK_HEADERS(stdint.h inttypes.h locale.h shadow.h)
|
||||
AC_CHECK_HEADERS(nss.h nss_common.h ns_api.h sys/security.h security/pam_appl.h)
|
||||
AC_CHECK_HEADERS(sys/capability.h syscall.h sys/syscall.h)
|
||||
AC_CHECK_HEADERS(sys/acl.h)
|
||||
AC_CHECK_HEADERS(sys/capability.h sys/acl.h)
|
||||
|
||||
AC_CHECK_HEADERS(sys/mount.h, , , [AC_INCLUDES_DEFAULT
|
||||
#ifdef HAVE_SYS_PARAM_H
|
||||
@ -89,12 +84,6 @@ AC_CHECK_TYPES(intptr_t)
|
||||
AC_CHECK_TYPES(long long)
|
||||
|
||||
|
||||
############################################
|
||||
# we need dlopen/dlclose/dlsym/dlerror for PAM, the password database plugins and the plugin loading code
|
||||
AC_SEARCH_LIBS_EXT(dlopen, [dl], DL_LIBS)
|
||||
SMB_EXT_LIB(DL,[${DL_LIBS}],[${DL_CFLAGS}],[${DL_CPPFLAGS}],[${DL_LDFLAGS}])
|
||||
# dlopen/dlclose/dlsym/dlerror will be checked again later and defines will be set then
|
||||
|
||||
AC_CACHE_CHECK([for sig_atomic_t type],samba_cv_sig_atomic_t, [
|
||||
AC_TRY_COMPILE([
|
||||
#include <sys/types.h>
|
||||
@ -108,29 +97,12 @@ if test x"$samba_cv_sig_atomic_t" = x"yes"; then
|
||||
AC_DEFINE(HAVE_SIG_ATOMIC_T_TYPE,1,[Whether we have the atomic_t variable type])
|
||||
fi
|
||||
|
||||
# stupid headers have the functions but no declaration. grrrr.
|
||||
AC_HAVE_DECL(errno, [#include <errno.h>])
|
||||
AC_HAVE_DECL(setresuid, [#include <unistd.h>])
|
||||
AC_HAVE_DECL(setresgid, [#include <unistd.h>])
|
||||
AC_HAVE_DECL(asprintf, [#include <stdio.h>])
|
||||
AC_HAVE_DECL(vasprintf, [#include <stdio.h>])
|
||||
AC_HAVE_DECL(vsnprintf, [#include <stdio.h>])
|
||||
AC_HAVE_DECL(snprintf, [#include <stdio.h>])
|
||||
|
||||
AC_FUNC_MEMCMP
|
||||
|
||||
AC_CHECK_FUNCS(dlopen dlsym dlerror waitpid getcwd strdup strndup strnlen strerror chroot)
|
||||
AC_CHECK_FUNCS(bzero memset strlcpy strlcat)
|
||||
AC_CHECK_FUNCS(memmove vsnprintf snprintf asprintf vasprintf setsid pipe crypt16 getauthuid)
|
||||
AC_CHECK_FUNCS(strftime sigprocmask sigblock sigaction innetgr setnetgrent getnetgrent endnetgrent)
|
||||
AC_CHECK_FUNCS(initgroups)
|
||||
AC_CHECK_FUNCS(setgroups sysconf mktime rename ftruncate chsize)
|
||||
AC_CHECK_FUNCS(getpwanam setlinebuf)
|
||||
AC_CHECK_FUNCS(srandom random srand rand setenv usleep)
|
||||
AC_CHECK_FUNCS(syslog vsyslog timegm backtrace)
|
||||
AC_CHECK_FUNCS(setbuffer)
|
||||
|
||||
AC_CHECK_FUNCS(pread pwrite)
|
||||
AC_CHECK_FUNCS(setsid pipe crypt16 getauthuid)
|
||||
AC_CHECK_FUNCS(strftime sigprocmask sigblock sigaction)
|
||||
AC_CHECK_FUNCS(setgroups sysconf getpwanam srandom random srand rand usleep)
|
||||
AC_CHECK_FUNCS(backtrace setbuffer pread pwrite)
|
||||
|
||||
# Assume non-shared by default and override below
|
||||
BLDSHARED="false"
|
||||
@ -358,39 +330,6 @@ if test x"$samba_cv_HAVE___VA_COPY" = x"yes"; then
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for C99 vsnprintf],samba_cv_HAVE_C99_VSNPRINTF,[
|
||||
AC_TRY_RUN([
|
||||
#include <sys/types.h>
|
||||
#include <stdarg.h>
|
||||
void foo(const char *format, ...) {
|
||||
va_list ap;
|
||||
int len;
|
||||
char buf[20];
|
||||
long long l = 1234567890;
|
||||
l *= 100;
|
||||
|
||||
va_start(ap, format);
|
||||
len = vsnprintf(buf, 0, format, ap);
|
||||
va_end(ap);
|
||||
if (len != 5) exit(1);
|
||||
|
||||
va_start(ap, format);
|
||||
len = vsnprintf(0, 0, format, ap);
|
||||
va_end(ap);
|
||||
if (len != 5) exit(1);
|
||||
|
||||
if (snprintf(buf, 3, "hello") != 5 || strcmp(buf, "he") != 0) exit(1);
|
||||
|
||||
if (snprintf(buf, 20, "%lld", l) != 12 || strcmp(buf, "123456789000") != 0) exit(1);
|
||||
|
||||
exit(0);
|
||||
}
|
||||
main() { foo("hello"); }
|
||||
],
|
||||
samba_cv_HAVE_C99_VSNPRINTF=yes,samba_cv_HAVE_C99_VSNPRINTF=no,samba_cv_HAVE_C99_VSNPRINTF=cross)])
|
||||
if test x"$samba_cv_HAVE_C99_VSNPRINTF" = x"yes"; then
|
||||
AC_DEFINE(HAVE_C99_VSNPRINTF,1,[Whether there is a C99 compliant vsnprintf])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for utimbuf],samba_cv_HAVE_UTIMBUF,[
|
||||
AC_TRY_COMPILE([#include <sys/types.h>
|
||||
@ -499,28 +438,6 @@ if test x"$samba_cv_HAVE_BROKEN_GETGROUPS" = x"yes"; then
|
||||
AC_DEFINE(HAVE_BROKEN_GETGROUPS,1,[Whether getgroups is broken])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for secure mkstemp],samba_cv_HAVE_SECURE_MKSTEMP,[
|
||||
AC_TRY_RUN([#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
main() {
|
||||
struct stat st;
|
||||
char tpl[20]="/tmp/test.XXXXXX";
|
||||
int fd = mkstemp(tpl);
|
||||
if (fd == -1) exit(1);
|
||||
unlink(tpl);
|
||||
if (fstat(fd, &st) != 0) exit(1);
|
||||
if ((st.st_mode & 0777) != 0600) exit(1);
|
||||
exit(0);
|
||||
}],
|
||||
samba_cv_HAVE_SECURE_MKSTEMP=yes,
|
||||
samba_cv_HAVE_SECURE_MKSTEMP=no,
|
||||
samba_cv_HAVE_SECURE_MKSTEMP=cross)])
|
||||
if test x"$samba_cv_HAVE_SECURE_MKSTEMP" = x"yes"; then
|
||||
AC_DEFINE(HAVE_SECURE_MKSTEMP,1,[Whether mkstemp is secure])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for sysconf(_SC_NGROUPS_MAX)],samba_cv_SYSCONF_SC_NGROUPS_MAX,[
|
||||
AC_TRY_RUN([#include <unistd.h>
|
||||
main() { exit(sysconf(_SC_NGROUPS_MAX) == -1 ? 1 : 0); }],
|
||||
@ -581,9 +498,6 @@ fi
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST(SMBD_EXTRA_OBJS)
|
||||
AC_SUBST(SMBD_EXTRA_LIBS)
|
||||
|
||||
###############################################
|
||||
# test for where we get crypt() from
|
||||
AC_CHECK_LIB_EXT(crypt, CRYPT_LIBS, crypt)
|
||||
|
@ -960,7 +960,7 @@ static int cmd_more(const char **cmd_ptr)
|
||||
fstrcat(rname,"\\");
|
||||
|
||||
slprintf(lname,sizeof(lname)-1, "%s/smbmore.XXXXXX",tmpdir());
|
||||
fd = smb_mkstemp(lname);
|
||||
fd = mkstemp(lname);
|
||||
if (fd == -1) {
|
||||
d_printf("failed to create temporary file for more\n");
|
||||
return 1;
|
||||
@ -2601,11 +2601,11 @@ static int cmd_printmode(const char **cmd_ptr)
|
||||
static int cmd_lcd(const char **cmd_ptr)
|
||||
{
|
||||
fstring buf;
|
||||
pstring d;
|
||||
char d[PATH_MAX];
|
||||
|
||||
if (next_token(cmd_ptr,buf,NULL,sizeof(buf)))
|
||||
chdir(buf);
|
||||
DEBUG(2,("the local directory is now %s\n",sys_getwd(d)));
|
||||
DEBUG(2,("the local directory is now %s\n",getcwd(d, PATH_MAX)));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -18,9 +18,6 @@
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "pstring.h"
|
||||
|
||||
/**
|
||||
* @file dynconfig.c
|
||||
*
|
||||
@ -41,25 +38,28 @@
|
||||
* table? There's kind of a chicken-and-egg situation there...
|
||||
**/
|
||||
|
||||
const char *dyn_SBINDIR = SBINDIR,
|
||||
*dyn_BINDIR = BINDIR;
|
||||
/** Directory with super-user binaries */
|
||||
const char *dyn_SBINDIR = SBINDIR;
|
||||
|
||||
const char *dyn_CONFIGFILE = CONFIGFILE; /**< Location of smb.conf file. **/
|
||||
/** Directory with generic binaries */
|
||||
const char *dyn_BINDIR = BINDIR;
|
||||
|
||||
/**< Location of smb.conf file. **/
|
||||
const char *dyn_CONFIGFILE = CONFIGFILE;
|
||||
|
||||
/** Log file directory. **/
|
||||
const char *dyn_LOGFILEBASE = LOGFILEBASE;
|
||||
const char *dyn_LOGFILEBASE = LOGFILEBASE;
|
||||
|
||||
/** Directory for local RPC (ncalrpc: transport) */
|
||||
const char *dyn_NCALRPCDIR = NCALRPCDIR;
|
||||
|
||||
/** Statically configured LanMan hosts. **/
|
||||
const char *dyn_LMHOSTSFILE = LMHOSTSFILE;
|
||||
const char *dyn_LMHOSTSFILE = LMHOSTSFILE;
|
||||
|
||||
/**
|
||||
* @brief Samba library directory.
|
||||
*
|
||||
* @sa lib_path() to get the path to a file inside the LIBDIR.
|
||||
**/
|
||||
/** Samba library directory. */
|
||||
const char *dyn_LIBDIR = LIBDIR;
|
||||
|
||||
/** Shared library extension */
|
||||
const char *dyn_SHLIBEXT = SHLIBEXT;
|
||||
|
||||
/**
|
||||
@ -68,7 +68,12 @@ const char *dyn_SHLIBEXT = SHLIBEXT;
|
||||
* Not writable, but used to set a default in the parameter table.
|
||||
**/
|
||||
const char *dyn_LOCKDIR = LOCKDIR;
|
||||
|
||||
/** pid file directory */
|
||||
const char *dyn_PIDDIR = PIDDIR;
|
||||
|
||||
/** Private data directory; holds ldb files and the like */
|
||||
const char *dyn_PRIVATE_DIR = PRIVATE_DIR;
|
||||
|
||||
/** SWAT data file (images, etc) directory */
|
||||
const char *dyn_SWATDIR = SWATDIR;
|
||||
|
@ -43,7 +43,7 @@ krb5_error_code KRB5_LIB_FUNCTION krb5_get_all_client_addrs(krb5_context context
|
||||
if (res->val[i].address.data == NULL) {
|
||||
return ENOMEM;
|
||||
}
|
||||
((struct in_addr *)res->val[i].address.data)->s_addr = sys_inet_addr(ip);
|
||||
((struct in_addr *)res->val[i].address.data)->s_addr = inet_addr(ip);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -76,10 +76,6 @@
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER) || defined(__MINGW32__)
|
||||
#include "lib/replace/win32/replace.h"
|
||||
#endif
|
||||
|
||||
/* we support ADS if we want it and have krb5 and ldap libs */
|
||||
#if defined(WITH_ADS) && defined(HAVE_KRB5) && defined(HAVE_LDAP)
|
||||
#define HAVE_ADS
|
||||
@ -106,15 +102,6 @@ struct ipv4_addr {
|
||||
uint32_t addr;
|
||||
};
|
||||
|
||||
#ifndef HAVE_STRERROR
|
||||
extern char *sys_errlist[];
|
||||
#define strerror(i) sys_errlist[i]
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_ERRNO_DECL
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
|
||||
#include "lib/replace/replace.h"
|
||||
|
||||
|
@ -58,13 +58,13 @@ static struct IUnknown *get_com_class_so(TALLOC_CTX *mem_ctx, const struct GUID
|
||||
mod_name = talloc_asprintf(mem_ctx, "%s.so", clsid_str);
|
||||
talloc_free(clsid_str);
|
||||
|
||||
mod = sys_dlopen(mod_name, 0);
|
||||
mod = dlopen(mod_name, 0);
|
||||
|
||||
if (!mod) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
f = sys_dlsym(mod, "get_class_object");
|
||||
f = dlsym(mod, "get_class_object");
|
||||
|
||||
if (!f) {
|
||||
return NULL;
|
||||
|
54
source4/lib/replace/README
Normal file
54
source4/lib/replace/README
Normal file
@ -0,0 +1,54 @@
|
||||
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
|
||||
(such as LIBUTIL).
|
||||
|
||||
The following functions are guarenteed:
|
||||
|
||||
ftruncate
|
||||
strlcpy
|
||||
strlcat
|
||||
mktime
|
||||
rename
|
||||
innetgr
|
||||
initgroups
|
||||
memmove
|
||||
strdup
|
||||
inet_ntoa
|
||||
setlinebuf
|
||||
vsyslog
|
||||
timegm
|
||||
setenv
|
||||
strtoull
|
||||
strtoll
|
||||
strndup
|
||||
strnlen
|
||||
waitpid
|
||||
seteuid
|
||||
setegid
|
||||
asprintf
|
||||
snprintf
|
||||
vasprintf
|
||||
vsnprintf
|
||||
opendir
|
||||
readdir
|
||||
telldir
|
||||
seekdir
|
||||
closedir
|
||||
dlopen
|
||||
dlclose
|
||||
dlsym
|
||||
dlerror
|
||||
chroot
|
||||
bzero
|
||||
strerror
|
||||
errno
|
||||
mkstemp (a secure one!)
|
||||
|
||||
Prerequisites:
|
||||
memset (for bzero)
|
||||
syslog (for vsyslog)
|
||||
setnetgrent, getnetgrent, endnetgrent (for innetgr)
|
||||
mktemp (for mkstemp)
|
@ -9,4 +9,4 @@ if hostenv['configure']:
|
||||
conf.Finish()
|
||||
|
||||
hostenv.StaticLibrary('repdir', ['repdir/repdir.c'])
|
||||
hostenv.StaticLibrary('replace', ['replace.c', 'snprintf.c'])
|
||||
hostenv.StaticLibrary('replace', ['replace.c', 'snprintf.c','dlfcn.c'])
|
||||
|
@ -15,5 +15,87 @@ if test x"$samba_cv_REPLACE_INET_NTOA" = x"yes"; then
|
||||
AC_DEFINE(REPLACE_INET_NTOA,1,[Whether inet_ntoa should be replaced])
|
||||
fi
|
||||
|
||||
dnl Provided by replace.c:
|
||||
AC_CHECK_HEADERS(sys/syslog.h syslog.h)
|
||||
AC_CHECK_FUNCS(strtoull __strtoull strtouq strtoll __strtoll strtoq)
|
||||
AC_CHECK_FUNCS(seteuid setresuid setegid setresgid)
|
||||
AC_CHECK_FUNCS(seteuid setresuid setegid setresgid chroot bzero strerror)
|
||||
AC_CHECK_FUNCS(timegm setenv vsyslog setlinebuf mktime ftruncate chsize rename)
|
||||
AC_CHECK_FUNCS(waitpid strnlen strlcpy strlcat innetgr initgroups memmove strdup)
|
||||
AC_HAVE_DECL(setresuid, [#include <unistd.h>])
|
||||
AC_HAVE_DECL(setresgid, [#include <unistd.h>])
|
||||
AC_HAVE_DECL(errno, [#include <errno.h>])
|
||||
|
||||
AC_CACHE_CHECK([for secure mkstemp],samba_cv_HAVE_SECURE_MKSTEMP,[
|
||||
AC_TRY_RUN([#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
main() {
|
||||
struct stat st;
|
||||
char tpl[20]="/tmp/test.XXXXXX";
|
||||
int fd = mkstemp(tpl);
|
||||
if (fd == -1) exit(1);
|
||||
unlink(tpl);
|
||||
if (fstat(fd, &st) != 0) exit(1);
|
||||
if ((st.st_mode & 0777) != 0600) exit(1);
|
||||
exit(0);
|
||||
}],
|
||||
samba_cv_HAVE_SECURE_MKSTEMP=yes,
|
||||
samba_cv_HAVE_SECURE_MKSTEMP=no,
|
||||
samba_cv_HAVE_SECURE_MKSTEMP=cross)])
|
||||
if test x"$samba_cv_HAVE_SECURE_MKSTEMP" = x"yes"; then
|
||||
AC_DEFINE(HAVE_SECURE_MKSTEMP,1,[Whether mkstemp is secure])
|
||||
fi
|
||||
|
||||
dnl Provided by snprintf.c:
|
||||
AC_HAVE_DECL(asprintf, [#include <stdio.h>])
|
||||
AC_HAVE_DECL(vasprintf, [#include <stdio.h>])
|
||||
AC_HAVE_DECL(vsnprintf, [#include <stdio.h>])
|
||||
AC_HAVE_DECL(snprintf, [#include <stdio.h>])
|
||||
AC_CHECK_FUNCS(snprintf vsnprintf asprintf vasprintf)
|
||||
|
||||
AC_CACHE_CHECK([for C99 vsnprintf],samba_cv_HAVE_C99_VSNPRINTF,[
|
||||
AC_TRY_RUN([
|
||||
#include <sys/types.h>
|
||||
#include <stdarg.h>
|
||||
void foo(const char *format, ...) {
|
||||
va_list ap;
|
||||
int len;
|
||||
char buf[20];
|
||||
long long l = 1234567890;
|
||||
l *= 100;
|
||||
|
||||
va_start(ap, format);
|
||||
len = vsnprintf(buf, 0, format, ap);
|
||||
va_end(ap);
|
||||
if (len != 5) exit(1);
|
||||
|
||||
va_start(ap, format);
|
||||
len = vsnprintf(0, 0, format, ap);
|
||||
va_end(ap);
|
||||
if (len != 5) exit(1);
|
||||
|
||||
if (snprintf(buf, 3, "hello") != 5 || strcmp(buf, "he") != 0) exit(1);
|
||||
|
||||
if (snprintf(buf, 20, "%lld", l) != 12 || strcmp(buf, "123456789000") != 0) exit(1);
|
||||
|
||||
exit(0);
|
||||
}
|
||||
main() { foo("hello"); }
|
||||
],
|
||||
samba_cv_HAVE_C99_VSNPRINTF=yes,samba_cv_HAVE_C99_VSNPRINTF=no,samba_cv_HAVE_C99_VSNPRINTF=cross)])
|
||||
if test x"$samba_cv_HAVE_C99_VSNPRINTF" = x"yes"; then
|
||||
AC_DEFINE(HAVE_C99_VSNPRINTF,1,[Whether there is a C99 compliant vsnprintf])
|
||||
fi
|
||||
|
||||
dnl Provided by dlfcn.c:
|
||||
AC_SEARCH_LIBS_EXT(dlopen, [dl], DL_LIBS)
|
||||
SMB_EXT_LIB(DL,[${DL_LIBS}],[${DL_CFLAGS}],[${DL_CPPFLAGS}],[${DL_LDFLAGS}])
|
||||
SAVE_LIBS="$LIBS"
|
||||
LIBS="$LIBS $DL_LIBS"
|
||||
AC_CHECK_HEADERS(dlfcn.h)
|
||||
AC_CHECK_FUNCS(dlopen dlsym dlerror dlclose)
|
||||
LIBS="$SAVE_LIBS"
|
||||
|
||||
AC_CHECK_FUNCS([syslog memset setnetgrent getnetgrent endnetgrent],,
|
||||
[AC_MSG_ERROR([Need syslog and memset])])
|
||||
|
@ -13,7 +13,9 @@ NOPROTO = YES
|
||||
[SUBSYSTEM::LIBREPLACE]
|
||||
INIT_OBJ_FILES = lib/replace/replace.o
|
||||
ADD_OBJ_FILES = \
|
||||
lib/replace/snprintf.o
|
||||
lib/replace/snprintf.o \
|
||||
lib/replace/dlfcn.o
|
||||
NOPROTO = YES
|
||||
REQUIRED_SUBSYSTEMS = REPLACE_READDIR
|
||||
# End SUBSYSTEM LIBREPLACE
|
||||
##############################
|
||||
|
71
source4/lib/replace/dlfcn.c
Normal file
71
source4/lib/replace/dlfcn.c
Normal file
@ -0,0 +1,71 @@
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
Samba system utilities
|
||||
Copyright (C) Andrew Tridgell 1992-1998
|
||||
Copyright (C) Jeremy Allison 1998-2002
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
Samba system utilities
|
||||
Copyright (C) Andrew Tridgell 1992-1998
|
||||
Copyright (C) Jeremy Allison 1998-2002
|
||||
|
||||
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"
|
||||
|
||||
#ifndef HAVE_DLOPEN
|
||||
void *dlopen(const char *name, int flags)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DLSYM
|
||||
void *dlsym(void *handle, const char *symbol)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DLERROR
|
||||
const char *dlerror(void)
|
||||
{
|
||||
return "dynamic loading of objects not supported on this platform";
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DLCLOSE
|
||||
int dlclose(void *handle)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
@ -361,39 +361,6 @@ duplicate a string
|
||||
#endif /* HAVE_SYSLOG */
|
||||
#endif /* HAVE_VSYSLOG */
|
||||
|
||||
/*******************************************************************
|
||||
yield the difference between *A and *B, in seconds, ignoring leap seconds
|
||||
********************************************************************/
|
||||
static int tm_diff(struct tm *a, struct tm *b)
|
||||
{
|
||||
int ay = a->tm_year + (1900 - 1);
|
||||
int by = b->tm_year + (1900 - 1);
|
||||
int intervening_leap_days =
|
||||
(ay/4 - by/4) - (ay/100 - by/100) + (ay/400 - by/400);
|
||||
int years = ay - by;
|
||||
int days = 365*years + intervening_leap_days + (a->tm_yday - b->tm_yday);
|
||||
int hours = 24*days + (a->tm_hour - b->tm_hour);
|
||||
int minutes = 60*hours + (a->tm_min - b->tm_min);
|
||||
int seconds = 60*minutes + (a->tm_sec - b->tm_sec);
|
||||
|
||||
return seconds;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
return the UTC offset in seconds west of UTC, or 0 if it cannot be determined
|
||||
******************************************************************/
|
||||
int get_time_zone(time_t t)
|
||||
{
|
||||
struct tm *tm = gmtime(&t);
|
||||
struct tm tm_utc;
|
||||
if (!tm)
|
||||
return 0;
|
||||
tm_utc = *tm;
|
||||
tm = localtime(&t);
|
||||
if (!tm)
|
||||
return 0;
|
||||
return tm_diff(&tm_utc,tm);
|
||||
}
|
||||
|
||||
#ifndef HAVE_TIMEGM
|
||||
/*
|
||||
@ -496,14 +463,12 @@ int get_time_zone(time_t t)
|
||||
}
|
||||
#endif
|
||||
|
||||
int sys_waitpid(pid_t pid,int *status,int options)
|
||||
#ifndef HAVE_WAITPID
|
||||
int waitpid(pid_t pid,int *status,int options)
|
||||
{
|
||||
#ifdef HAVE_WAITPID
|
||||
return waitpid(pid,status,options);
|
||||
#else /* USE_WAITPID */
|
||||
return wait4(pid, status, options, NULL);
|
||||
#endif /* USE_WAITPID */
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SETEUID
|
||||
int seteuid(uid_t euid)
|
||||
@ -526,3 +491,35 @@ int sys_waitpid(pid_t pid,int *status,int options)
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
/*******************************************************************
|
||||
os/2 also doesn't have chroot
|
||||
********************************************************************/
|
||||
#ifndef HAVE_CHROOT
|
||||
int chroot(const char *dname)
|
||||
{
|
||||
static int done;
|
||||
if (!done) {
|
||||
DEBUG(1,("WARNING: no chroot!\n"));
|
||||
done=1;
|
||||
}
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*****************************************************************
|
||||
Possibly replace mkstemp if it is broken.
|
||||
*****************************************************************/
|
||||
|
||||
#ifndef HAVE_SECURE_MKSTEMP
|
||||
int rep_mkstemp(char *template)
|
||||
{
|
||||
/* have a reasonable go at emulating it. Hope that
|
||||
the system mktemp() isn't completly hopeless */
|
||||
char *p = mktemp(template);
|
||||
if (!p)
|
||||
return -1;
|
||||
return open(p, O_CREAT|O_EXCL|O_RDWR, 0600);
|
||||
}
|
||||
#endif
|
||||
|
@ -23,6 +23,10 @@
|
||||
#ifndef _replace_h
|
||||
#define _replace_h
|
||||
|
||||
#if defined(_MSC_VER) || defined(__MINGW32__)
|
||||
#include "lib/replace/win32/replace.h"
|
||||
#endif
|
||||
|
||||
#ifdef __COMPAR_FN_T
|
||||
#define QSORT_CAST (__compar_fn_t)
|
||||
#endif
|
||||
@ -31,6 +35,15 @@
|
||||
#define QSORT_CAST (int (*)(const void *, const void *))
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRERROR
|
||||
extern char *sys_errlist[];
|
||||
#define strerror(i) sys_errlist[i]
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_ERRNO_DECL
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRDUP
|
||||
char *strdup(const char *s);
|
||||
#endif
|
||||
@ -136,4 +149,13 @@ typedef unsigned char u_int8_t;
|
||||
#define HAVE_SOCKLEN_T 1
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_DLFCN_H
|
||||
#include <dlfcn.h>
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SECURE_MKSTEMP
|
||||
#define mkstemp(path) rep_mkstemp(path)
|
||||
int rep_mkstemp(char *temp);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -28,7 +28,7 @@
|
||||
|
||||
static void sig_cld(int signum)
|
||||
{
|
||||
while (sys_waitpid((pid_t)-1,(int *)NULL, WNOHANG) > 0)
|
||||
while (waitpid((pid_t)-1,(int *)NULL, WNOHANG) > 0)
|
||||
;
|
||||
|
||||
/*
|
||||
|
@ -23,7 +23,6 @@
|
||||
#include "system/network.h"
|
||||
#include "system/wait.h"
|
||||
#include "system/filesys.h"
|
||||
#include "pstring.h"
|
||||
|
||||
/*
|
||||
The idea is that this file will eventually have wrappers around all
|
||||
@ -77,20 +76,6 @@ int sys_usleep(long usecs)
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************
|
||||
System wrapper for getwd
|
||||
********************************************************************/
|
||||
char *sys_getwd(char *s)
|
||||
{
|
||||
char *wd;
|
||||
#ifdef HAVE_GETCWD
|
||||
wd = (char *)getcwd(s, sizeof (pstring));
|
||||
#else
|
||||
wd = (char *)getwd(s);
|
||||
#endif
|
||||
return wd;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
A read wrapper that will deal with EINTR.
|
||||
********************************************************************/
|
||||
@ -121,24 +106,6 @@ ssize_t sys_write(int fd, const void *buf, size_t count)
|
||||
|
||||
|
||||
|
||||
/*******************************************************************
|
||||
os/2 also doesn't have chroot
|
||||
********************************************************************/
|
||||
int sys_chroot(const char *dname)
|
||||
{
|
||||
#ifndef HAVE_CHROOT
|
||||
static int done;
|
||||
if (!done) {
|
||||
DEBUG(1,("WARNING: no chroot!\n"));
|
||||
done=1;
|
||||
}
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
#else
|
||||
return(chroot(dname));
|
||||
#endif
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
A wrapper for gethostbyname() that tries avoids looking up hostnames
|
||||
in the root domain, which can cause dial-on-demand links to come up for no
|
||||
@ -181,39 +148,6 @@ struct hostent *sys_gethostbyname(const char *name)
|
||||
#endif /* REDUCE_ROOT_DNS_LOOKUPS */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
Wrappers for dlopen, dlsym, dlclose.
|
||||
****************************************************************************/
|
||||
|
||||
void *sys_dlopen(const char *name, int flags)
|
||||
{
|
||||
#if defined(HAVE_DLOPEN)
|
||||
return dlopen(name, flags);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
void *sys_dlsym(void *handle, const char *symbol)
|
||||
{
|
||||
#if defined(HAVE_DLSYM)
|
||||
return dlsym(handle, symbol);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
const char *sys_dlerror(void)
|
||||
{
|
||||
#if defined(HAVE_DLERROR)
|
||||
return dlerror();
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
const char *sys_inet_ntoa(struct ipv4_addr in)
|
||||
{
|
||||
struct in_addr in2;
|
||||
@ -221,11 +155,6 @@ const char *sys_inet_ntoa(struct ipv4_addr in)
|
||||
return inet_ntoa(in2);
|
||||
}
|
||||
|
||||
uint32_t sys_inet_addr(const char *s)
|
||||
{
|
||||
return inet_addr(s);
|
||||
}
|
||||
|
||||
struct ipv4_addr sys_inet_makeaddr(int net, int host)
|
||||
{
|
||||
struct in_addr in;
|
||||
|
@ -594,3 +594,37 @@ NTTIME timeval_to_nttime(const struct timeval *tv)
|
||||
return 10*(tv->tv_usec +
|
||||
((TIME_FIXUP_CONSTANT + (uint64_t)tv->tv_sec) * 1000000));
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
yield the difference between *A and *B, in seconds, ignoring leap seconds
|
||||
********************************************************************/
|
||||
static int tm_diff(struct tm *a, struct tm *b)
|
||||
{
|
||||
int ay = a->tm_year + (1900 - 1);
|
||||
int by = b->tm_year + (1900 - 1);
|
||||
int intervening_leap_days =
|
||||
(ay/4 - by/4) - (ay/100 - by/100) + (ay/400 - by/400);
|
||||
int years = ay - by;
|
||||
int days = 365*years + intervening_leap_days + (a->tm_yday - b->tm_yday);
|
||||
int hours = 24*days + (a->tm_hour - b->tm_hour);
|
||||
int minutes = 60*hours + (a->tm_min - b->tm_min);
|
||||
int seconds = 60*minutes + (a->tm_sec - b->tm_sec);
|
||||
|
||||
return seconds;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
return the UTC offset in seconds west of UTC, or 0 if it cannot be determined
|
||||
******************************************************************/
|
||||
int get_time_zone(time_t t)
|
||||
{
|
||||
struct tm *tm = gmtime(&t);
|
||||
struct tm tm_utc;
|
||||
if (!tm)
|
||||
return 0;
|
||||
tm_utc = *tm;
|
||||
tm = localtime(&t);
|
||||
if (!tm)
|
||||
return 0;
|
||||
return tm_diff(&tm_utc,tm);
|
||||
}
|
||||
|
@ -347,7 +347,7 @@ uint32_t interpret_addr(const char *str)
|
||||
|
||||
/* if it's in the form of an IP address then get the lib to interpret it */
|
||||
if (is_ipaddress(str)) {
|
||||
res = sys_inet_addr(str);
|
||||
res = inet_addr(str);
|
||||
} else {
|
||||
/* otherwise assume it's a network name of some sort and use
|
||||
sys_gethostbyname */
|
||||
@ -518,24 +518,6 @@ void dump_data(int level, const uint8_t *buf,int len)
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************
|
||||
Possibly replace mkstemp if it is broken.
|
||||
*****************************************************************/
|
||||
|
||||
int smb_mkstemp(char *template)
|
||||
{
|
||||
#if HAVE_SECURE_MKSTEMP
|
||||
return mkstemp(template);
|
||||
#else
|
||||
/* have a reasonable go at emulating it. Hope that
|
||||
the system mktemp() isn't completly hopeless */
|
||||
char *p = mktemp(template);
|
||||
if (!p)
|
||||
return -1;
|
||||
return open(p, O_CREAT|O_EXCL|O_RDWR, 0600);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************
|
||||
malloc that aborts with smb_panic on fail or zero size.
|
||||
*****************************************************************/
|
||||
|
@ -105,7 +105,7 @@ static void pipe_handler(struct event_context *ev, struct fd_event *fde,
|
||||
/* enusre the address looks good */
|
||||
address[ret] = 0;
|
||||
if (strcmp(address, "0.0.0.0") == 0 ||
|
||||
sys_inet_addr(address) == INADDR_NONE) {
|
||||
inet_addr(address) == INADDR_NONE) {
|
||||
goto failed;
|
||||
}
|
||||
|
||||
|
@ -571,7 +571,7 @@ NTSTATUS ndr_push_ipv4address(struct ndr_push *ndr, int ndr_flags, const char *a
|
||||
{
|
||||
uint32_t addr;
|
||||
if (!is_ipaddress(address)) return NT_STATUS_INVALID_PARAMETER_MIX;
|
||||
addr = sys_inet_addr(address);
|
||||
addr = inet_addr(address);
|
||||
NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, htonl(addr)));
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
@ -2168,7 +2168,7 @@ double torture_create_procs(BOOL (*fn)(struct smbcli_state *, int), BOOL *result
|
||||
|
||||
for (i=0;i<torture_nprocs;i++) {
|
||||
int ret;
|
||||
while ((ret=sys_waitpid(0, &status, 0)) == -1 && errno == EINTR) /* noop */ ;
|
||||
while ((ret=waitpid(0, &status, 0)) == -1 && errno == EINTR) /* noop */ ;
|
||||
if (ret == -1 || WEXITSTATUS(status) != 0) {
|
||||
*result = False;
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ NTSTATUS wbsrv_samba3_pull_request(DATA_BLOB blob, TALLOC_CTX *mem_ctx, struct w
|
||||
|
||||
s3_call = talloc_zero(call, struct wbsrv_samba3_call);
|
||||
NT_STATUS_HAVE_NO_MEMORY(s3_call);
|
||||
s3call->call = call;
|
||||
s3_call->call = call;
|
||||
|
||||
/* the packet layout is the same as the in memory layout of the request, so just copy it */
|
||||
memcpy(&s3_call->request, blob.data, sizeof(s3_call->request));
|
||||
|
Loading…
x
Reference in New Issue
Block a user