diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile | 128 | ||||
-rw-r--r-- | src/Makefile.OSX | 75 | ||||
-rw-r--r-- | src/Makefile.am | 37 | ||||
-rw-r--r-- | src/faketime.c | 37 | ||||
-rw-r--r-- | src/faketime_common.h | 24 | ||||
-rw-r--r-- | src/libfaketime.c | 1 |
6 files changed, 220 insertions, 82 deletions
diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..4f67ca3 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,128 @@ +# +# Notes: +# +# * Compilation Defines: +# +# FAKE_STAT +# - Enables time faking also for files' timestamps. +# +# NO_ATFILE +# - Disables support for the fstatat() group of functions +# +# PTHREAD_SINGLETHREADED_TIME +# - Define this if you want to single-thread time() ... there ARE +# possible caching side-effects in a multithreaded environment +# without this, but the performance impact may require you to +# try it unsynchronized. +# +# FAKE_INTERNAL_CALLS +# - Also intercept libc internal __functions, e.g. not just time(), +# but also __time(). Enhances compatibility with applications +# that make use of low-level system calls, such as Java Virtual +# Machines. +# +# FAKE_SLEEP +# - Also intercept sleep(), nanosleep(), usleep(), alarm(), [p]poll() +# +# FAKE_TIMERS +# - Also intercept timer_settime() and timer_gettime() +# +# FAKE_PTHREAD +# - Intercept pthread_cond_timedwait +# +# FAKE_SETTIME +# - Intercept clock_settime(), settimeofday(), and adjtime() +# +# FORCE_MONOTONIC_FIX +# - If the test program hangs forever on +# " pthread_cond_timedwait: CLOCK_MONOTONIC test +# (Intentionally sleeping 1 second...) " +# then add -DFORCE_MONOTONIC_FIX to CFLAGS and recompile. +# (This is a platform-specific issue we cannot handle at run-time.) +# +# MULTI_ARCH +# - If MULTI_ARCH is set, the faketime wrapper program will put a literal +# $LIB into the LD_PRELOAD environment variable it creates, which makes +# ld automatically choose the correct library version to use for the +# target binary. Use for Linux platforms with Multi-Arch support only! +# +# * Compilation addition: second libMT target added for building the pthread- +# enabled library as a separate library +# +# * Compilation switch change: previous versions compiled using '-nostartfiles' +# This is no longer the case since there is a 'startup' constructor for the library +# which is used to activate the start-at times when specified. This also initializes +# the dynamic disabling of the FAKE_STAT calls. +# +# By default, libfaketime will be compiled for your system's default architecture. +# To build 32-bit libraries and binaries, add -m32 to CFLAGS and LDFLAGS. +# +# Change PREFIX to where you want libfaketime (libraries and wrapper binary) installed. +# LIBDIRNAME is relative to PREFIX. The default is to install into $PREFIX/lib/faketime, +# but you can set LIBDIRNAME to, e.g., /lib64 if you want to install it elsewhere. +# LIBDIRNAME has been introduced to support MultiLib systems. Please do not change the +# default value on MultiArch systems. +# +# For testing in the current directory without installation, try make PREFIX= LIBDIRNAME='.' + +CC ?= gcc +INSTALL ?= install + +PREFIX ?= /usr/local +LIBDIRNAME ?= /lib/faketime +PLATFORM ?=$(shell uname) + +CFLAGS += -std=gnu99 -Wall -Wextra -Werror -Wno-nonnull-compare -DFAKE_PTHREAD -DFAKE_STAT -DFAKE_SLEEP -DFAKE_TIMERS -DFAKE_INTERNAL_CALLS -fPIC -DPREFIX='"'$(PREFIX)'"' -DLIBDIRNAME='"'$(LIBDIRNAME)'"' $(FAKETIME_COMPILE_CFLAGS) +ifeq ($(PLATFORM),SunOS) +CFLAGS += -D__EXTENSIONS__ -D_XOPEN_SOURCE=600 +endif + +LIB_LDFLAGS += -shared + +LDFLAGS += -lpthread +ifneq ($(PLATFORM),SunOS) +LDFLAGS += -Wl,--version-script=libfaketime.map +endif + +LDADD += -ldl -lm -lrt +BIN_LDFLAGS += -lrt + +SRC = libfaketime.c +LIBS_OBJ = libfaketime.o libfaketimeMT.o +BINS = faketime + +SONAME = 1 +LIBS = libfaketime.so.${SONAME} libfaketimeMT.so.${SONAME} + +all: ${LIBS} ${BINS} + +libfaketimeMT.o: EXTRA_FLAGS := -DPTHREAD_SINGLETHREADED_TIME + +${LIBS_OBJ}: libfaketime.c + ${CC} -o $@ -c ${CFLAGS} ${CPPFLAGS} ${EXTRA_FLAGS} $< + +%.so.${SONAME}: %.o libfaketime.map + ${CC} -o $@ -Wl,-soname,$@ ${LDFLAGS} ${LIB_LDFLAGS} $< ${LDADD} + +${BINS}: faketime.c + ${CC} -o $@ ${CFLAGS} ${CPPFLAGS} ${EXTRA_FLAGS} $< ${LDFLAGS} ${BIN_LDFLAGS} + +clean: + @rm -f ${LIBS_OBJ} ${LIBS} ${BINS} + +distclean: clean + @echo + +install: ${LIBS} ${BINS} + @echo + @echo "Copying the faketime libraries to ${DESTDIR}${PREFIX}${LIBDIRNAME} and the faketime wrapper script to ${DESTDIR}${PREFIX}/bin ..." + $(INSTALL) -dm0755 "${DESTDIR}${PREFIX}${LIBDIRNAME}/" + $(INSTALL) -m0644 ${LIBS} "${DESTDIR}${PREFIX}${LIBDIRNAME}/" + $(INSTALL) -Dm0755 faketime "${DESTDIR}${PREFIX}/bin/faketime" + +uninstall: + for f in ${LIBS}; do rm -f "${DESTDIR}${PREFIX}${LIBDIRNAME}/$$f"; done + rmdir "${DESTDIR}${PREFIX}${LIBDIRNAME}" + rm -f "${DESTDIR}${PREFIX}/bin/faketime" + +.PHONY: all clean distclean install uninstall diff --git a/src/Makefile.OSX b/src/Makefile.OSX new file mode 100644 index 0000000..587a8b5 --- /dev/null +++ b/src/Makefile.OSX @@ -0,0 +1,75 @@ +# +# Notes: +# +# * Compilation Defines: +# +# FAKE_STAT +# - Enables time faking also for files' timestamps. +# +# NO_ATFILE +# - Disables support for the fstatat() group of functions +# +# PTHREAD +# - Define this to enable multithreading support. +# +# PTHREAD_SINGLETHREADED_TIME +# - Define this if you want to single-thread time() ... there ARE +# possible caching side-effects in a multithreaded environment +# without this, but the performance impact may require you to +# try it unsynchronized. +# +# FAKE_SLEEP +# - Also intercept sleep(), nanosleep(), usleep(), alarm(), [p]poll() +# +# * Compilation addition: second libMT target added for building the pthread- +# enabled library as a separate library +# +# * Compilation switch change: previous versions compiled using '-nostartfiles' +# This is no longer the case since there is a 'startup' constructor for the library +# which is used to activate the start-at times when specified. This also initializes +# the dynamic disabling of the FAKE_STAT calls. +# +# By default, libfaketime will be compiled for your system's default architecture. +# To build for a different architecture, add -arch flags to CFLAGS and LDFLAGS. +# +# default to clang to support thread local variables +CC ?= clang +INSTALL ?= install + +PREFIX ?= /usr/local + +CFLAGS += -DFAKE_SLEEP -DFAKE_INTERNAL_CALLS -DPREFIX='"'${PREFIX}'"' $(FAKETIME_COMPILE_CFLAGS) +LIB_LDFLAGS += -dynamiclib -current_version 0.9.8 -compatibility_version 0.7 + +SONAME = 1 +LIBS = libfaketime.${SONAME}.dylib +BINS = faketime + +all: ${LIBS} ${BINS} + +libfaketime.${SONAME}.dylib: libfaketime.c + ${CC} -o $@ ${CFLAGS} ${LDFLAGS} ${LIB_LDFLAGS} -install_name ${PREFIX}/lib/faketime/$@ $< + +faketime: faketime.c + ${CC} -o $@ ${CFLAGS} ${LDFLAGS} $< + +clean: + @rm -f ${OBJ} ${LIBS} ${BINS} + +distclean: clean + @echo + +install: ${LIBS} ${BINS} + @echo + @echo "Copying the faketime libraries to ${DESTDIR}${PREFIX}/lib/faketime and the faketime wrapper script to ${DESTDIR}${PREFIX}/bin ..." + $(INSTALL) -dm0755 "${DESTDIR}${PREFIX}/lib/faketime/" + $(INSTALL) -m0644 ${LIBS} "${DESTDIR}${PREFIX}/lib/faketime/" + $(INSTALL) -dm0755 "${DESTDIR}${PREFIX}/bin" + $(INSTALL) -m0755 faketime "${DESTDIR}${PREFIX}/bin/faketime" + +uninstall: + for f in ${LIBS}; do rm -f "${DESTDIR}${PREFIX}/lib/faketime/$$f"; done + rmdir "${DESTDIR}${PREFIX}/lib/faketime" + rm -f "${DESTDIR}${PREFIX}/bin/faketime" + +.PHONY: all clean distclean install uninstall diff --git a/src/Makefile.am b/src/Makefile.am deleted file mode 100644 index 7a2eeaf..0000000 --- a/src/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -ACLOCAL_AMFLAGS=-I m4 -LIBTOOL_DEPS = @LIBTOOL_DEPS@ -LIBOBJDIR = "." -libtool: $(LIBTOOL_DEPS) - $(SHELL) ./config.status libtool - -AM_CFLAGS =-DFAKE_SLEEP -DFAKE_INTERNAL_CALLS - -AM_LDFLAGS = - -if SOLARIS - AM_CFLAGS += -D__EXTENSIONS__ -D_XOPEN_SOURCE=600 - AM_LDFLAGS += -Wl,--version-script=libfaketime.map -endif -if !MACOS - AM_CFLAGS += -std=gnu99 -Wall -Wextra -Werror -DFAKE_STAT -DFAKE_PTHREAD -DFAKE_TIMERS -DFAKE_INTERNAL_CALLS -fPIC -Wno-nonnull-compare -endif - -LTCFLAGS="" - -lib_LTLIBRARIES = libfaketime.la libfaketimeMT.la -libfaketime_la_SOURCES = libfaketime.c -libfaketimeMT_la_SOURCES = libfaketime.c - -bin_PROGRAMS = faketime -faketime_SOURCES = faketime.c - -if MACOS - libfaketime_la_LDFLAGS = -dynamiclib -current_version 0.9.8 -compatibility_version 0.7 -else - libfaketime_la_LIBADD = -ldl -lm -lrt -lpthread - libfaketime_la_LDFLAGS = -shared -Wl,--version-script=libfaketime.map - libfaketimeMT_la_LIBADD = -ldl -lm -lrt -lpthread - libfaketimeMT_la_CFLAGS = -DPTHREAD_SINGLETHREADED_TIME - libfaketimeMT_la_LDFLAGS = -shared -Wl,--version-script=libfaketime.map -DPTHREAD_SINGLETHREADED_TIME - faketime_LDADD = -ldl -lm -lrt -lpthread -endif diff --git a/src/faketime.c b/src/faketime.c index 99d2f9e..452a58f 100644 --- a/src/faketime.c +++ b/src/faketime.c @@ -47,9 +47,8 @@ #include <semaphore.h> #include "faketime_common.h" -#include "config.h" -const char version[] = VERSION; +const char version[] = "0.9.7"; #ifdef __APPLE__ static const char *date_cmd = "gdate"; @@ -296,21 +295,19 @@ int main (int argc, char **argv) { char *ftpl_path; #ifdef __APPLE__ - if (!getenv("DYLD_INSERT_LIBRARIES") && !getenv("DYLD_FORCE_FLAT_NAMESPACE")) { - ftpl_path = LIBPREFIX "/libfaketime." LIBVERSION ".dylib"; - FILE *check; - check = fopen(ftpl_path, "ro"); - if (check == NULL) - { - ftpl_path = PREFIX "/lib/faketime/libfaketime." LIBVERSION ".dylib"; - } - else - { - fclose(check); - } - setenv("DYLD_INSERT_LIBRARIES", ftpl_path, true); - setenv("DYLD_FORCE_FLAT_NAMESPACE", "1", true); + ftpl_path = PREFIX "/libfaketime.1.dylib"; + FILE *check; + check = fopen(ftpl_path, "ro"); + if (check == NULL) + { + ftpl_path = PREFIX "/lib/faketime/libfaketime.1.dylib"; + } + else + { + fclose(check); } + setenv("DYLD_INSERT_LIBRARIES", ftpl_path, true); + setenv("DYLD_FORCE_FLAT_NAMESPACE", "1", true); #else { char *ld_preload_new, *ld_preload = getenv("LD_PRELOAD"); @@ -321,17 +318,17 @@ int main (int argc, char **argv) * on MultiArch platforms, such as Debian, we put a literal $LIB into LD_PRELOAD. */ #ifndef MULTI_ARCH - ftpl_path = LIBPREFIX "/libfaketimeMT.so." LIBVERSION; + ftpl_path = PREFIX LIBDIRNAME "/libfaketimeMT.so.1"; #else - ftpl_path = PREFIX "/$LIB/faketime/libfaketimeMT.so." LIBVERSION; + ftpl_path = PREFIX "/$LIB/faketime/libfaketimeMT.so.1"; #endif } else { #ifndef MULTI_ARCH - ftpl_path = LIBPREFIX "/libfaketime.so." LIBVERSION; + ftpl_path = PREFIX LIBDIRNAME "/libfaketime.so.1"; #else - ftpl_path = PREFIX "/$LIB/faketime/libfaketime.so." LIBVERSION; + ftpl_path = PREFIX "/$LIB/faketime/libfaketime.so.1"; #endif } len = ((ld_preload)?strlen(ld_preload) + 1: 0) + 1 + strlen(ftpl_path); diff --git a/src/faketime_common.h b/src/faketime_common.h index c95f69f..9fda6a7 100644 --- a/src/faketime_common.h +++ b/src/faketime_common.h @@ -58,28 +58,4 @@ struct ft_shared_s #include <mach/mach_port.h> #endif -#ifdef FAKE_SLEEP -#include <time.h> -#include <poll.h> -#include <sys/types.h> -#include <semaphore.h> -/* - * Fake sleep prototypes! - */ -struct pollfd; - -int nanosleep(const struct timespec *req, struct timespec *rem); -int usleep(useconds_t usec); -unsigned int sleep(unsigned int seconds); -unsigned int alarm(unsigned int seconds); -int ppoll(struct pollfd *fds, nfds_t nfds, -const struct timespec *timeout_ts, const sigset_t *sigmask); -int poll(struct pollfd *fds, nfds_t nfds, int timeout); -int select(int nfds, fd_set *readfds, - fd_set *writefds, - fd_set *errorfds, - struct timeval *timeout); -int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); -#endif /* FAKE_SLEEP */ - #endif diff --git a/src/libfaketime.c b/src/libfaketime.c index cd65135..745384d 100644 --- a/src/libfaketime.c +++ b/src/libfaketime.c @@ -44,7 +44,6 @@ #include <netinet/in.h> #include <limits.h> -#include "config.h" #include "uthash.h" #include "time_ops.h" |