X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Ftime-util.c;h=8e5de77757fa587a7e3db4db985104e4877b5f18;hp=55428c4ced93cd9a6a5ae37f37d56137c5053c71;hb=e1d758033dc7e101ab32323a0f1649d8daf56a22;hpb=966204e010ed432a1d7a0481d41a326d8ec7b0c8 diff --git a/src/shared/time-util.c b/src/shared/time-util.c index 55428c4ce..8e5de7775 100644 --- a/src/shared/time-util.c +++ b/src/shared/time-util.c @@ -142,12 +142,11 @@ struct timeval *timeval_store(struct timeval *tv, usec_t u) { if (u == (usec_t) -1) { tv->tv_sec = (time_t) -1; tv->tv_usec = (suseconds_t) -1; - return tv; + } else { + tv->tv_sec = (time_t) (u / USEC_PER_SEC); + tv->tv_usec = (suseconds_t) (u % USEC_PER_SEC); } - tv->tv_sec = (time_t) (u / USEC_PER_SEC); - tv->tv_usec = (suseconds_t) (u % USEC_PER_SEC); - return tv; } @@ -184,7 +183,7 @@ char *format_timestamp_us(char *buf, size_t l, usec_t t) { if (strftime(buf, l, "%a %Y-%m-%d %H:%M:%S", &tm) <= 0) return NULL; - snprintf(buf + strlen(buf), l - strlen(buf), ".%06llu", t % USEC_PER_SEC); + snprintf(buf + strlen(buf), l - strlen(buf), ".%06llu", (unsigned long long) (t % USEC_PER_SEC)); if (strftime(buf + strlen(buf), l - strlen(buf), " %Z", &tm) <= 0) return NULL; @@ -209,45 +208,45 @@ char *format_timestamp_relative(char *buf, size_t l, usec_t t) { } if (d >= USEC_PER_YEAR) - snprintf(buf, l, "%llu years %llu months %s", - (unsigned long long) (d / USEC_PER_YEAR), - (unsigned long long) ((d % USEC_PER_YEAR) / USEC_PER_MONTH), s); + snprintf(buf, l, USEC_FMT " years " USEC_FMT " months %s", + d / USEC_PER_YEAR, + (d % USEC_PER_YEAR) / USEC_PER_MONTH, s); else if (d >= USEC_PER_MONTH) - snprintf(buf, l, "%llu months %llu days %s", - (unsigned long long) (d / USEC_PER_MONTH), - (unsigned long long) ((d % USEC_PER_MONTH) / USEC_PER_DAY), s); + snprintf(buf, l, USEC_FMT " months " USEC_FMT " days %s", + d / USEC_PER_MONTH, + (d % USEC_PER_MONTH) / USEC_PER_DAY, s); else if (d >= USEC_PER_WEEK) - snprintf(buf, l, "%llu weeks %llu days %s", - (unsigned long long) (d / USEC_PER_WEEK), - (unsigned long long) ((d % USEC_PER_WEEK) / USEC_PER_DAY), s); + snprintf(buf, l, USEC_FMT " weeks " USEC_FMT " days %s", + d / USEC_PER_WEEK, + (d % USEC_PER_WEEK) / USEC_PER_DAY, s); else if (d >= 2*USEC_PER_DAY) - snprintf(buf, l, "%llu days %s", (unsigned long long) (d / USEC_PER_DAY), s); + snprintf(buf, l, USEC_FMT " days %s", d / USEC_PER_DAY, s); else if (d >= 25*USEC_PER_HOUR) - snprintf(buf, l, "1 day %lluh %s", - (unsigned long long) ((d - USEC_PER_DAY) / USEC_PER_HOUR), s); + snprintf(buf, l, "1 day " USEC_FMT "h %s", + (d - USEC_PER_DAY) / USEC_PER_HOUR, s); else if (d >= 6*USEC_PER_HOUR) - snprintf(buf, l, "%lluh %s", - (unsigned long long) (d / USEC_PER_HOUR), s); + snprintf(buf, l, USEC_FMT "h %s", + d / USEC_PER_HOUR, s); else if (d >= USEC_PER_HOUR) - snprintf(buf, l, "%lluh %llumin %s", - (unsigned long long) (d / USEC_PER_HOUR), - (unsigned long long) ((d % USEC_PER_HOUR) / USEC_PER_MINUTE), s); + snprintf(buf, l, USEC_FMT "h " USEC_FMT "min %s", + d / USEC_PER_HOUR, + (d % USEC_PER_HOUR) / USEC_PER_MINUTE, s); else if (d >= 5*USEC_PER_MINUTE) - snprintf(buf, l, "%llumin %s", - (unsigned long long) (d / USEC_PER_MINUTE), s); + snprintf(buf, l, USEC_FMT "min %s", + d / USEC_PER_MINUTE, s); else if (d >= USEC_PER_MINUTE) - snprintf(buf, l, "%llumin %llus %s", - (unsigned long long) (d / USEC_PER_MINUTE), - (unsigned long long) ((d % USEC_PER_MINUTE) / USEC_PER_SEC), s); + snprintf(buf, l, USEC_FMT "min " USEC_FMT "s %s", + d / USEC_PER_MINUTE, + (d % USEC_PER_MINUTE) / USEC_PER_SEC, s); else if (d >= USEC_PER_SEC) - snprintf(buf, l, "%llus %s", - (unsigned long long) (d / USEC_PER_SEC), s); + snprintf(buf, l, USEC_FMT "s %s", + d / USEC_PER_SEC, s); else if (d >= USEC_PER_MSEC) - snprintf(buf, l, "%llums %s", - (unsigned long long) (d / USEC_PER_MSEC), s); + snprintf(buf, l, USEC_FMT "ms %s", + d / USEC_PER_MSEC, s); else if (d > 0) - snprintf(buf, l, "%lluus %s", - (unsigned long long) d, s); + snprintf(buf, l, USEC_FMT"us %s", + d, s); else snprintf(buf, l, "now"); @@ -326,9 +325,9 @@ char *format_timespan(char *buf, size_t l, usec_t t, usec_t accuracy) { if (j > 0) { k = snprintf(p, l, - "%s%llu.%0*llu%s", + "%s"USEC_FMT".%0*llu%s", p > buf ? " " : "", - (unsigned long long) a, + a, j, (unsigned long long) b, table[i].suffix); @@ -341,9 +340,9 @@ char *format_timespan(char *buf, size_t l, usec_t t, usec_t accuracy) { /* No? Then let's show it normally */ if (!done) { k = snprintf(p, l, - "%s%llu%s", + "%s"USEC_FMT"%s", p > buf ? " " : "", - (unsigned long long) a, + a, table[i].suffix); t = b; @@ -371,10 +370,10 @@ void dual_timestamp_serialize(FILE *f, const char *name, dual_timestamp *t) { if (!dual_timestamp_is_set(t)) return; - fprintf(f, "%s=%llu %llu\n", + fprintf(f, "%s="USEC_FMT" "USEC_FMT"\n", name, - (unsigned long long) t->realtime, - (unsigned long long) t->monotonic); + t->realtime, + t->monotonic); } void dual_timestamp_deserialize(const char *value, dual_timestamp *t) { @@ -383,7 +382,7 @@ void dual_timestamp_deserialize(const char *value, dual_timestamp *t) { assert(value); assert(t); - if (sscanf(value, "%lli %llu", &a, &b) != 2) + if (sscanf(value, "%llu %llu", &a, &b) != 2) log_debug("Failed to parse finish timestamp value %s", value); else { t->realtime = a; @@ -433,6 +432,7 @@ int parse_timestamp(const char *t, usec_t *usec) { * tomorrow (time is set to 00:00:00) * +5min * -5days + * @2147483647 (seconds since epoch) * */ @@ -461,21 +461,23 @@ int parse_timestamp(const char *t, usec_t *usec) { goto finish; } else if (t[0] == '+') { - r = parse_sec(t+1, &plus); if (r < 0) return r; goto finish; - } else if (t[0] == '-') { + } else if (t[0] == '-') { r = parse_sec(t+1, &minus); if (r < 0) return r; goto finish; - } else if (endswith(t, " ago")) { + } else if (t[0] == '@') + return parse_sec(t + 1, usec); + + else if (endswith(t, " ago")) { _cleanup_free_ char *z; z = strndup(t, strlen(t) - 4);