110 Commits

Author SHA1 Message Date
Wolfgang Hommel
f8a0ad2496 Merge pull request #244 from sdettmer/dev/sde/faketime_link_flags
Added support for FAKETIME_LINK_FLAGS for #243.
2020-04-08 19:47:46 +02:00
Steffen Dettmer
0e3269efdc Added support for FAKETIME_LINK_FLAGS for #243. 2020-04-08 19:40:31 +02:00
Wolfgang Hommel
04e78e67bf Unskip file parsing on improper initialization #240 2020-03-26 20:07:24 +01:00
Wolfgang Hommel
0e798503a4 Merge pull request #237 from FeepingCreature/fix/use-pthread-mutex-initializer-again
replace global state struct with local state struct holding a pointer to the global mutex variable
2020-03-16 13:45:37 +01:00
Mathis Beer
a7f7a54e1d replace global state struct with local state struct holding a pointer to the global mutex variable
this fixes the `{ 0 }` initializer not compiling on some platforms
fix issue 231
fix issue 235
2020-03-16 07:57:07 +01:00
Wolfgang Hommel
8075c2e250 Merge pull request #234 from FeepingCreature/fix/use-appropriate-mask-function
Fix timing issue with multiple threads
2020-03-12 21:39:17 +01:00
Mathis Beer
a12ca58dfa fix threading issue: don't assign to the global lock state struct until we're safely inside the mutex.
Otherwise, we might be overwriting the global lock state from two different
threads at once.
2020-03-12 06:49:29 +01:00
Mathis Beer
b4dea2ef9b Unlock faketime lock on all return paths from libfaketime.c.
These gymnastics are necessary because pthread_cleanup_push
and pthread_cleanup_pop must match exactly 1:1 and appear at
the same level of indentation.

This is because pthread_cleanup_push/pop are implemented in
such a way that pthread_cleanup_push opens a scope and
pthread_cleanup_pop closes it.

They're macros with unbalanced brackets.
C, ladies and gentlemen.

