]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib/timeutils: add common ISO timestamp masks
authorJ William Piggott <elseifthen@gmx.com>
Sun, 15 Oct 2017 00:37:11 +0000 (20:37 -0400)
committerJ William Piggott <elseifthen@gmx.com>
Fri, 10 Nov 2017 21:34:55 +0000 (16:34 -0500)
* Start the ISO format flags at bit 0 instead of bit 1.

* Remove unnecessary _8601 from ISO format flag names to
  avoid line wrapping and to ease readability.

* ISO timestamps have date-time-timzone in common, so move
  the TIMEZONE flag to bit 2 causing all timestamp masks
  to have the first three bits set and the last four bits
  as timestamp 'options'.

* Change the 'SPACE' flag to a 'T' flag, because it makes
  the code and comments more concise.

* Add common ISO timestamp masks.

* Implement the ISO timestamp masks in all applicable code
  using the strxxx_iso() functions.

Signed-off-by: J William Piggott <elseifthen@gmx.com>
include/timeutils.h
lib/timeutils.c
login-utils/last.c
login-utils/lslogins.c
login-utils/utmpdump.c
misc-utils/uuidparse.c
sys-utils/dmesg.c
sys-utils/hwclock.c
sys-utils/lsipc.c
sys-utils/rfkill.c
term-utils/script.c

index e8a26146242c9292bec10f9d23191fb6a7c459ca..230e6db5f90224022353d4f7a24b1d9f93ad3167 100644 (file)
@@ -55,18 +55,26 @@ typedef uint64_t nsec_t;
 int parse_timestamp(const char *t, usec_t *usec);
 int get_gmtoff(const struct tm *tp);
 
-/* flags for strxxx_iso() functions */
+/* flags and masks for strxxx_iso() functions */
 enum {
-       ISO_8601_DATE           = (1 << 1),
-       ISO_8601_TIME           = (1 << 2),
-       ISO_8601_DOTUSEC        = (1 << 3),
-       ISO_8601_COMMAUSEC      = (1 << 4),
-       ISO_8601_TIMEZONE       = (1 << 5),
-       ISO_8601_SPACE          = (1 << 6),
-       ISO_8601_GMTIME         = (1 << 7)
+       ISO_DATE                = (1 << 0),
+       ISO_TIME                = (1 << 1),
+       ISO_TIMEZONE            = (1 << 2),
+       ISO_DOTUSEC             = (1 << 3),
+       ISO_COMMAUSEC           = (1 << 4),
+       ISO_T                   = (1 << 5),
+       ISO_GMTIME              = (1 << 6),
+       ISO_TIMESTAMP           = ISO_DATE | ISO_TIME | ISO_TIMEZONE,
+       ISO_TIMESTAMP_T         = ISO_TIMESTAMP | ISO_T,
+       ISO_TIMESTAMP_DOT       = ISO_TIMESTAMP | ISO_DOTUSEC,
+       ISO_TIMESTAMP_DOT_T     = ISO_TIMESTAMP_DOT | ISO_T,
+       ISO_TIMESTAMP_COMMA     = ISO_TIMESTAMP | ISO_COMMAUSEC,
+       ISO_TIMESTAMP_COMMA_T   = ISO_TIMESTAMP_COMMA | ISO_T,
+       ISO_TIMESTAMP_COMMA_G   = ISO_TIMESTAMP_COMMA | ISO_GMTIME,
+       ISO_TIMESTAMP_COMMA_GT  = ISO_TIMESTAMP_COMMA_G | ISO_T
 };
 
-#define ISO_8601_BUFSIZ        42
+#define ISO_BUFSIZ     42
 
 int strtimeval_iso(struct timeval *tv, int flags, char *buf, size_t bufsz);
 int strtm_iso(struct tm *tm, int flags, char *buf, size_t bufsz);
