From 3daeef702b2e6a42f0f396b828f86ffc3f33fc88 Mon Sep 17 00:00:00 2001 From: Damien Goutte-Gattat Date: Wed, 18 Jan 2017 18:52:12 +0100 Subject: [PATCH] gpg: Allow to freeze faked system time. * g10/gpg.c (main): If the parameter for --faked-system-time ends with a '!', freeze time at the specified point. * common/gettime.c (gnupg_set_time): Allow to freeze the time at an arbitrary time instead of only the current time. * doc/gpg.texi: Update documentation for --faked-system-time. -- This patch allows the user to modify the behavior of the --faked-system-time option: by appending a '!' to the parameter, time in GnuPG will be frozen at the specified time, instead of advancing normally from that time onward. Signed-off-by: Damien Goutte-Gattat --- common/gettime.c | 2 +- doc/gpg.texi | 3 +++ g10/gpg.c | 14 ++++++++++++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/common/gettime.c b/common/gettime.c index e5da4fb1a..3e1ee5569 100644 --- a/common/gettime.c +++ b/common/gettime.c @@ -133,7 +133,7 @@ gnupg_set_time (time_t newtime, int freeze) else if (freeze) { timemode = FROZEN; - timewarp = current; + timewarp = newtime == (time_t)-1 ? current : newtime; } else if (newtime > current) { diff --git a/doc/gpg.texi b/doc/gpg.texi index 4ea2cd21e..044ba3761 100644 --- a/doc/gpg.texi +++ b/doc/gpg.texi @@ -2748,6 +2748,9 @@ forth to @var{epoch} which is the number of seconds elapsed since the year 1970. Alternatively @var{epoch} may be given as a full ISO time string (e.g. "20070924T154812"). +If you suffix @var{epoch} with an exclamation mark (!), the system time +will appear to be frozen at the specified time. + @item --enable-progress-filter @opindex enable-progress-filter Enable certain PROGRESS status outputs. This option allows frontends diff --git a/g10/gpg.c b/g10/gpg.c index 8c5b50589..f9039ae09 100644 --- a/g10/gpg.c +++ b/g10/gpg.c @@ -3493,10 +3493,20 @@ main (int argc, char **argv) case oFakedSystemTime: { - time_t faked_time = isotime2epoch (pargs.r.ret_str); + size_t len = strlen (pargs.r.ret_str); + int freeze = 0; + time_t faked_time; + + if (len > 0 && pargs.r.ret_str[len-1] == '!') + { + freeze = 1; + pargs.r.ret_str[len-1] = '\0'; + } + + faked_time = isotime2epoch (pargs.r.ret_str); if (faked_time == (time_t)(-1)) faked_time = (time_t)strtoul (pargs.r.ret_str, NULL, 10); - gnupg_set_time (faked_time, 0); + gnupg_set_time (faked_time, freeze); } break;