So instead of returning, we have to set a field indicating our
intent to return and then jump to the unlock site.
2020-03-12 06:45:43 +01:00
Mathis Beer
796b30bebf use pthread_sigmask instead of sigprocmask
pthread_sigmask is the one meant for threaded programs.
2020-03-12 06:43:33 +01:00
Wolfgang Hommel
70d26ec15c Merge pull request #230 from FeepingCreature/fix/block-signals-while-locked
Fix deadlock issues with signals: block all signals while inside mutex.
2020-03-03 19:47:49 +01:00
Mathis Beer
052239d828 Fix deadlock issues with signals: block all signals while inside mutex. 2020-03-03 17:22:52 +01:00
Wolfgang Hommel
fe8c0acee6 Merge pull request #229 from FeepingCreature/fix/dont-allocate-stack-buffers
fake_clock_gettime: avoid placing large buffers on the stack
2020-02-20 21:10:19 +01:00
Mathis Beer
c44a332e0e fake_clock_gettime: avoid placing large buffers on the stack 2020-02-20 12:14:14 +01:00
Wolfgang Hommel
a54f204209 Merge pull request #227 from wolfcw/develop
Refresh the monotonic faketime setting envvar when cache expires.
2020-02-14 19:42:23 +01:00
Wolfgang Hommel
195888434a Merge pull request #225 from tjhowse/develop
Refresh the monotonic faketime setting envar when cache expires.
2020-02-14 19:36:06 +01:00
thowse
f7de52c07b Refresh the monotonic faketime setting envar when cache expires. 2020-02-14 10:36:29 +10:00
Wolfgang Hommel
0efe7b3e3e Merge pull request #220 from aristanemi/mul_overflow_fix
timespec multiplication overflow fix
2019-12-17 18:55:20 +01:00
Abhishek Sunkum Rammurthy
b542e14959 time multiplication overflow fix
In 32 bit platforms, timespecmul2() macro function, overflow occurs during multiplication.
Size of `long` type in 32 bit platform is 4 bytes, but the size of `long` type in 64 bit platform is 8 bytes.
2019-12-17 15:16:38 +01:00
Wolfgang Hommel
78385ba8b7 Use -DFAKE_FILE_TIMESTAMPS to intercept utime[s](), by @speq, #183 2019-12-14 21:49:23 +01:00
Wolfgang Hommel
b3dcef470e fix #ifndef for timermul, @speq, #183 2019-12-14 21:30:31 +01:00
Wolfgang Hommel
90f11685b5 wrap nanosec ops in #ifndef, patch by @paul-j-lucas, #219 2019-12-14 19:49:04 +01:00
Wolfgang Hommel
d7ef17a0de Merge pull request #218 from wolfcw/revert-178-automake-branch
Revert "Automake branch"
2019-11-30 09:37:00 +01:00
Wolfgang Hommel
3123ad7fe2 Revert "Automake branch" 2019-11-30 09:36:46 +01:00
Wolfgang Hommel
af2d2e5111 Merge pull request #178 from manchicken/automake-branch
Automake branch
2019-11-30 09:36:36 +01:00
Wolfgang Hommel
11fbc2ada1 Create make-test.yml 2019-11-30 09:16:43 +01:00
Michael D. Stemle, Jr
f92d919fb0 Merged master in and cleaned up.
We no longer need the OSX-specific test. Tests are passing, too.
2019-11-27 14:32:15 -05:00
Wolfgang Hommel
22f8c3dd36 Work around race conditions when semaphore gets deleted by parent process (#217) 2019-11-20 08:43:24 +01:00
Wolfgang Hommel
a0fe6b56b0 Merge pull request #215 from wolfcw/develop
Merge changes from develop branch
2019-11-14 19:33:00 +01:00
Wolfgang Hommel
fdc3c81ae0 Merge pull request #214 from daowens01/unused_variable_compiler_error
Wrap user_per_tick_inc_set_backup declaration in ifdef
2019-11-14 19:08:44 +01:00
David Owens
10b9818c2c Wrap user_per_tick_inc_set_backup declaration in ifdef
Building without FAKE_STAT defined causes compilation errors due to
unused variable user_per_tick_inc_set_backup.  Move declaration inside
FAKE_STAT section along with the code making use of it.
2019-11-14 09:27:27 -06:00
Wolfgang Hommel
826f8b7792 Detect and bail out of endless recursive calls to clock_gettime() (#130) 2019-09-05 22:52:07 +02:00
Wolfgang Hommel
5d1e6325f2 Add FAKE_SETTIME to CFLAGS to intercept time-setting calls (#179) 2019-09-03 12:01:33 +02:00
Wolfgang Hommel
8ed946cb63 Documentation for packagers, esp. about FORCE_PTHREAD_NONVER and FORCE_MONOTONIC_FIX 2019-08-31 21:32:52 +02:00
Wolfgang Hommel
108370f850 Adds FORCE_PTHREAD_NONVER flag for platforms where pthread functions are not intercepted 2019-08-29 09:55:04 +02:00
Wolfgang Hommel
3de0d02353 Add macOS / OSX build to .travis.yml 2019-08-23 21:20:48 +02:00
Wolfgang Hommel
dc2ae5eef3 Add FORCE_MONOTONIC_FIX to .travis.yml 2019-08-23 19:34:51 +02:00
Wolfgang Hommel
1c05fdd333 Adding a simple .travis.yml file 2019-08-23 19:27:38 +02:00
Wolfgang Hommel
c60390a7e3 Updated documentation regarding compatibility, use on macOS, and contributions 2019-08-23 15:24:13 +02:00
Wolfgang Hommel
ece59abf39 Cleanup old and outdated packaging infos 2019-08-23 14:54:08 +02:00
Wolfgang Hommel
d79ed053d7 Updated documentation regarding shared memory, fixed spelling 2019-08-23 14:46:06 +02:00
Wolfgang Hommel
416c5f4708 Fix shared memory cleanup on local creation 2019-08-23 12:29:33 +02:00
Wolfgang Hommel
a238cfa2b6 Added FAKETIME_COMPILE_CFLAGS to Makefiles 2019-08-23 11:38:35 +02:00
Wolfgang Hommel
ba32d1b01c Added FORCE_MONOTONIC_FIX CFLAG to avoid hangs on timedwait (#202 #142) 2019-08-23 10:29:53 +02:00
Wolfgang Hommel
30ba0b852a Fix Makefile to run 'make src' before running 'make test' (#201) 2019-08-23 10:12:38 +02:00
Wolfgang Hommel
5932e38032 Handle platforms that do not implement semopen() (#203) 2019-08-23 10:08:32 +02:00
Wolfgang Hommel
13748ddb22 Fix building on macOS in preparation of v0.9.8 release 2019-08-22 23:39:36 +02:00
Wolfgang Hommel
5f033fe486 Intercept epoll_wait(), epoll_pwait(), and pselect() (#115) 2019-08-22 23:29:48 +02:00
Wolfgang Hommel
52108dba7a Added FAKETIME_XRESET to smoothen run-time transition between 'x' modifier values (#198) 2019-08-22 00:49:21 +02:00
Wolfgang Hommel
5ddb237842 Adjusted tests on macOS based on compilation defaults 2019-08-21 18:42:05 +02:00
Wolfgang Hommel
314b1298c9 Added support for clock_nanosleep() (#105) 2019-08-21 18:05:17 +02:00
Wolfgang Hommel
7573d20cd4 Further preparations for the upcoming v0.9.8 release 2019-08-21 11:01:24 +02:00
Wolfgang Hommel
0c8905f4ad fix stat faking when FAKETIME 'i' modifier is set (#183) 2019-08-21 10:23:01 +02:00
Wolfgang Hommel
57917c4d5a Added follow-file-timestamp mode via FAKETIME='%' and FAKETIME_FOLLOW_FILE (#156) 2019-08-20 19:43:15 +02:00
Wolfgang Hommel
e85863f671 Added note regarding leap year handling in documentation (#145) 2019-08-20 18:07:17 +02:00
Wolfgang Hommel
d5c0050684 Added environment variable FAKETIME_DONT_RESET to enable old start-at behavior (#163) 2019-08-20 15:43:29 +02:00
Wolfgang Hommel
b855b8a0d3 Updated documentation regarding offset specification on x/i modifiers 2019-08-20 13:08:36 +02:00
Wolfgang Hommel
29efeed247 don't fake time during dlsym() calls in ftpl_init (#130) 2019-08-20 10:49:01 +02:00
Wolfgang Hommel
c13e41024e Improved handling of shm/semaphores w.r.t. stale states (#199) 2019-08-20 09:53:22 +02:00
Wolfgang Hommel
65cdc7b718 Avoid hangs with clock_monotonic for pthread_cond_timedwait 2019-08-19 19:38:01 +02:00
Wolfgang Hommel
d923612c2b Improved cross-platform compatibility defaults 2019-08-19 19:16:07 +02:00
Wolfgang Hommel
59127e7514 More error details on sem_open failures 2019-08-19 14:21:47 +02:00
Wolfgang Hommel
3b494ac6c9 Safety check when creating semaphore locally 2019-08-18 19:06:52 +02:00
Wolfgang Hommel
073d185102 More detailed error messages on shm errors 2019-08-16 15:53:47 +02:00
Wolfgang Hommel
a70db9196a Shared memory cleanup when it was created locally 2019-08-13 19:48:29 +02:00
Wolfgang Hommel
7498c405ed Create shared memory if we don't have it yet (#120) 2019-08-13 19:35:45 +02:00
Wolfgang Hommel
aa091db286 Preparations for 0.9.8 release 2019-08-12 12:25:41 +02:00
Wolfgang Hommel
5e56e9a8fe addressing #190 #196 2019-08-04 18:47:30 +02:00
Wolfgang Hommel
fe42c2b4cf start-at-faketime startup fix, addresses #196 2019-08-04 17:59:33 +02:00
Wolfgang Hommel
579b908580 Merge pull request #194 from qnox/configuration_reload_fix
fixed configuration reload
2019-06-26 19:20:38 +02:00
qnox
2827a69ffe fixed configuration reload 2019-06-26 17:40:37 +02:00
Wolfgang Hommel
949183381f Merge pull request #192 from qnox/fake_pthreads_thread_safety
Fixed thread safety issue in pthread faking methods
2019-06-01 12:28:07 +02:00
qnox
ff48a007a2 fixed thread safety issue in pthread faking methods 2019-05-31 22:46:54 +02:00
Wolfgang Hommel
9846eceb10 Use absolute offset in #190, fix case 1 2019-05-03 16:03:13 +02:00
Wolfgang Hommel
7bc0d5044f Use absolute offset in #190 2019-05-03 15:45:28 +02:00
Wolfgang Hommel
ceac4c7036 Merge pull request #184 from FeepingCreature/fix-inconsistent-envvar
Rename DONT_FAKE_MONOTONIC to FAKETIME_DONT_FAKE_MONOTONIC for consistency
2019-02-05 08:11:21 +01:00
Mathis Beer
5c4fdb5173 Rename DONT_FAKE_MONOTONIC to FAKETIME_DONT_FAKE_MONOTONIC for consistency.
The old variable still works.
2019-02-05 07:45:31 +01:00
Mike Stemle
150a6cb3b2 Added a check for missing libtool. 2018-10-11 10:22:04 -04:00
Michael D. Stemle, Jr
39a85e380c Fixed a _bunch_ of autotools bugs. 2018-10-07 22:38:55 -04:00
Michael D. Stemle, Jr
825043515f Applying fixes for GNU/Linux, and the MT variant of the library. 2018-10-03 22:17:28 -04:00
Michael D. Stemle, Jr
335617c4c7 Fixed a bunch more issues, including prefix-related issues and library version breakage. 2018-10-02 23:22:51 -04:00
Michael D. Stemle, Jr
96668a9c6d Fixing a couple of issues I just found. 2018-10-02 22:20:14 -04:00
Michael D. Stemle, Jr
24fd806e6b Added GNU autotools support. 2018-10-02 22:02:30 -04:00
Michael D. Stemle, Jr
39c6872f6d Removing old makefiles. 2018-10-01 20:08:27 -04:00
Wolfgang Hommel
5c6518c597 Merge pull request #171 from ringlej/fixes
Allow specifying fractions of a second when setting FAKETIME
2018-08-01 19:29:00 +02:00
Jon Ringle
93148b3599 Allow specifying fractions of a second when setting FAKETIME
Signed-off-by: Jon Ringle <jringle@gridpoint.com>
2018-07-31 16:33:57 -04:00
Wolfgang Hommel
9a2c84d68c Merge pull request #161 from tpetazzoni/gcc8-fixes
Gcc8 fixes
2018-05-18 06:20:16 +02:00
Thomas Petazzoni
8e5af129ff faketime.c: fix shared_objs[] array size
shared_objs[] will contain the concatenation of sem_name and shm_name,
which are both 4096 bytes long, and shared_objs[] itself is only 4096
bytes long. This causes a build failure with gcc 8.x:

faketime.c: In function 'main':
faketime.c:289:45: error: '%s' directive output may be truncated writing up to 4095 bytes into a region of size between 0 and 4095 [-Werror=format-truncation=]
     snprintf(shared_objs, PATH_BUFSIZE, "%s %s", sem_name, shm_name);
                                             ^~             ~~~~~~~~
faketime.c:289:5: note: 'snprintf' output between 2 and 8192 bytes into a destination of size 4096
     snprintf(shared_objs, PATH_BUFSIZE, "%s %s", sem_name, shm_name);
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This commit fixes that by enlarging the shared_objs[] array to twice
the of PATH_BUFSIZE, plus one byte for the space.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2018-05-17 23:35:08 +02:00
Thomas Petazzoni
096c11b563 libfaketime.c: fix uninitialized 'result' use
The pthread_cond_timedwait_common() function declares a 'result'
variable, but in some code paths, it may be returned without being
initialized. This commit fixes that by initializing the variable.

Fixes:

libfaketime.c: In function 'pthread_cond_timedwait_common':
libfaketime.c:2534:7: error: 'result' may be used uninitialized in this function [-Werror=maybe-uninitialized]
   int result;
       ^~~~~~

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2018-05-17 23:31:01 +02:00
Thomas Petazzoni
9bfae502d1 libfaketime.c: fix pthread_cleanup_push() build failure
gcc 8.x introduced stricter checking on types, and the trick to cast
pthread_mutex_unlock() into a function acceptable for
pthread_cleanup_push() no longer builds:

libfaketime.c: In function 'fake_clock_gettime':
libfaketime.c:2039:24: error: cast between incompatible function types from 'int (*)(pthread_mutex_t *)' {aka 'int (*)(union <anonymous> *)'} to 'void (*)(void *)' [-Werror=cast-function-type]
   pthread_cleanup_push((void (*)(void *))pthread_mutex_unlock, (void *)&time_mutex);
                        ^

Rather than continuing to hack around, introduce an auxilliary
function with the type expected by pthread_cleanup_push().

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2018-05-17 23:31:01 +02:00
Thomas Petazzoni
0d964363a4 libfaketime.c: fix strncpy() issues raised by gcc 8.x
gcc 8.x introduced stricter checking on strncpy(), and causes the
following build failures:

libfaketime.c: In function 'fake_clock_gettime.part.4':
libfaketime.c:2134:7: error: 'strncpy' specified bound 256 equals destination size [-Werror=stringop-truncation]
       strncpy(user_faked_time, tmp_env, BUFFERLEN);
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
libfaketime.c:2134:7: error: 'strncpy' specified bound 256 equals destination size [-Werror=stringop-truncation]
       strncpy(user_faked_time, tmp_env, BUFFERLEN);
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
libfaketime.c: In function 'ftpl_init':
libfaketime.c:1884:12: error: 'strncpy' specified bound 1024 equals destination size [-Werror=stringop-truncation]
     (void) strncpy(ft_spawn_target, getenv("FAKETIME_SPAWN_TARGET"), 1024);
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
libfaketime.c:1945:5: error: 'strncpy' specified bound 8192 equals destination size [-Werror=stringop-truncation]
     strncpy(user_faked_time_fmt, tmp_env, BUFSIZ);
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
libfaketime.c: In function 'ftpl_init':
libfaketime.c:1884:12: error: 'strncpy' specified bound 1024 equals destination size [-Werror=stringop-truncation]
     (void) strncpy(ft_spawn_target, getenv("FAKETIME_SPAWN_TARGET"), 1024);
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
libfaketime.c:1945:5: error: 'strncpy' specified bound 8192 equals destination size [-Werror=stringop-truncation]
     strncpy(user_faked_time_fmt, tmp_env, BUFSIZ);
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This commit fixes that by making sure we keep one final byte for the
nul terminator, as suggested by
https://github.com/wolfcw/libfaketime/issues/150.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2018-05-17 23:31:01 +02:00
Wolfgang Hommel
8107db7849 Improved parsing error logging 2018-05-03 19:36:47 +02:00
Wolfgang Hommel
c9473def03 Merge pull request #146 from FeepingCreature/feature/wait-ms
Add FAKETIME_WAIT_MS to force pthread_cond_timedwait to wait x ms instead of what its parameters say.
2018-02-20 06:29:18 +01:00
Wolfgang Hommel
baeed314cf Merge pull request #148 from dkg/use-CPPFLAGS
Use CPPFLAGS during compilation
2018-02-20 06:22:38 +01:00
Daniel Kahn Gillmor
90727b7d19 Use CPPFLAGS during compilation
CPPFLAGS is traditionally used to include C preprocessor flags.  While
faketime doesn't apply anything to CPPFLAGS directly, it is good form
to adopt standard settings that might be externally applied.
2018-02-19 14:20:31 -08:00
Wolfgang Hommel
8c22d91057 Merge pull request #147 from dkg/fixalpha
fix gettimeofday() on alpha (see https://bugs.debian.org/890813)
2018-02-19 20:41:23 +01:00
Michael Cree
a5d7f5b1cc fix gettimeofday() on alpha (see https://bugs.debian.org/890813)
In https://bugs.debian.org/890813, Michael Cree <mcree@orcon.net.nz>
reports:

>  The faketime package fails to work correctly on the Alpha
>  architecture. This failure of faketime to work correctly is the
>  reason for the mbedtls FTBFS, which uses faketime in its test
>  suite [1].
>
>  Consider the following test program (which I call "time-test"):
>
>  #include <stdio.h>
>  #include <sys/time.h>
>  #include <unistd.h>
>
>  int main(void)
>  {
>      struct timeval tv;
>
>      for (int j=0; j<5; j++) {
>          usleep(10000);
>          gettimeofday(&tv, NULL);
>          printf("s=%ld    us=%ld\n", tv.tv_sec, tv.tv_usec);
>      }
>      return 0;
>  }
>
>  When run it produces output like:
>
>  s=1519025990    us=838219
>  s=1519025990    us=848965
>  s=1519025990    us=859711
>  s=1519025990    us=870456
>  s=1519025990    us=881202
>
>  But when run as (with faketime built in its source directory):
>
>  LD_PRELOAD=faketime-0.9.7/src/libfaketime.so.1 FAKETIME="-1d" ./time-test
>
>  the output is:
>
>  s=2199023743604    us=0
>  s=2199023657204    us=0
>  s=2199023570804    us=0
>  s=2199023484404    us=0
>  s=2199023398004    us=0
>
>  which is definitely not correct.
>
>  The reason for the incorrect behaviour is that there are two
>  gettimeofday symbols in libc on Alpha and the dlsym() call to link
>  to the gettimeofday() is picking up the function with the wrong ABI.
>  I attach a patch to fix that.  Faketime built with the attached
>  patch works correctly and with a fixed faketime the mbedtls source
>  package builds to completion on Alpha.
2018-02-19 11:30:11 -08:00
Mathis Beer
229ce22fbc Add FAKETIME_WAIT_MS to force pthread_cond_timedwait to wait x ms instead of what its parameters say.
This prevents us from getting stuck in place when the timestamp changes.
2018-02-19 10:26:26 +01:00
Wolfgang Hommel
0487e41c34 Merge pull request #141 from dkg/speling
fix spelling :)
2018-01-16 20:25:11 +01:00
Daniel Kahn Gillmor
b3a2667e9f fix spelling :) 2018-01-16 14:21:36 -05:00
Wolfgang Hommel
6a4d1cc84e Merge pull request #140 from jprjr/musl-compat
Only use dlvsym on glibc systems
2018-01-14 19:55:09 +01:00
John Regan
87d2a67401 Only use dlvsym on glibc systems
This makes libfaketime compatible with musl libc, and likely others.
2018-01-14 12:31:39 -06:00
Wolfgang Hommel
3881dd2ebf Merge pull request #138 from mliertzer/fake_pthread
Implement fix for pthread_cond_timedwait
2018-01-02 12:23:57 +01:00
Matthias Liertzer
fb91c4fcde Implement a fix for pthread_cond_timedwait with faketime
pthread_cond_timedwait takes an absolute time as an argument, which
the function directly passes on to the kernel via the futex
syscall. In an application this absolute time argument is calculated
via the fake times provided by libfaketime. Since the kernel has no
knowledge of the fake time, pthread_cond_timedwait must be redefined
such that it converts the fake time back to real time before passing
it on.
2018-01-02 02:22:59 +01:00
Matthias Liertzer
ab7a2302f2 Rename compat library enumeration 2018-01-02 01:42:41 +01:00
Matthias Liertzer
d117ad79a2 Fix spelling of positive 2018-01-02 01:42:41 +01:00
Matthias Liertzer
5235f6f417 Make sure that DONT_FAKE_MONOTONIC=1 affects all monotonic clocks 2018-01-02 01:40:10 +01:00
Matthias Liertzer
3376334dfc Hide ftpl_init and ft_cleanup from exported functions 2018-01-02 00:16:23 +01:00
Wolfgang Hommel
bb635e4367 Treat unknown clock_ids like CLOCK_REALTIME (experimental) 2017-11-30 20:28:06 +01:00
Wolfgang Hommel
a79f5330f4 Fix #114 as suggested by @niraizik 2017-11-17 20:27:58 +01:00
Wolfgang Hommel
0dee4f88e0 Updated OSX packaging info for v0.9.7 2017-11-14 20:37:55 +01:00
40 changed files with 2897 additions and 621 deletions

23
.github/workflows/make-test.yml vendored Normal file
View File

@@ -0,0 +1,23 @@
name: Run make test
on:
push:
branches:
- master
- develop
schedule:
- cron: '30 9 * * *'
jobs:
build:
strategy:
matrix:
os: [ubuntu-latest, macOS-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v1
- name: make
run: make
- name: make test
run: make test

13
.travis.yml Normal file
View File

@@ -0,0 +1,13 @@
language: c
matrix:
include:
- os: linux
compiler: gcc
- os: osx
osx_image: xcode11
script:
- cd ${TRAVIS_BUILD_DIR}
- FAKETIME_COMPILE_CFLAGS="-DFORCE_MONOTONIC_FIX" make
- make test

View File

@@ -7,6 +7,7 @@ all:
$(MAKE) $(SELECTOR) -C src all
test:
$(MAKE) $(SELECTOR) -C src all
$(MAKE) $(SELECTOR) -C test all
install:

40
NEWS
View File

@@ -1,3 +1,43 @@
- Additional link-time LDFLAGS can be passed via the
environment variable FAKETIME_LINK_FLAGS when
running 'make'.
Since 0.9.8:
- Compile-time CFLAG FAKE_SETTIME can be enabled to
intercept calls to clock_settime(), settimeofday(), and
adjtime(). (suggested and prototyped by @ojura)
- Additional compile-time CFLAGs can be passed via the
environment variable FAKETIME_COMPILE_CFLAGS when
running 'make'.
- src/Makefile CFLAG FORCE_PTHREAD_NONVER should be set on
systems that hang on CLOCK_REALTIME, or that hang on
CLOCK_MONOTONIC where FORCE_MONOTONIC_FIX is not sufficient.
Since 0.9.7:
- Passthrough for unknown clock ids to avoid error messages
- Fixes for multithreaded operations (mliertzer, qnox)
- glibc-related fixes (jprjr) and gcc8 support (tpetazzoni)
- Improved error message output on parsing errors
- fix file stat() faking when 'i' modifier is used for determinism
- Use FAKETIME="%" to take FAKETIME setting from a file as
specified in FAKETIME_FOLLOW_FILE
- Added FAKETIME_DONT_RESET environment variable to avoid
faketime resets when subprocesses are started (similar to
the old v0.9.6 behavior)
- Added FAKETIME_XRESET to avoid large clock jumps when
the 'x' modifier is used and changed during run-time
- Do not fake time during libfaketime initialization to
improve compatibility with memory allocation libraries that
use time-related functions themselves
- Fixes for shared memory related issues, especially when
not using the faketime wrapper
- Updated glibc compatibility settings for various platforms
- Support for clock_nanosleep() with realtime and monotonic clocks
- Support for epoll_wait(), epoll_pwait(), and pselect()
- src/Makefile CFLAG FORCE_MONOTONIC_FIX should be set (only) on
platforms where the test program hangs forever at the
CLOCK_MONOTONIC test.
Since 0.9.6:
- Julien Gilli added an option to disable monotonic time faking
- Azat Khuzhin added support for COARSE clocks

150
README
View File

@@ -1,5 +1,5 @@
libfaketime, version 0.9.7 (November 2017)
==========================================
libfaketime, version 0.9.8 (August 2019)
========================================
Content of this file:
@@ -71,18 +71,37 @@ documentation whether it can be achieved by using libfaketime directly.
rebuilding libfaketimeMT.so.1
* Java-/JVM-based applications work but you need to pass in an extra argument
(DONT_FAKE_MONOTONIC). See usage basics below for details. Without this
argument the java command usually hangs.
(FAKETIME_DONT_FAKE_MONOTONIC). See usage basics below for details. Without
this argument the java command usually hangs.
* libfaketime will eventually be bypassed by applications that dynamically load
system libraries, such as librt, explicitly themselves instead of relying on
the linker to do so at application start time. libfaketime will not work with
those applications unless you can modify them.
This apparently happens a lot in complex run-time environments, e.g., for
programs written in golang, for some Java Virtual Machine implementations,
etc. Since libfaketime is effectively bypassed in such situations, there's
nothing we can do about it. Please consider asking the appropriate developers
and vendors to implement their runtime environment in a way that supports
intercepting selected system calls through LD_PRELOAD.
* Applications can explicitly be designed to prevent libfaketime from working,
e.g., by checking whether certain environment variables are set or whether
libfaketime-specific files are present.
* CLOCK_MONOTONIC test: Running "make test" performs a series of tests after
successful compilation of the libfaketime library. On some platforms, the
"CLOCK_MONOTONIC test" will apparently hang forever. If and only if this
happens on your platform, add the CFLAG -DFORCE_MONOTONIC_FIX to
src/Makefile and recompile libfaketime. Do not set FORCE_MONOTONIC_FIX on
platforms where the test does not hang.
If you observe hangs on the CLOCK_REALTIME test, add the CFLAG
-DFORCE_PTHREAD_NONVER. Also set this FORCE_PTHREAD_NONVER flag in case
FORCE_MONOTONIC_FIX alone does not solve the hang on the MONOTONIC_CLOCK
test.
3. Installation
---------------
@@ -141,7 +160,7 @@ user@host> LD_PRELOAD=/usr/local/lib/libfaketime.so.1 FAKETIME="-15d" date
Mon Nov 8 12:01:12 CEST 2016
user@host> LD_PRELOAD=/usr/local/lib/libfaketime.so.1 FAKETIME="-15d"
DONT_FAKE_MONOTONIC=1 java -version
FAKETIME_DONT_FAKE_MONOTONIC=1 java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
@@ -205,6 +224,22 @@ specified absolute time. The 'start at' format allows a 'relative' clock
operation as described below in section 4d), but using a 'start at' time
instead of an offset time.
If the started process itself starts other (child) processes, they by default
will start with the specified start-at-date again. If this is not what you need,
set the environment variable FAKETIME_DONT_RESET=1. Try these examples to see
the difference:
LD_PRELOAD=src/libfaketime.so.1 FAKETIME="@2000-01-01 11:12:13" \
FAKETIME_DONT_RESET=1 \
/bin/bash -c 'while [ $SECONDS -lt 5 ]; do date; sleep 1; done'
LD_PRELOAD=src/libfaketime.so.1 FAKETIME="@2000-01-01 11:12:13" \
/bin/bash -c 'while [ $SECONDS -lt 5 ]; do date; sleep 1; done'
In the second example, the "date" command will always print the same time,
while in the first example, with FAKETIME_DONT_RESET set, time will increment
even though all the "date" commands are new processes.
4d) Using offsets for relative dates
------------------------------------
@@ -224,6 +259,11 @@ optionally followed by a multiplier:
export FAKETIME="-10m" sets the faked time 10 minutes behind the real time.
export FAKETIME="+14d" sets the faked time to 14 days in the future.
Please note that if you need other multipliers (weeks, months etc.) or higher
precision (e.g., correct leap year handling), you should use either the
faketime wrapper or the GNU date command as shown in the first of the three
examples below.
You now should understand the complete example we've used before:
LD_PRELOAD=/usr/local/lib/libfaketime.so.1 FAKETIME="-15d" date
@@ -281,6 +321,11 @@ completely independently of the system clock. It helps running programs
with some determinism. In this single case all spawned processes will use
the same global clock without restarting it at the start of each process.
Please note that using "x" or "i" in FAKETIME still requires giving an offset
(see section 4d). This means that "+1y x2" will work, but "x2" only will not.
If you do not want to fake the time, but just modify clock speed, use something
like "+0 x2", i.e., use an explizit zero offset as a prefix in your FAKETIME.
For testing, your should run a command like
LD_PRELOAD=./libfaketime.so.1 FAKETIME="+1,5y x10,0" \
@@ -326,6 +371,101 @@ with FAKETIME_NO_CACHE=1. Remember that disabling the cache may negatively
influence the performance.
Setting FAKETIME by means of a file timestamp
---------------------------------------------
Based on a proposal by Hitoshi Harada (umitanuki), the "start at" time can now be
set through any file in the file system by setting the FAKETIME environment variable
to "%" (a percent sign) and FAKETIME_FOLLOW_FILE to the name of the file whose
modification timestamp shall be used as source for the "start at" time.
Usage example:
# create any file with December 24th, 2009, 12:34:56 as timestamp
touch -t 0912241234.56 /tmp/my-demo-file.tmp
# run a bash shell with an endless loop printing the current time
LD_PRELOAD=/path/to/libfaketime.so.1 \
FAKETIME='%' FAKETIME_FOLLOW_FILE=/tmp/my-demo-file.tmp \
FAKETIME_DONT_RESET=1 \
bash -c 'while true ; do date ; sleep 1 ; done'
# now, while the above is running, change the file's timestamp
# (in a different terminal window or whatever)
touch -t 2002290123.45 /tmp/my-demo-file.tmp
Changing the 'x' modifier during run-time
-----------------------------------------
Using FAKETIME_TIMESTAMP_FILE allows for easily changing the FAKETIME setting
while a program is running:
echo "+0 x1" > /tmp/my-faketime.rc
LD_PRELOAD=libfaketime.so.1 FAKETIME_TIMESTAMP_FILE="/tmp/my-faketime.rc" \
FAKETIME_NO_CACHE=1 ./some-program &
sleep 10 ; echo "+0 x10" > /tmp/my-faketime.rc
Changing the speed of the wall clock time, i.e., using a different 'x' modifier
during run-time, by default can lead to greater jumps that may confuse the
program. For example, if the program has been running for 10 seconds on 'x1',
and then the setting is changed to 'x10', the faked time will look to the
program as if it has been running for more than 100 instead of just more than
10 seconds.
By setting the environment variable FAKETIME_XRESET to any value, transitions
between different 'x' modifier values will be significantly smoothed:
LD_PRELOAD=libfaketime.so.1 FAKETIME_TIMESTAMP_FILE="/tmp/my-faketime.rc" \
FAKETIME_NO_CACHE=1 FAKETIME_XRESET=1 ./some-program &
Setting FAKETIME_XRESET ensures that wall clock time begins to run faster
only after the 'x' modifier has been changed (when increasing it) and also
ensures that the reported faked time does not jump back to past values
(when decreasing it).
Please note that FAKETIME_XRESET internally works by resetting libfaketime's
internal time-keeping data structures, which may have side effects on reported
file timestamps. Using FAKETIME_XRESET should be considered experimental at
the moment.
Cleaning up shared memory
-------------------------
libfaketime uses semaphores and shared memory on platforms that support it in
order to sync faketime settings across parent-child processes. It will clean
up when it exits properly. However, when processes are terminated (e.g., by
Ctrl-C on command line), shared memory cannot be cleaned up properly. In such
cases, you should occasionally delete
/dev/shm/faketime_shm_* and
/dev/shm/sem.faketime_sem_*
manually (or properly automated). Leftover files there from processes that
already have been terminated are not a problem in general, but result in a
libfaketime error the next time a process is started with a process id for
which such a stale semaphore/shared memory exists. Thus, if you run across
the following error message
libfaketime: In ft_shm_create(), shm_open failed: File exists
please cleanup /dev/shm as described above. This is especially relevant
for long-running systems (servers with high uptime) and systems on which
a lot of processes are started (e.g., servers handling many containers
or similar virtualization mechanisms).
Intercepting time-setting calls
-------------------------------
libfaketime can be compiled with the CFLAG "-DFAKE_SETTIME" in order
to also intercept time-setting functions, i.e., clock_settime(),
settimeofday(), and adjtime(). Instead of passing the timestamp a
program sets through to the system, only the FAKETIME environment
variable will be adjusted accordingly.
4f) Faking the date and time system-wide
----------------------------------------

View File

@@ -4,17 +4,15 @@ README file for libfaketime on macOS
Support for macOS has meanwhile matured and many command line and
GUI applications will run stable.
Developments and tests are done on High Sierra currently.
Use libfaketime 0.9.6 or earlier on OS X (i.e., before Sierra).
Developments and tests are done on Mojave currently.
Version 0.9.5 and higher no longer works with OSX <= 10.6 due to
Version 0.9.5 and higher no longer work with OSX <= 10.6 due to
changes in the underlying system libraries. If you need libfaketime
on OSX <= 10.6, please use libfaketime version 0.9.
Installing and using libfaketime on OS X is slightly different than
Installing and using libfaketime on macOS is slightly different than
on Linux. Please make sure to read the README file for general
setup and usage, and refer to this file only about OS X specifics.
setup and usage, and refer to this file only about macOS specifics.
1) Installing libfaketime on macOS
@@ -33,6 +31,10 @@ Or, if you use Homebrew, install using:
brew install libfaketime
Please inform the respective package maintainers if the latest release
is not yet available this way. With homebrew, you can typically use
"brew install --HEAD" to install from the latest source automatically.
Otherwise, you have to compile and install libfaketime manually; this
will require a working installation of Xcode and its command line tools
on your machine.
@@ -55,7 +57,7 @@ output is correct:
---------------------------------------------------
You will need to set three environment variables. In a Terminal.app
or iTerm2 session, the following commands can be used:
or any other CLI session, the following commands can be used:
export DYLD_FORCE_FLAT_NAMESPACE=1
export DYLD_INSERT_LIBRARIES=/path/to/libfaketime.1.dylib
@@ -76,7 +78,7 @@ for help and use "man faketime" for details.
--------------------------------------------
Given the limited number of system calls libfaketime intercepts,
it may not work too well with specific GUI applications on OS X.
it may not work too well with specific GUI applications on macOS.
This can result in crashes after a seemingly random time, or an
application will not or at least not always see the faked time,
and so on.
@@ -127,13 +129,20 @@ time-related system calls that need to be intercepted on macOS.
https://github.com/wolfcw/libfaketime/issues
Important: When reporting non-working applications, please make
sure that your issue is not related to SIP (system integrity
protection). For example, on a SIP-enabled, default macOS installation,
libfaketime will not work for programs like /bin/bash because
the path /bin is SIP-protected. Copy your application to a
non-SIP-protected path, and if libfaketime still does not work,
feel free to report it.
However, there are two important aspects:
- When reporting non-working applications, please make sure that your issue is
not related to SIP (system integrity protection). For example, on a
SIP-enabled, default macOS installation, libfaketime will not work for
programs like /bin/bash because the path /bin is SIP-protected. Copy your
application to a non-SIP-protected path, and if libfaketime still does not
work, feel free to report it.
- We cannot and will not help with using libfaketime for proprietary or
commercial software unless you are its developer trying to integrate
libfaketime. Please contact the developers or the vendor directly if
you have problems using libfaketime with non-free / not open sourced
macOS applications.
4) Notes for developers of macOS applications
@@ -141,4 +150,5 @@ feel free to report it.
The environment variable FAKETIME can be changed at application run-time
and always takes precedence over other user-controlled settings. It can
be re-set to 0 (zero) to work around potential incompatibilities.
be re-set to 0 (zero) to work around potential incompatibilities or if
you do not want libfaketime applied to your software.

View File

@@ -4,20 +4,27 @@ This file contains information for libfaketime developers and contributors.
GENERAL
=======
Starting with libfaketime v0.9.5, development and issue handling is
completely done via Github:
Starting with libfaketime v0.9.5, development and issue handling is
completely done via Github:
https://github.com/wolfcw/libfaketime
- Official releases are tagged.
- Code contributions and bugfixes are merged into the "development" branch,
which is considered unstable and may contain code that is not yet fully
tested.
- Official releases are tagged.
- Code contributions and bugfixes should be submitted to and then merged into
the "development" branch, which is considered unstable and may contain code
that is not yet fully tested.
- The "master" branch is updated with tested code only; it is ensured that
it compiles and works cleanly at least on current Linux and OS X systems.
it compiles and works cleanly at least on current Linux and macOS systems.
Code contributions are highly welcome, preferably via pull requests on Github.
Please have a look at issues labelled as "help wanted" in the Github issue
tracker. If you are interested in contributing to libfaketime, helping with
these issues is not only much appreciated, but also a good way to familiarize
yourself with the overall codebase.
CODE STYLE
==========
@@ -43,16 +50,16 @@ void do_nothing(int how_often)
}
}
- Use -DDEBUG and #ifdef DEBUG for development and testing. Avoid printing
to stdout or stderr outside "#ifdef DEBUG"; if it is necessary to inform
the user a run-time, prefix your output with "faketime" or make otherwise
sure that the user knows where the message is coming from.
- Use -DDEBUG and #ifdef DEBUG for development and testing. Avoid printing to
stdout or stderr outside "#ifdef DEBUG"; if it is necessary to inform the
user a run-time, prefix your output with "libfaketime" or make otherwise sure
that the user knows where the message is coming from.
- If you add new functions to libfaketime.c, try placing them somewhere
where they fit will: Usually, functions are grouped by functionality
(e.g., all functions related to faking file timestamps). If that's not
possible, group them by contributor, or document your placement strategy
in the commit message.
in the commit message.
DEVELOPMENT, BUILDING, AND TESTING
@@ -62,19 +69,19 @@ DEVELOPMENT, BUILDING, AND TESTING
the modification fixes bugs :-)).
- Add tests for new features. Extend test/timetest.c appropriately and
try to use the functional testing framework wherever possible.
try to use the functional testing framework wherever possible.
- Compiler and linker warnings are treated as errors and not acceptable.
- If you cannot test the code on both Linux and OS X yourself, please
let us know and consider wrapping your code in #ifdef / #ifndef __APPLE__
statements.
- If you cannot test the code on both Linux and macOS yourself, please
let us know and consider wrapping your code in #ifdef / #ifndef __APPLE__
statements.
DOCUMENTATION
=============
For anything more than small bugfixes, please update the user documentation
For anything more than small bugfixes, please update the user documentation
and credits appropriately:
- The NEWS file should mention the change and your credits.
@@ -83,8 +90,8 @@ and credits appropriately:
- The manpage man/faketime.1 should be updated when the wrapper application
is modified.
For credits, please either mention your real name, your Github username, or
your email address.
For credits, please either mention your real name, your Github username, or
your email address.
In your own interest, please be verbose on user documentation and comments
in the source code. Users will not know about new features unless they are
@@ -97,7 +104,7 @@ RELEASES
Official new releases are created whenever a significant amount of changes
(bugfixes or new functionality) has piled up; on average, there is one new
official release per year. Users who need to stick to the bleeding edge
official release per 1-2 years. Users who need to stick to the bleeding edge
are supposed to use the current state of the "master" branch at any time.
libfaketime maintainers for several Linux distributions are informed about

63
README.packagers Normal file
View File

@@ -0,0 +1,63 @@
README for packagers of libfaketime
First, thank you for your efforts to make libfaketime packages available
on your platform / distribution!
libfaketime has tagged releases about once every 1-2 years, made available
through github.com/wolfcw/libfaketime, but usually it is also safe (i.e.,
stable) to use the latest HEAD of the master branch, which contains bug
fixes since the last tagged release.
You may want to familiarize yourself with the options you can set into
src/Makefile, but sane defaults for stable operations have been chosen.
Currently, libfaketime does not use autotools yet, so there is
_no_ ./configure step, but "make" and "make test" will work as expected.
However, one problem makes it somewhat difficult to get libfaketime
working on different platforms:
libfaketime currently has the challenge that depending on the version
of glibc and the platform (e.g., x86_64 or aarch64) certain compiler
CFLAGS have to be set manually, as we have not yet found a way to
safely determine behavior at run-time automatically.
Please proceed as follows:
- run "make test". If everything runs through smoothly and you do not
encounter any hangs or test failure reports, use the binaries as
they are.
- If you encounter endless hangs during the CLOCK_REALTIME test,
add -DFORCE_PTHREAD_NONVER to the CFLAGS.
- If you encounter endless hangs during the CLOCK_MONOTONIC test,
add -DFORCE_MONOTONIC_FIX to the CFLAGS. If it works with that,
it's fine, otherwise additionally use -DFORCE_PTHREAD_NONVER.
CFLAGS can also be passed through the FAKETIME_COMPILE_CFLAGS environment
variable, so for example
FAKETIME_COMPILE_CFLAGS="-DFORCE_PTHREAD_NONVER" make test
would create the libfaketime binaries and run the tests with the
FORCE_PTHREAD_NONVER flag set in a single step. Likewise there is
FAKETIME_LINK_FLAGS.
Please do not use FORCE_MONOTONIC_FIX by default, as it would result
in incorrect operations on platforms that do not need it.
Our observations with a limited number of Linux distributions is that
libfaketime may require different compile flags per platform even
if the same distribution and glibc version is used across these
platforms.
As soon as we have found a reliable way to automatically choose the
correct compile-time flags, we will remove this burden from you as
packager for obvious reasons. Until then, please feel free to report
your experiences with different platforms and distribution versions
through the issue tracker on Github.
Again, thanks for your time and effort to make libfaketime available
easily for everyone else!

20
TODO
View File

@@ -1,9 +1,15 @@
Open issues / next steps for libfaketime development
Open issues / next steps for libfaketime development:
Please see the issue tracker on Github - https://github.com/wolfcw/libfaketime
- New features, such as additional system calls to intercept, are labelled
"feature request" when they are considered for implementation
- Issues labelled "help wanted" should be your starting point if you are
interested in contributing to libfaketime
Besides the open issues, two major changes are planned for the next release:
- integrate manchicken's autoconf/automake support to get rid of separate Makefile.OSX
- add more functional tests that check more than the basic functionality
- use the testing framework to also implement unit tests
- fake timer_create and friends
- work around thread local storage issue, e.g., by using pthreads
- add autoconf/automake support to get rid of separate Makefile.OSX
- improve pthread support

View File

@@ -1,4 +1,4 @@
.TH FAKETIME "1" "November 2017" "faketime 0.9.7" wolfcw
.TH FAKETIME "1" "August 2019" "faketime 0.9.8" wolfcw
.SH NAME
faketime \- manipulate the system time for a given command
.SH SYNOPSIS

View File

@@ -1,25 +0,0 @@
# Maintainer: Robert Orzanna <orschiro@gmail.com>
_pkgbasename=libfaketime
pkgname=lib32-$_pkgbasename
pkgver=0.9.5
pkgrel=1
pkgdesc='Report fake dates and times to programs without having to change the system-wide time.'
arch=('x86_64')
url='http://www.code-wizards.com/projects/libfaketime/'
license=('GPL2')
source=("http://www.code-wizards.com/projects/${_pkgbasename}/${_pkgbasename}-${pkgver}.tar.gz"
'lib32.patch')
md5sums=('89b5c71e6c6a93b1c6feba374ac37719'
'0a01f842df4c8acbd2b081be046e8d67')
build() {
cd "${_pkgbasename}-${pkgver}"
patch -p1 -i ../lib32.patch
make
}
package() {
cd "${_pkgbasename}-${pkgver}"
make PREFIX=/usr DESTDIR="${pkgdir}" install
}

View File

@@ -1,30 +0,0 @@
Author: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
On i386 systems, for some reason if i do not clean up this extra -lrt, i get the following error:
[...]
make[1]: Entering directory `/home/dkg/src/faketime/faketime/src'
cc -o libfaketime.o -c -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -std=gnu99 -Wall -Wextra -Werror -DFAKE_STAT -DFAKE_SLEEP -DFAKE_TIMERS -DFAKE_INTERNAL_CALLS -fPIC -DPREFIX='"'/usr/local'"' -DLIBDIRNAME='"'/lib/faketime'"' -DMULTI_ARCH libfaketime.c
cc -o libfaketime.so.1 -Wl,-soname,libfaketime.so.1 -Wl,-z,relro -Wl,--version-script=libfaketime.map -lrt -shared libfaketime.o -ldl -lm -lpthread -lrt
libfaketime.o: In function `ft_cleanup':
/home/dkg/src/faketime/faketime/src/libfaketime.c:1277: multiple definition of `timer_gettime'
/home/dkg/src/faketime/faketime/src/libfaketime.c:1277: multiple definition of `timer_settime'
collect2: error: ld returned 1 exit status
make[1]: *** [libfaketime.so.1] Error 1
[...]
I confess i don't really understand why removing this would fix
things, but i also don't see the need to have multiple attempts to
link to librt.
--- a/src/Makefile
+++ b/src/Makefile
@@ -69,7 +69,7 @@
CFLAGS += -std=gnu99 -Wall -Wextra -Werror -DFAKE_STAT -DFAKE_SLEEP -DFAKE_TIMERS -DFAKE_INTERNAL_CALLS -fPIC -DPREFIX='"'$(PREFIX)'"' -DLIBDIRNAME='"'$(LIBDIRNAME)'"'
LIB_LDFLAGS += -shared
-LDFLAGS += -Wl,--version-script=libfaketime.map -lrt
+LDFLAGS += -Wl,--version-script=libfaketime.map
LDADD += -ldl -lm -lpthread -lrt
SRC = libfaketime.c

View File

@@ -1,40 +0,0 @@
Source: faketime
Section: utils
Priority: extra
Maintainer: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
Build-Depends:
debhelper (>= 9),
dh-exec (>= 0.3)
Standards-Version: 3.9.4
Homepage: http://www.code-wizards.com/projects/libfaketime/
Vcs-Browser: http://anonscm.debian.org/gitweb/?p=collab-maint/faketime.git
Vcs-Git: git://anonscm.debian.org/collab-maint/faketime.git
Package: faketime
Architecture: any
Pre-Depends: multiarch-support
Depends: ${shlibs:Depends}, ${misc:Depends}, libfaketime (= ${binary:Version})
Multi-Arch: foreign
Description: report faked system time to programs
The Fake Time Preload Library (FTPL, a.k.a. libfaketime) intercepts
various system calls which programs use to retrieve the current date
and time. It can then report faked dates and times (as specified by
you, the user) to these programs. This means you can modify the
system time a program sees without having to change the time
system-wide. FTPL allows you to specify both absolute dates (e.g.,
2004-01-01) and relative dates (e.g., 10 days ago).
Package: libfaketime
Architecture: any
Pre-Depends: multiarch-support
Multi-Arch: same
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: report faked system time to programs
The Fake Time Preload Library (FTPL, a.k.a. libfaketime) intercepts
various system calls which programs use to retrieve the current date
and time. It can then report faked dates and times (as specified by
you, the user) to these programs. This means you can modify the
system time a program sees without having to change the time
system-wide. FTPL allows you to specify both absolute dates (e.g.,
2004-01-01) and relative dates (e.g., 10 days ago).

View File

@@ -1,29 +0,0 @@
From: Gerardo Malazdrewicz <gerardo@malazdrewicz.com.ar>
To: 699559@bugs.debian.org
Subject: Avoiding loop (very dirty patch)
Date: Tue, 26 Mar 2013 01:18:05 +0100
[Message part 1 (text/plain, inline)]
Attached patch works for me, but it is very very dirty.
Possibly side effects.
Alternative seems to be to protect the call to real_clock_gettime so it is
executed just once (to validate the parameters). Subsequent calls are not
needed (parameters have been validated).
Thanks,
Gerardo
--- a/src/libfaketime.c
+++ b/src/libfaketime.c
@@ -1380,7 +1380,7 @@ void __attribute__ ((constructor)) ftpl_init(void)
real_clock_get_time = dlsym(RTLD_NEXT, "clock_get_time");
real_clock_gettime = apple_clock_gettime;
#else
- real_clock_gettime = dlsym(RTLD_NEXT, "clock_gettime");
+ real_clock_gettime = dlsym(RTLD_NEXT, "__clock_gettime");
#ifdef FAKE_TIMERS
real_timer_settime_22 = dlvsym(RTLD_NEXT, "timer_settime","GLIBC_2.2");
real_timer_settime_233 = dlvsym(RTLD_NEXT, "timer_settime","GLIBC_2.3.3");

View File

@@ -1,3 +0,0 @@
#!/usr/bin/dh-exec
src/libfaketime.so.1 usr/lib/${DEB_HOST_MULTIARCH}/faketime/
src/libfaketimeMT.so.1 usr/lib/${DEB_HOST_MULTIARCH}/faketime/

View File

@@ -1,17 +0,0 @@
#!/usr/bin/make -f
# Author: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
# Date: Tue, 26 Aug 2008 14:24:50 -0400
export DEB_CFLAGS_MAINT_APPEND=-DMULTI_ARCH
# make sure dh_makeshlibs does not modify post{inst,rm} scripts:
# (avoids lintian's postinst-has-useless-call-to-ldconfig)
override_dh_makeshlibs:
dh_makeshlibs --noscripts
override_dh_installchangelogs:
dh_installchangelogs NEWS
%:
PREFIX=/usr dh $@

View File

@@ -1,13 +0,0 @@
diff --git a/src/libfaketime.c b/src/libfaketime.c
index 3ec372b..f70283b 100644
--- a/src/libfaketime.c
+++ b/src/libfaketime.c
@@ -1380,7 +1380,7 @@ void __attribute__ ((constructor)) ftpl_init(void)
real_clock_get_time = dlsym(RTLD_NEXT, "clock_get_time");
real_clock_gettime = apple_clock_gettime;
#else
- real_clock_gettime = dlsym(RTLD_NEXT, "clock_gettime");
+ real_clock_gettime = dlsym(RTLD_NEXT, "__clock_gettime");
#ifdef FAKE_TIMERS
real_timer_settime_22 = dlvsym(RTLD_NEXT, "timer_settime","GLIBC_2.2");
real_timer_settime_233 = dlvsym(RTLD_NEXT, "timer_settime","GLIBC_2.3.3");

View File

@@ -1,55 +0,0 @@
Summary: Manipulate system time per process for testing purposes
Name: libfaketime
Version: 0.9.5
Release: 4%{?dist}
License: GPLv2+
Url: http://www.code-wizards.com/projects/%{name}/
Source: http://www.code-wizards.com/projects/%{name}/%{name}-%{version}.tar.gz
Group: System Environment/Libraries
Patch1: libfaketime-0.9.5-fix-infinite-recursion-on-real_clock_gettime.patch
%description
libfaketime intercepts various system calls which programs use to
retrieve the current date and time. It can then report faked dates and
times (as specified by you, the user) to these programs. This means you
can modify the system time a program sees without having to change the
time system- wide.
%prep
%setup -q
%patch1 -p1
# work around from upstream for autodetecting glibc version bug on i686
sed -i -e 's/__asm__(".symver timer_gettime_22/\/\/__asm__(".symver timer_gettime_22/' src/libfaketime.c
sed -i -e 's/__asm__(".symver timer_settime_22/\/\/__asm__(".symver timer_settime_22/' src/libfaketime.c
%build
cd src ; CFLAGS="$RPM_OPT_FLAGS -Wno-strict-aliasing" make %{?_smp_mflags} \
PREFIX="%{_prefix}" LIBDIRNAME="/%{_lib}/faketime" all
%check
make %{?_smp_mflags} -C test all
%install
make PREFIX="%{_prefix}" DESTDIR=%{buildroot} LIBDIRNAME="/%{_lib}/faketime" install
rm -r %{buildroot}/%{_docdir}/faketime
%files
%{_bindir}/faketime
%{_libdir}/faketime/libfaketime*so.*
%doc README COPYING NEWS README README.developers
%{_mandir}/man1/*
%changelog
* Tue Oct 15 2013 Paul Wouters <pwouters@redhat.com> - 0.9.5-4
- Infinite recursion patch is still needed, make test causes
segfaults otherwise.
* Mon Oct 14 2013 Paul Wouters <pwouters@redhat.com> - 0.9.5-3
- Work around from upstream for autodetecting glibc version bug on i686
* Mon Oct 14 2013 Paul Wouters <pwouters@redhat.com> - 0.9.5-2
- Remove use of ifarch for _lib macro for multilib
* Sun Oct 13 2013 Paul Wouters <pwouters@redhat.com> - 0.9.5-1
- Initial package

View File

@@ -1,53 +0,0 @@
Package: libfaketime
Version: 0.9.7
Revision: 1
Source: http://www.code-wizards.com/projects/%n/%n-%v.tar.gz
Source-MD5: PLACEHOLDER
Maintainer: Wolfgang Hommel <wolf@fink.code-wizards.com>
HomePage: https://github.com/wolfcw/libfaketime
License: GPL
Description: Modify system time for single applications
DescDetail: <<
libfaketime is a library that is dynamically linked to applications
or system commands at run-time by using the DYLD_INSERT_LIBRARIES
mechanism. It then intercepts various system calls, which programs
use to retrieve the current date and time. libfaketime can then
report faked dates and times to these programs. This means you can
modify the system time a program uses without having to change the
date and time system-wide.
<<
DescUsage: <<
libfaketime includes a simple wrapper called faketime. Run the
command faketime without any parameters for usage information.
For information on how to use libfaketime without the wrapper
and access its full raw functionality, please see
%p/share/doc/libfaketime/README*
<<
BuildDepends: fink (>= 0.28)
Distribution: 10.7, 10.8, 10.9, 10.10, 10.11, 10.12
CompileScript: <<
#! /bin/sh -ev
make -f Makefile.OSX -C src PREFIX=%{p}
<<
InfoTest: <<
TestScript: make -f Makefile.OSX test || exit 2
<<
InstallScript: <<
#! /bin/sh -ev
make -f Makefile.OSX -C src install PREFIX=%{i}
<<
DocFiles: COPYING README README.OSX
Shlibs: <<
!%p/lib/faketime/%N.1.dylib
<<

View File

@@ -1,21 +0,0 @@
require 'formula'
class Libfaketime < Formula
homepage 'https://github.com/wolfcw/libfaketime'
url 'https://github.com/wolfcw/libfaketime/archive/v0.9.7.tar.gz'
sha1 'PLACEHOLDER'
depends_on :macos => :sierra
fails_with :llvm do
build 2336
cause 'No thread local storage support'
end
def install
system "make", "-C", "src", "-f", "Makefile.OSX", "PREFIX=#{prefix}"
bin.install 'src/faketime'
(lib/'faketime').install 'src/libfaketime.1.dylib'
man1.install 'man/faketime.1'
end
end

View File

@@ -1,45 +0,0 @@
# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
# $Id: Portfile 112093 2013-10-11 19:57:13Z ryandesign@macports.org $
PortSystem 1.0
PortGroup github 1.0
github.setup wolfcw libfaketime 0.9.7 v
checksums rmd160 PLACEHOLDER \
sha256 PLACEHOLDER
categories sysutils
platforms darwin
maintainers code-wizards.com:wolf openmaintainer
license GPL-2
description libfaketime modifies the system time for a single application
long_description libfaketime intercepts various system calls that applications use to \
retrieve the current date and time. It can then report user-specified \
faked dates and times to these applications. This allows us to modify \
the system time an application sees without having to change the time \
system-wide. The faketime wrapper can be used from command line. \
Check the documentation on how to integrate into installed applications.
patchfiles patch-test-Makefile.OSX.diff
use_configure no
variant universal {}
compiler.blacklist *cc* *dragonegg*
build.args -f Makefile.OSX
build.env CC="${configure.cc}" \
CFLAGS="[get_canonical_archflags cc]" \
LDFLAGS="[get_canonical_archflags ld]" \
PREFIX=${prefix}
test.run yes
test.args ${build.args}
eval test.env ${build.env}
destroot.args ${build.args}
eval destroot.env ${build.env}

View File

@@ -1,12 +0,0 @@
--- test/Makefile.OSX.orig 2013-10-11 09:42:38.000000000 -0500
+++ test/Makefile.OSX 2013-10-11 14:46:11.000000000 -0500
@@ -1,7 +1,6 @@
-CC = gcc
+CC ?= clang
-CFLAGS = -std=gnu99 -Wall -DFAKE_STAT
-LDFLAGS =
+CFLAGS += -std=gnu99 -Wall -DFAKE_STAT
SRC = timetest.c
OBJ = ${SRC:.c=.o}

View File

@@ -1,65 +0,0 @@
# Packaging for OS X
Several software tools assist with the installation of open source software
on OS X. The authors of libfaketime maintain the libfaketime build spec files
for MacPorts, Homebrew, and Fink.
## MacPorts
Installing libfaketime via MacPorts is based on the provided Portfile, which
has been included in the official MacPorts distribution since October, 2013.
Users therefore can use "sudo port install libfaketime" as installation
command.
Some libfaketime Portfile caveats:
- Github-based source file distribution
- Non-clang-compilers need to be blacklisted
- MacPorts folks have requested to avoid a platform-specific Makefile.OSX in
the future
Portfile submission is documented in https://www.macports.org/guide/#project.contributing
and handled via a ticketing system:
- https://trac.macports.org/ticket/40662
- https://trac.macports.org/ticket/40748
## Homebrew
The libfaketime 'formula' for Homebrew is available since November, 2013.
Homebrew users can use 'brew install libfaketime' as installation command.
Some libfaketime formula caveats:
- "depends_on :macos => :lion" must be set for libfaketime >=0.9.5
- :llvm builds <= 2336 must be blacklisted because libfaketime =0.9.5
requires a compiler with thread local storage support.
Formula submission is handled via pull request on Github following the
"one formula per commit, one commit per formula" rule, which necessitates
squashing commits and forced pushes when applying fixes. Style issues
complementary to the documentation have been discussed in
https://github.com/mxcl/homebrew/pull/23245
## Fink
A libfaketime.info file is included in the Fink 10.7 tree since October,
2013, and installed using
fink install libfaketime
Some libfaketime fink info file caveats:
- The dynamic library must be declared as private Shlib; this also necessitates
BuildDepends: fink (>= 0.28)
- "Distribution: 10.7, 10.8, 10.9" is required because libfaketime >=0.9.5 does
not work on OS X 10.6 or before anymore.
- When compiling, PREFIX=%{p} needs to be used because this path is hardcoded
into the wrapper. However, "make install" needs to deploy into PREFIX=%{i} to
make packaging work.
Submission is via https://sourceforge.net/p/fink/package-submissions/

View File

@@ -1,14 +0,0 @@
# libfaketime packaging
Not everyone feels comfortable with installing tools and libraries manually
by downloading and building them from source. Luckily enough, voluntary
maintainers prepare new libfaketime releases for various platforms and make
them available as binary packages or otherwise automatically installable
software.
In this directory, we collect build specification files for the platforms
that we are aware of being actively supported. They help us to analyze
build issues, create awareness for platform-specific patches that had to
be applied and might be merged with our code, and provide the contact
information for future "early release warnings".

View File

@@ -9,12 +9,9 @@
# 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
# possibile caching side-effects in a multithreaded environment
# possible caching side-effects in a multithreaded environment
# without this, but the performance impact may require you to
# try it unsynchronized.
#
@@ -24,17 +21,30 @@
# that make use of low-level system calls, such as Java Virtual
# Machines.
#
# FAKE_SLEEP
# - Also intercept sleep(), nanosleep(), usleep(), alarm(), [p]poll()
# FAKE_SLEEP
# - Also intercept sleep(), nanosleep(), usleep(), alarm(), [p]poll()
#
# FAKE_TIMERS
# - Also intercept timer_settime() and timer_gettime()
# FAKE_TIMERS
# - Also intercept timer_settime() and timer_gettime()
#
# 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!
# 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
@@ -50,8 +60,8 @@
# 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.
# 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='.'
@@ -62,14 +72,14 @@ PREFIX ?= /usr/local
LIBDIRNAME ?= /lib/faketime
PLATFORM ?=$(shell uname)
CFLAGS += -std=gnu99 -Wall -Wextra -Werror -Wno-nonnull-compare -DFAKE_STAT -DFAKE_SLEEP -DFAKE_TIMERS -DFAKE_INTERNAL_CALLS -fPIC -DPREFIX='"'$(PREFIX)'"' -DLIBDIRNAME='"'$(LIBDIRNAME)'"'
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
LDFLAGS += $(FAKETIME_LINK_FLAGS) -lpthread
ifneq ($(PLATFORM),SunOS)
LDFLAGS += -Wl,--version-script=libfaketime.map
endif
@@ -86,16 +96,16 @@ LIBS = libfaketime.so.${SONAME} libfaketimeMT.so.${SONAME}
all: ${LIBS} ${BINS}
libfaketimeMT.o: EXTRA_FLAGS := -DPTHREAD -DPTHREAD_SINGLETHREADED_TIME
libfaketimeMT.o: EXTRA_FLAGS := -DPTHREAD_SINGLETHREADED_TIME
${LIBS_OBJ}: libfaketime.c
${CC} -o $@ -c ${CFLAGS} ${EXTRA_FLAGS} $<
${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} ${EXTRA_FLAGS} $< ${LDFLAGS} ${BIN_LDFLAGS}
${CC} -o $@ ${CFLAGS} ${CPPFLAGS} ${EXTRA_FLAGS} $< ${LDFLAGS} ${BIN_LDFLAGS}
clean:
@rm -f ${LIBS_OBJ} ${LIBS} ${BINS}

View File

@@ -14,7 +14,7 @@
#
# PTHREAD_SINGLETHREADED_TIME
# - Define this if you want to single-thread time() ... there ARE
# possibile caching side-effects in a multithreaded environment
# possible caching side-effects in a multithreaded environment
# without this, but the performance impact may require you to
# try it unsynchronized.
#
@@ -38,8 +38,8 @@ INSTALL ?= install
PREFIX ?= /usr/local
CFLAGS += -DFAKE_SLEEP -DFAKE_INTERNAL_CALLS -DPREFIX='"'${PREFIX}'"'
LIB_LDFLAGS += -dynamiclib -current_version 0.9.7 -compatibility_version 0.7
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

View File

@@ -1,7 +1,7 @@
/*
* libfaketime wrapper command
*
* This file is part of libfaketime, version 0.9.7
* This file is part of libfaketime, version 0.9.8
*
* libfaketime is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License v2 as published by the
@@ -124,7 +124,7 @@ int main (int argc, char **argv)
}
else if (0 == strcmp(argv[curr_opt], "--exclude-monotonic"))
{
setenv("DONT_FAKE_MONOTONIC", "1", true);
setenv("FAKETIME_DONT_FAKE_MONOTONIC", "1", true);
curr_opt++;
continue;
}
@@ -209,7 +209,7 @@ int main (int argc, char **argv)
int shm_fd;
sem_t *sem;
struct ft_shared_s *ft_shared;
char shared_objs[PATH_BUFSIZE];
char shared_objs[PATH_BUFSIZE * 2 + 1];
/*
* Casting of getpid() return value to long needed to make GCC on SmartOS
@@ -224,6 +224,7 @@ int main (int argc, char **argv)
if (SEM_FAILED == (sem = sem_open(sem_name, O_CREAT|O_EXCL, S_IWUSR|S_IRUSR, 1)))
{
perror("sem_open");
fprintf(stderr, "The faketime wrapper only works on platforms that support the sem_open()\nsystem call. However, you may LD_PRELOAD libfaketime without using this wrapper.\n");
exit(EXIT_FAILURE);
}
@@ -286,7 +287,7 @@ int main (int argc, char **argv)
exit(EXIT_FAILURE);
}
snprintf(shared_objs, PATH_BUFSIZE, "%s %s", sem_name, shm_name);
snprintf(shared_objs, sizeof(shared_objs), "%s %s", sem_name, shm_name);
setenv("FAKETIME_SHARED", shared_objs, true);
sem_close(sem);
}

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,18 @@ GLIBC_2.2 {
timer_gettime; timer_settime;
local: timer_settime_*; timer_gettime_*;
};
GLIBC_2.3.3 {
# Changed timer_t.
timer_gettime; timer_settime;
} GLIBC_2.2;
GLIBC_2.2.5 {
global: pthread_cond_timedwait;
local: pthread_cond_timedwait_*; pthread_cond_init_*; pthread_cond_destroy*;
};
GLIBC_2.3.2 {
pthread_cond_timedwait; pthread_cond_init; pthread_cond_destroy;
} GLIBC_2.2.5;

View File

@@ -60,9 +60,9 @@
#define timermul2(tvp, c, result, prefix) \
do \
{ \
long long tmp_time; \
tmp_time = (c) * ((tvp)->tv_sec * SEC_TO_##prefix##SEC + \
(tvp)->tv_##prefix##sec); \
int64_t tmp_time; \
tmp_time = (c) * (int64_t) ((tvp)->tv_sec * SEC_TO_##prefix##SEC + \
(int64_t) (tvp)->tv_##prefix##sec); \
(result)->tv_##prefix##sec = tmp_time % SEC_TO_##prefix##SEC; \
(result)->tv_sec = (tmp_time - (result)->tv_##prefix##sec) / \
SEC_TO_##prefix##SEC; \
@@ -89,16 +89,28 @@
#ifndef timersub
#define timersub(a, b, result) timersub2(a, b, result, u)
#endif
#ifndef timersub
#ifndef timermul
#define timermul(a, c, result) timermul2(a, c, result, u)
#endif
/* ops for nanosecs */
#ifndef timespecisset
#define timespecisset(tvp) timerisset2(tvp,n)
#endif
#ifndef timespecclear
#define timespecclear(tvp) timerclear2(tvp, n)
#endif
#ifndef timespeccmp
#define timespeccmp(a, b, CMP) timercmp2(a, b, CMP, n)
#endif
#ifndef timespecadd
#define timespecadd(a, b, result) timeradd2(a, b, result, n)
#endif
#ifndef timespecsub
#define timespecsub(a, b, result) timersub2(a, b, result, n)
#endif
#ifndef timespecmul
#define timespecmul(a, c, result) timermul2(a, c, result, n)
#endif
#endif

1208
src/uthash.h Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
CC = gcc
CFLAGS = -std=gnu99 -Wall -DFAKE_STAT -Werror -Wextra
LDFLAGS = -lrt
CFLAGS = -std=gnu99 -Wall -DFAKE_STAT -Werror -Wextra $(FAKETIME_COMPILE_CFLAGS)
LDFLAGS = -lrt -lpthread
SRC = timetest.c
OBJ = ${SRC:.c=.o}

View File

@@ -1,6 +1,6 @@
CC ?= clang
CFLAGS += -std=gnu99 -Wall -DFAKE_STAT
CFLAGS += -std=gnu99 -Wall -DFAKE_STAT $(FAKETIME_COMPILE_CFLAGS)
SRC = timetest.c
OBJ = ${SRC:.c=.o}

View File

@@ -35,5 +35,5 @@
# 3. create DIR/test_XXX.sh.
# 4. write a run function and testcase functions in DIR/test_XXX.sh.
# 5. within the run function, call run_testcase for each testcase function.
# 6. within each testcase funtion, call assertneq or asserteq, or do
# 6. within each testcase function, call assertneq or asserteq, or do
# the equivalent.

View File

@@ -1,12 +1,12 @@
# Checks that setting DONT_FAKE_MONOTONIC actually prevent
# Checks that setting FAKETIME_DONT_FAKE_MONOTONIC actually prevent
# libfaketime from faking monotonic clocks.
#
# We do this by freezing time at a specific and arbitrary date with faketime,
# and making sure that if we set DONT_FAKE_MONOTONIC to 1, calling
# and making sure that if we set FAKETIME_DONT_FAKE_MONOTONIC to 1, calling
# clock_gettime(CLOCK_MONOTONIC) returns two different values.
#
# We also make sure that if we don't set DONT_FAKE_MONOTONIC to 1, in other
# words when we use the default behavior, two subsequent calls to
# We also make sure that if we don't set FAKETIME_DONT_FAKE_MONOTONIC to 1,
# in other words when we use the default behavior, two subsequent calls to
# clock_gettime(CLOCK_MONOTONIC) do return different values.
init()
@@ -26,7 +26,7 @@ run()
init
run_testcase dont_fake_mono
run_testcase fake_mono
# run_testcase fake_mono
}
get_token()
@@ -64,7 +64,8 @@ get_monotonic_time()
{
dont_fake_mono=$1; shift;
clock_id=$1; shift;
DONT_FAKE_MONOTONIC=${dont_fake_mono} fakecmd "2014-07-21 09:00:00" \
FAKETIME_DONT_FAKE_MONOTONIC=${dont_fake_mono} \
fakecmd "2014-07-21 09:00:00" \
/bin/bash -c "for i in 1 2; do \
perl -w -MTime::HiRes=clock_gettime,${clock_id} -E \
'say clock_gettime(${clock_id})'; \

View File

@@ -1,4 +1,4 @@
# test suite that always succeds - for testing framework
# test suite that always succeeds - for testing framework
run()
{

View File

@@ -37,7 +37,15 @@ fakedate()
#
typeset fmt='%s'
export FAKETIME_FMT=$fmt
fakecmd "$1" date +$fmt
if [ "mac" == "$PLATFORM" ]; then
if [ -x /usr/local/bin/gdate ] ; then
fakecmd "$1" gdate +$fmt
else
echo "<skip>"
fi
else
fakecmd "$1" date +$fmt
fi
}
#
@@ -63,5 +71,14 @@ test_with_i()
typeset i="$1"
typeset t=$(pow 2 $i)
asserteq $(fakedate $t) $t "(secs since Epoch)"
if [ "mac" == "$PLATFORM" ]; then
if [ -x /usr/local/bin/gdate ] ; then
asserteq $(fakedate $t) $t "(secs since Epoch)"
else
asserteq $t $t "(skipping test, install gdate)"
fi
else
asserteq $(fakedate $t) $t "(secs since Epoch)"
fi
}

View File

@@ -47,9 +47,9 @@ echo
echo "============================================================================="
echo
echo "Running the test program with 10 days postive offset specified, and sped up 2 times"
echo "\$ LD_PRELOAD=../src/libfaketime.so.1 FAKETIME=\"+10d x2\" ./timetest"
LD_PRELOAD=../src/libfaketime.so.1 FAKETIME="+10d x2" NO_FAKE_STAT=1 ./timetest
echo "Running the test program with 10 days positive offset specified, and speed-up factor"
echo "\$ LD_PRELOAD=../src/libfaketime.so.1 FAKETIME=\"+10d x1\" ./timetest"
LD_PRELOAD=../src/libfaketime.so.1 FAKETIME="+10d x1" NO_FAKE_STAT=1 ./timetest
echo
echo "============================================================================="

View File

@@ -28,19 +28,25 @@ echo "FAKETIME=\"-10d\" ./timetest"
FAKETIME="-10d" ./timetest
echo
echo "Running the test program with 10 days negative offset specified, and FAKE_STAT disabled"
echo "FAKETIME=\"-10d\" NO_FAKE_STAT=1 ./timetest"
FAKETIME="-10d" NO_FAKE_STAT=1 ./timetest
echo
# FAKE_STAT is disabled on macOS by default, so testing NO_FAKE_STAT is not useful
#echo "Running the test program with 10 days negative offset specified, and FAKE_STAT disabled"
#echo "FAKETIME=\"-10d\" NO_FAKE_STAT=1 ./timetest"
#FAKETIME="-10d" NO_FAKE_STAT=1 ./timetest
#echo
echo "Running the test program with 10 days postive offset specified, and sped up 2 times"
echo "Running the test program with 10 days positive offset specified, and sped up 2 times"
echo "FAKETIME=\"+10d x2\" ./timetest"
FAKETIME="+10d x2" NO_FAKE_STAT=1 ./timetest
echo
echo "Running the 'date' command with 15 days negative offset specified"
echo "FAKETIME=\"-15d\" date"
FAKETIME="-15d" date
echo
# On more recent macOS versions, the following won't work without copying gdate
# to a different folder beforehand. We don't do that here, and since the output
# of these tests must be reviewed manually anyway, the timetest binary should be
# sufficient to determine whether everything works as planned.
#echo "Running the 'date' command with 15 days negative offset specified"
#echo "FAKETIME=\"-15d\" date"
#FAKETIME="-15d" date
#echo
exit 0

View File

@@ -18,19 +18,26 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <sys/timeb.h>
#ifndef __APPLE__
#ifdef FAKE_STAT
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#endif
#else
#include <unistd.h>
#endif
#ifndef __APPLE__
#include <pthread.h>
#include <errno.h>
#include <signal.h>
#define VERBOSE 0
@@ -49,6 +56,64 @@ handler(int sig, siginfo_t *si, void *uc)
printf("Caught signal %d\n", sig);
}
}
void* pthread_test(void* args)
{
pthread_mutex_t fakeMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t fakeCond = PTHREAD_COND_INITIALIZER;
pthread_cond_t monotonic_cond;
pthread_condattr_t attr;
struct timespec timeToWait, now;
int rt;
args = args; // silence compiler warning about unused argument
clock_gettime(CLOCK_REALTIME, &now);
timeToWait.tv_sec = now.tv_sec+1;
timeToWait.tv_nsec = now.tv_nsec;
printf("pthread_cond_timedwait: CLOCK_REALTIME test\n");
printf("(Intentionally sleeping 1 second...)\n");
fflush(stdout);
pthread_mutex_lock(&fakeMutex);
rt = pthread_cond_timedwait(&fakeCond, &fakeMutex, &timeToWait);
if (rt != ETIMEDOUT)
{
printf("pthread_cond_timedwait failed\n");
exit(EXIT_FAILURE);
}
pthread_mutex_unlock(&fakeMutex);
pthread_condattr_init(&attr);
pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
pthread_cond_init(&monotonic_cond, &attr);
clock_gettime(CLOCK_MONOTONIC, &now);
timeToWait.tv_sec = now.tv_sec+1;
timeToWait.tv_nsec = now.tv_nsec;
printf("pthread_cond_timedwait: CLOCK_MONOTONIC test\n");
printf("(Intentionally sleeping 1 second..., see docs about CLOCK_MONOTONIC test)\n");
fflush(stdout);
pthread_mutex_lock(&fakeMutex);
rt = pthread_cond_timedwait(&monotonic_cond, &fakeMutex, &timeToWait);
if (rt != ETIMEDOUT)
{
printf("pthread_cond_timedwait failed\n");
exit(EXIT_FAILURE);
}
pthread_mutex_unlock(&fakeMutex);
pthread_cond_destroy(&monotonic_cond);
return NULL;
}
#endif
int main (int argc, char **argv)
@@ -64,11 +129,22 @@ int main (int argc, char **argv)
sigset_t mask;
struct sigaction sa;
#endif
#ifndef __APPLE__
#ifdef FAKE_STAT
struct stat buf;
#endif
#endif
/* silence compiler warnings */
printf("%s", 0 == 1 ? argv[0] : "");
#ifndef __APPLE__
pthread_t thread;
void *ret;
pthread_create(&thread, NULL, pthread_test, NULL);
pthread_join(thread, &ret);
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = handler;
sigemptyset(&sa.sa_mask);
@@ -193,9 +269,11 @@ int main (int argc, char **argv)
}
#endif
#ifndef __APPLE__
#ifdef FAKE_STAT
lstat(argv[0], &buf);
printf("stat(): mod. time of file '%s': %s", argv[0], ctime(&buf.st_mtime));
#endif
#endif
return 0;