index adc255c33c71a952feac4efa0b6789101ad51cf1..fdaa2d4a95e06a596fa2f81d7368515612b6f272 100644 (file)
@@ -405,7 +405,7 @@ static int format_iso_time(struct tm *tm, suseconds_t usec, int flags, char *buf
        char *p = buf;
        int len;
 
-       if (flags & ISO_8601_DATE) {
+       if (flags & ISO_DATE) {
                len = snprintf(p, bufsz, "%4d-%.2d-%.2d", tm->tm_year + 1900,
                                                tm->tm_mon + 1, tm->tm_mday);
                if (len < 0 || (size_t) len > bufsz)
@@ -414,14 +414,14 @@ static int format_iso_time(struct tm *tm, suseconds_t usec, int flags, char *buf
                p += len;
        }
 
-       if ((flags & ISO_8601_DATE) && (flags & ISO_8601_TIME)) {
+       if ((flags & ISO_DATE) && (flags & ISO_TIME)) {
                if (bufsz < 1)
                        return -1;
-               *p++ = (flags & ISO_8601_SPACE) ? ' ' : 'T';
+               *p++ = (flags & ISO_T) ? 'T' : ' ';
                bufsz--;
        }
 
-       if (flags & ISO_8601_TIME) {
+       if (flags & ISO_TIME) {
                len = snprintf(p, bufsz, "%02d:%02d:%02d", tm->tm_hour,
                                                 tm->tm_min, tm->tm_sec);
                if (len < 0 || (size_t) len > bufsz)
@@ -430,14 +430,14 @@ static int format_iso_time(struct tm *tm, suseconds_t usec, int flags, char *buf
                p += len;
        }
 
-       if (flags & ISO_8601_DOTUSEC) {
+       if (flags & ISO_DOTUSEC) {
                len = snprintf(p, bufsz, ".%06ld", (long) usec);
                if (len < 0 || (size_t) len > bufsz)
                        return -1;
                bufsz -= len;
                p += len;
 
-       } else if (flags & ISO_8601_COMMAUSEC) {
+       } else if (flags & ISO_COMMAUSEC) {
                len = snprintf(p, bufsz, ",%06ld", (long) usec);
                if (len < 0 || (size_t) len > bufsz)
                        return -1;
@@ -445,7 +445,7 @@ static int format_iso_time(struct tm *tm, suseconds_t usec, int flags, char *buf
                p += len;
        }
 
-       if (flags & ISO_8601_TIMEZONE) {
+       if (flags & ISO_TIMEZONE) {
                int tmin  = get_gmtoff(tm) / 60;
                int zhour = tmin / 60;
                int zmin  = abs(tmin % 60);
@@ -461,7 +461,7 @@ int strtimeval_iso(struct timeval *tv, int flags, char *buf, size_t bufsz)
 {
        struct tm tm;
 
-       if (flags & ISO_8601_GMTIME)
+       if (flags & ISO_GMTIME)
                tm = *gmtime(&tv->tv_sec);
        else
                tm = *localtime(&tv->tv_sec);
@@ -479,7 +479,7 @@ int strtime_iso(const time_t *t, int flags, char *buf, size_t bufsz)
 {
        struct tm tm;
 
-       if (flags & ISO_8601_GMTIME)
+       if (flags & ISO_GMTIME)
                tm = *gmtime(t);
        else
                tm = *localtime(t);
@@ -548,7 +548,7 @@ time_t timegm(struct tm *tm)
 int main(int argc, char *argv[])
 {
        struct timeval tv = { 0 };
-       char buf[ISO_8601_BUFSIZ];
+       char buf[ISO_BUFSIZ];
 
        if (argc < 2) {
                fprintf(stderr, "usage: %s <time> [<usec>]\n", argv[0]);
@@ -559,19 +559,17 @@ int main(int argc, char *argv[])
        if (argc == 3)
                tv.tv_usec = strtos64_or_err(argv[2], "failed to parse <usec>");
 
-       strtimeval_iso(&tv, ISO_8601_DATE, buf, sizeof(buf));
+       strtimeval_iso(&tv, ISO_DATE, buf, sizeof(buf));
        printf("Date: '%s'\n", buf);
 
-       strtimeval_iso(&tv, ISO_8601_TIME, buf, sizeof(buf));
+       strtimeval_iso(&tv, ISO_TIME, buf, sizeof(buf));
        printf("Time: '%s'\n", buf);
 
-       strtimeval_iso(&tv, ISO_8601_DATE | ISO_8601_TIME | ISO_8601_COMMAUSEC,
-                           buf, sizeof(buf));
+       strtimeval_iso(&tv, ISO_DATE | ISO_TIME | ISO_COMMAUSEC | ISO_T,
+                      buf, sizeof(buf));
        printf("Full: '%s'\n", buf);
 
-       strtimeval_iso(&tv, ISO_8601_DATE | ISO_8601_TIME | ISO_8601_DOTUSEC |
-                           ISO_8601_TIMEZONE | ISO_8601_SPACE,
-                           buf, sizeof(buf));
+       strtimeval_iso(&tv, ISO_TIMESTAMP_DOT, buf, sizeof(buf));
        printf("Zone: '%s'\n", buf);
 
        return EXIT_SUCCESS;
index f2e8f834e84e9a8678f877d81b71ef11a82d9d90..80d77d20b28e8640bd680308a498e33dc057789c 100644 (file)
@@ -349,7 +349,7 @@ static int time_formatter(int fmt, char *dst, size_t dlen, time_t *when)
                ret = rtrim_whitespace((unsigned char *) dst);
                break;
        case LAST_TIMEFTM_ISO8601:
-               ret = strtime_iso(when, ISO_8601_DATE|ISO_8601_TIME|ISO_8601_TIMEZONE, dst, dlen);
+               ret = strtime_iso(when, ISO_TIMESTAMP_T, dst, dlen);
                break;
        default:
                abort();
index 1042b9b41ceb849f018350f77bd67d7cb9a43b8e..51033b01bba4e8a105279a31bc7885fc14019191 100644 (file)
@@ -333,11 +333,10 @@ static char *make_time(int mode, time_t time)
                                buf, sizeof(buf));
                break;
        case TIME_ISO:
-               rc = strtime_iso(&time, ISO_8601_DATE|ISO_8601_TIME|ISO_8601_TIMEZONE,
-                                  buf, sizeof(buf));
+               rc = strtime_iso(&time, ISO_TIMESTAMP_T, buf, sizeof(buf));
                break;
        case TIME_ISO_SHORT:
-               rc = strtime_iso(&time, ISO_8601_DATE, buf, sizeof(buf));
+               rc = strtime_iso(&time, ISO_DATE, buf, sizeof(buf));
                break;
        default:
                errx(EXIT_FAILURE, _("unsupported time type"));
index 00c44b8dbf754865bed5d999b0ee8be70c6c96b0..5cc87834aef32e0897859cdda364363986891bd4 100644 (file)
@@ -102,9 +102,7 @@ static void print_utline(struct utmpx *ut, FILE *out)
        tv.tv_sec = ut->ut_tv.tv_sec;
        tv.tv_usec = ut->ut_tv.tv_usec;
 
-       if (strtimeval_iso(&tv,
-                          ISO_8601_DATE | ISO_8601_TIME | ISO_8601_COMMAUSEC |
-                          ISO_8601_TIMEZONE | ISO_8601_GMTIME, time_string,
+       if (strtimeval_iso(&tv, ISO_TIMESTAMP_COMMA_GT, time_string,
                           sizeof(time_string)) != 0)
                return;
        cleanse(ut->ut_id);
index 08ba334156b4ff76a359c5a7589d74878dad8cf9..777f9db5e586c83b6232b8265fee16e74f269540 100644 (file)
@@ -224,17 +224,11 @@ static void fill_table_row(struct libscols_table *tb, char const *const uuid)
                        }
                        if (variant == UUID_VARIANT_DCE && type == 1) {
                                struct timeval tv;
-                               char date_buf[ISO_8601_BUFSIZ + 4];
+                               char date_buf[ISO_BUFSIZ];
 
                                uuid_time(buf, &tv);
-                               strtimeval_iso(&tv,
-                                              ISO_8601_DATE |
-                                                ISO_8601_TIME |
-                                                ISO_8601_COMMAUSEC |
-                                                ISO_8601_TIMEZONE |
-                                                ISO_8601_SPACE,
-                                              date_buf,
-                                              sizeof(date_buf));
+                               strtimeval_iso(&tv, ISO_TIMESTAMP_COMMA,
+                                              date_buf, sizeof(date_buf));
                                str = xstrdup(date_buf);
                        }
                        break;
index 9fdc1d8a771a8f8fd3e83c81f889e1ae9d04b818..bdd50b474e419d14d4de36caae7fdbb5ac888cfd 100644 (file)
@@ -840,9 +840,7 @@ static char *iso_8601_time(struct dmesg_control *ctl, struct dmesg_record *rec,
                .tv_usec = rec->tv.tv_usec
        };
 
-       if (strtimeval_iso(&tv, ISO_8601_DATE|ISO_8601_TIME|ISO_8601_COMMAUSEC|
-                               ISO_8601_TIMEZONE,
-                               buf, bufsz) != 0)
+       if (strtimeval_iso(&tv, ISO_TIMESTAMP_COMMA_T, buf, bufsz) != 0)
                return NULL;
 
        return buf;
index 3ac43efeed2ac2fd5fb5b1564b3bac04c7af7a60..c93a5fd65f7997aebbcf143b710f0da1b6d52157 100644 (file)
@@ -554,11 +554,9 @@ set_hardware_clock_exact(const struct hwclock_control *ctl,
 static int
 display_time(struct timeval hwctime)
 {
-       char buf[ISO_8601_BUFSIZ];
+       char buf[ISO_BUFSIZ];
 
-       if (strtimeval_iso(&hwctime, ISO_8601_DATE|ISO_8601_TIME|ISO_8601_DOTUSEC|
-                                ISO_8601_TIMEZONE|ISO_8601_SPACE,
-                                buf, sizeof(buf))) {
+       if (strtimeval_iso(&hwctime, ISO_TIMESTAMP_DOT, buf, sizeof(buf))) {
                warnx(_("iso-8601 format overflow"));
                return EXIT_FAILURE;
        }
index e99c861ab50a4336ff6faf4eb625cb54c06e4229..4b3b0c92de0b444a83ad33724f96aed2fe1bcdcb 100644 (file)
@@ -451,7 +451,7 @@ static char *make_time(int mode, time_t time)
                strtime_short(&time, &now, 0, buf, sizeof(buf));
                break;
        case TIME_ISO:
-               strtime_iso(&time, ISO_8601_DATE|ISO_8601_TIME|ISO_8601_TIMEZONE, buf, sizeof(buf));
+               strtime_iso(&time, ISO_TIMESTAMP_T, buf, sizeof(buf));
                break;
        default:
                errx(EXIT_FAILURE, _("unsupported time type"));
index c9559ef48ee2a1caa9884a994b9d4cabb60be70d..75804ad41e6525014f4b34daf01b02ff5474c07a 100644 (file)
@@ -223,7 +223,7 @@ static int rfkill_event(void)
 {
        struct rfkill_event event;
        struct timeval tv;
-       char date_buf[ISO_8601_BUFSIZ];
+       char date_buf[ISO_BUFSIZ];
        struct pollfd p;
        int fd, n;
 
@@ -253,12 +253,8 @@ static int rfkill_event(void)
                        continue;
 
                gettimeofday(&tv, NULL);
-               strtimeval_iso(&tv,
-                              ISO_8601_DATE |
-                              ISO_8601_TIME |
-                              ISO_8601_COMMAUSEC |
-                              ISO_8601_TIMEZONE |
-                              ISO_8601_SPACE, date_buf, sizeof(date_buf));
+               strtimeval_iso(&tv, ISO_TIMESTAMP_COMMA, date_buf,
+                              sizeof(date_buf));
                printf("%s: idx %u type %u op %u soft %u hard %u\n",
                       date_buf,
                       event.idx, event.type, event.op, event.soft, event.hard);
index cf63ab336b0df905264461e8913f3b06343b459d..f991de14ec7588f213d0e38bd420a1b6b7ea07f0 100644 (file)
@@ -472,9 +472,7 @@ static void do_io(struct script_control *ctl)
 
 
        if (ctl->typescriptfp) {
-               strtime_iso(&tvec, ISO_8601_DATE | ISO_8601_TIME |
-                               ISO_8601_TIMEZONE | ISO_8601_SPACE,
-                               buf, sizeof(buf));
+               strtime_iso(&tvec, ISO_TIMESTAMP, buf, sizeof(buf));
                fprintf(ctl->typescriptfp, _("Script started on %s\n"), buf);
        }
        gettime_monotonic(&ctl->oldtime);
@@ -546,9 +544,7 @@ static void do_io(struct script_control *ctl)
 
        if (ctl->typescriptfp) {
                tvec = script_time((time_t *)NULL);
-               strtime_iso(&tvec, ISO_8601_DATE | ISO_8601_TIME |
-                               ISO_8601_TIMEZONE | ISO_8601_SPACE,
-                               buf, sizeof(buf));
+               strtime_iso(&tvec, ISO_TIMESTAMP, buf, sizeof(buf));
                fprintf(ctl->typescriptfp, _("\nScript done on %s\n"), buf);
        }
        done(ctl);