libbb: introduce and use xgettimeofday(), do not truncate 64-bit time_t in shells

function                                             old     new   delta
xgettimeofday                                          -      11     +11
get_local_var_value                                  280     281      +1
svlogd_main                                         1323    1322      -1
change_epoch                                          67      66      -1
timestamp_and_log                                    461     458      -3
hwclock_main                                         301     298      -3
fmt_time_bernstein_25                                135     132      -3
step_time                                            331     326      -5
script_main                                         1207    1202      -5
machtime                                              34      28      -6
curtime                                               61      54      -7
ts_main                                              423     415      -8
nmeter_main                                          761     751     -10
gettime1900d                                          67      46     -21
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/12 up/down: 12/-73)           Total: -61 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko
2020-12-30 23:48:01 +01:00
parent 89a55972fd
commit 3c13da3dab
16 changed files with 46 additions and 34 deletions
+5 -5
View File
@@ -11371,10 +11371,10 @@ static void FAST_FUNC
change_epoch(struct var *vepoch, const char *fmt)
{
struct timeval tv;
char buffer[sizeof("%lu.nnnnnn") + sizeof(long)*3];
char buffer[sizeof("%llu.nnnnnn") + sizeof(long long)*3];
gettimeofday(&tv, NULL);
sprintf(buffer, fmt, (unsigned long)tv.tv_sec, (unsigned)tv.tv_usec);
xgettimeofday(&tv);
sprintf(buffer, fmt, (unsigned long long)tv.tv_sec, (unsigned)tv.tv_usec);
setvar(vepoch->var_text, buffer, VNOFUNC);
vepoch->flags &= ~VNOFUNC;
}
@@ -11382,13 +11382,13 @@ change_epoch(struct var *vepoch, const char *fmt)
static void FAST_FUNC
change_seconds(const char *value UNUSED_PARAM)
{
change_epoch(&vepochs, "%lu");
change_epoch(&vepochs, "%llu");
}
static void FAST_FUNC
change_realtime(const char *value UNUSED_PARAM)
{
change_epoch(&vepochr, "%lu.%06u");
change_epoch(&vepochr, "%llu.%06u");
}
#endif
+5 -5
View File
@@ -1027,7 +1027,7 @@ struct globals {
struct sigaction sa;
char optstring_buf[sizeof("eixcs")];
#if BASH_EPOCH_VARS
char epoch_buf[sizeof("%lu.nnnnnn") + sizeof(long)*3];
char epoch_buf[sizeof("%llu.nnnnnn") + sizeof(long long)*3];
#endif
#if ENABLE_FEATURE_EDITING
char user_input_buf[CONFIG_FEATURE_EDITING_MAX_LEN];
@@ -2277,13 +2277,13 @@ static const char* FAST_FUNC get_local_var_value(const char *name)
{
const char *fmt = NULL;
if (strcmp(name, "EPOCHSECONDS") == 0)
fmt = "%lu";
fmt = "%llu";
else if (strcmp(name, "EPOCHREALTIME") == 0)
fmt = "%lu.%06u";
fmt = "%llu.%06u";
if (fmt) {
struct timeval tv;
gettimeofday(&tv, NULL);
sprintf(G.epoch_buf, fmt, (unsigned long)tv.tv_sec,
xgettimeofday(&tv);
sprintf(G.epoch_buf, fmt, (unsigned long long)tv.tv_sec,
(unsigned)tv.tv_usec);
return G.epoch_buf;
}