From dc1aabc85f1ceda5799fe39225fa76f2f77354ea Mon Sep 17 00:00:00 2001
From: Eric Le Bihan <eric.le.bihan.dev@free.fr>
Date: Wed, 2 Apr 2014 11:51:40 +0200
Subject: [PATCH] libudev: Fix redefinition of usec_t and nsec_t.

The type definitions usec_t and nsec_t are defined twice: in
path-util.h and util.h.

time-util.h and time-util.c now gather the time-related functions and
definitions (as in upstream systemd).

Signed-off-by: Eric Le Bihan <eric.le.bihan.dev@free.fr>
---
 src/libudev/Makefile.am       |    2 +
 src/libudev/libudev-private.h |    1 +
 src/libudev/log.c             |    1 +
 src/libudev/path-util.h       |    4 +-
 src/libudev/time-util.c       |  157 +++++++++++++++++++++++++++++++++++++++++
 src/libudev/time-util.h       |   56 +++++++++++++++
 src/libudev/util.c            |  132 +---------------------------------
 src/libudev/util.h            |   39 ----------
 8 files changed, 219 insertions(+), 173 deletions(-)
 create mode 100644 src/libudev/time-util.c
 create mode 100644 src/libudev/time-util.h

diff --git a/src/libudev/Makefile.am b/src/libudev/Makefile.am
index 84d018a..683407a 100644
--- a/src/libudev/Makefile.am
+++ b/src/libudev/Makefile.am
@@ -47,6 +47,7 @@ libudev_la_SOURCES =\
 	strbuf.c \
 	strv.c \
 	strxcpyx.c  \
+	time-util.c \
 	util.c \
 	utf8.c
 
@@ -73,6 +74,7 @@ noinst_HEADERS = \
 	strbuf.h \
 	strv.h \
 	strxcpyx.h \
+	time-util.h \
 	util.h \
 	utf8.h
 
diff --git a/src/libudev/libudev-private.h b/src/libudev/libudev-private.h
index af0f125..511ec5e 100644
--- a/src/libudev/libudev-private.h
+++ b/src/libudev/libudev-private.h
@@ -27,6 +27,7 @@
 
 #include "libudev.h"
 #include "macro.h"
+#include "time-util.h"
 #include "util.h"
 #include "mkdir.h"
 #include "strxcpyx.h"
diff --git a/src/libudev/log.c b/src/libudev/log.c
index 73bba69..a4e1bce 100644
--- a/src/libudev/log.c
+++ b/src/libudev/log.c
@@ -30,6 +30,7 @@
 #include <string.h>
 
 #include "log.h"
+#include "time-util.h"
 #include "util.h"
 #include "missing.h"
 #include "macro.h"
diff --git a/src/libudev/path-util.h b/src/libudev/path-util.h
index eea7589..8e55131 100644
--- a/src/libudev/path-util.h
+++ b/src/libudev/path-util.h
@@ -18,10 +18,8 @@
 ***/
 
 #include <stdbool.h>
-#include <inttypes.h>
 
-typedef uint64_t usec_t;
-typedef uint64_t nsec_t;
+#include "time-util.h"
 
 char* path_get_file_name(const char *p) _pure_;
 int path_get_parent(const char *path, char **parent);
diff --git a/src/libudev/time-util.c b/src/libudev/time-util.c
new file mode 100644
index 0000000..f6c24e3
--- /dev/null
+++ b/src/libudev/time-util.c
@@ -0,0 +1,157 @@
+/***
+  This file is part of eudev, forked from systemd.
+
+  Copyright 2010 Lennart Poettering
+
+  systemd is free software; you can redistribute it and/or modify it
+  under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
+  (at your option) any later version.
+
+  systemd is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <time.h>
+
+#include "time-util.h"
+#include "macro.h"
+
+usec_t now(clockid_t clock_id) {
+        struct timespec ts;
+
+        assert_se(clock_gettime(clock_id, &ts) == 0);
+
+        return timespec_load(&ts);
+}
+
+usec_t timespec_load(const struct timespec *ts) {
+        assert(ts);
+
+        if (ts->tv_sec == (time_t) -1 &&
+            ts->tv_nsec == (long) -1)
+                return (usec_t) -1;
+
+        if ((usec_t) ts->tv_sec > (UINT64_MAX - (ts->tv_nsec / NSEC_PER_USEC)) / USEC_PER_SEC)
+                return (usec_t) -1;
+
+        return
+                (usec_t) ts->tv_sec * USEC_PER_SEC +
+                (usec_t) ts->tv_nsec / NSEC_PER_USEC;
+}
+
+char *format_timespan(char *buf, size_t l, usec_t t, usec_t accuracy) {
+        static const struct {
+                const char *suffix;
+                usec_t usec;
+        } table[] = {
+                { "y", USEC_PER_YEAR },
+                { "month", USEC_PER_MONTH },
+                { "w", USEC_PER_WEEK },
+                { "d", USEC_PER_DAY },
+                { "h", USEC_PER_HOUR },
+                { "min", USEC_PER_MINUTE },
+                { "s", USEC_PER_SEC },
+                { "ms", USEC_PER_MSEC },
+                { "us", 1 },
+        };
+
+        unsigned i;
+        char *p = buf;
+        bool something = false;
+
+        assert(buf);
+        assert(l > 0);
+
+        if (t == (usec_t) -1)
+                return NULL;
+
+        if (t <= 0) {
+                snprintf(p, l, "0");
+                p[l-1] = 0;
+                return p;
+        }
+
+        /* The result of this function can be parsed with parse_sec */
+
+        for (i = 0; i < ELEMENTSOF(table); i++) {
+                int k;
+                size_t n;
+                bool done = false;
+                usec_t a, b;
+
+                if (t <= 0)
+                        break;
+
+                if (t < accuracy && something)
+                        break;
+
+                if (t < table[i].usec)
+                        continue;
+
+                if (l <= 1)
+                        break;
+
+                a = t / table[i].usec;
+                b = t % table[i].usec;
+
+                /* Let's see if we should shows this in dot notation */
+                if (t < USEC_PER_MINUTE && b > 0) {
+                        usec_t cc;
+                        int j;
+
+                        j = 0;
+                        for (cc = table[i].usec; cc > 1; cc /= 10)
+                                j++;
+
+                        for (cc = accuracy; cc > 1; cc /= 10) {
+                                b /= 10;
+                                j--;
+                        }
+
+                        if (j > 0) {
+                                k = snprintf(p, l,
+                                             "%s%llu.%0*llu%s",
+                                             p > buf ? " " : "",
+                                             (unsigned long long) a,
+                                             j,
+                                             (unsigned long long) b,
+                                             table[i].suffix);
+
+                                t = 0;
+                                done = true;
+                        }
+                }
+
+                /* No? Then let's show it normally */
+                if (!done) {
+                        k = snprintf(p, l,
+                                     "%s%llu%s",
+                                     p > buf ? " " : "",
+                                     (unsigned long long) a,
+                                     table[i].suffix);
+
+                        t = b;
+                }
+
+                n = MIN((size_t) k, l);
+
+                l -= n;
+                p += n;
+
+                something = true;
+        }
+
+        *p = 0;
+
+        return buf;
+}
+
diff --git a/src/libudev/time-util.h b/src/libudev/time-util.h
new file mode 100644
index 0000000..0f7f696
--- /dev/null
+++ b/src/libudev/time-util.h
@@ -0,0 +1,56 @@
+/***
+  This file is part of eudev, forked from systemd.
+
+  Copyright 2010 Lennart Poettering
+
+  systemd is free software; you can redistribute it and/or modify it
+  under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
+  (at your option) any later version.
+
+  systemd is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#pragma once
+
+#include <inttypes.h>
+
+typedef uint64_t usec_t;
+typedef uint64_t nsec_t;
+
+typedef struct dual_timestamp {
+        usec_t realtime;
+        usec_t monotonic;
+} dual_timestamp;
+
+#define MSEC_PER_SEC  1000ULL
+#define USEC_PER_SEC  1000000ULL
+#define USEC_PER_MSEC 1000ULL
+#define NSEC_PER_SEC  1000000000ULL
+#define NSEC_PER_MSEC 1000000ULL
+#define NSEC_PER_USEC 1000ULL
+
+#define USEC_PER_MINUTE (60ULL*USEC_PER_SEC)
+#define NSEC_PER_MINUTE (60ULL*NSEC_PER_SEC)
+#define USEC_PER_HOUR (60ULL*USEC_PER_MINUTE)
+#define NSEC_PER_HOUR (60ULL*NSEC_PER_MINUTE)
+#define USEC_PER_DAY (24ULL*USEC_PER_HOUR)
+#define NSEC_PER_DAY (24ULL*NSEC_PER_HOUR)
+#define USEC_PER_WEEK (7ULL*USEC_PER_DAY)
+#define NSEC_PER_WEEK (7ULL*NSEC_PER_DAY)
+#define USEC_PER_MONTH (2629800ULL*USEC_PER_SEC)
+#define NSEC_PER_MONTH (2629800ULL*NSEC_PER_SEC)
+#define USEC_PER_YEAR (31557600ULL*USEC_PER_SEC)
+#define NSEC_PER_YEAR (31557600ULL*NSEC_PER_SEC)
+
+#define FORMAT_TIMESPAN_MAX 64
+
+usec_t now(clockid_t clock);
+usec_t timespec_load(const struct timespec *ts);
+char *format_timespan(char *buf, size_t l, usec_t t, usec_t accuracy);
diff --git a/src/libudev/util.c b/src/libudev/util.c
index a0d7cac..4796505 100644
--- a/src/libudev/util.c
+++ b/src/libudev/util.c
@@ -102,136 +102,6 @@ bool streq_ptr(const char *a, const char *b) {
         return false;
 }
 
-usec_t now(clockid_t clock_id) {
-        struct timespec ts;
-
-        assert_se(clock_gettime(clock_id, &ts) == 0);
-
-        return timespec_load(&ts);
-}
-
-usec_t timespec_load(const struct timespec *ts) {
-        assert(ts);
-
-        if (ts->tv_sec == (time_t) -1 &&
-            ts->tv_nsec == (long) -1)
-                return (usec_t) -1;
-
-        if ((usec_t) ts->tv_sec > (UINT64_MAX - (ts->tv_nsec / NSEC_PER_USEC)) / USEC_PER_SEC)
-                return (usec_t) -1;
-
-        return
-                (usec_t) ts->tv_sec * USEC_PER_SEC +
-                (usec_t) ts->tv_nsec / NSEC_PER_USEC;
-}
-
-char *format_timespan(char *buf, size_t l, usec_t t, usec_t accuracy) {
-        static const struct {
-                const char *suffix;
-                usec_t usec;
-        } table[] = {
-                { "y", USEC_PER_YEAR },
-                { "month", USEC_PER_MONTH },
-                { "w", USEC_PER_WEEK },
-                { "d", USEC_PER_DAY },
-                { "h", USEC_PER_HOUR },
-                { "min", USEC_PER_MINUTE },
-                { "s", USEC_PER_SEC },
-                { "ms", USEC_PER_MSEC },
-                { "us", 1 },
-        };
-
-        unsigned i;
-        char *p = buf;
-        bool something = false;
-
-        assert(buf);
-        assert(l > 0);
-
-        if (t == (usec_t) -1)
-                return NULL;
-
-        if (t <= 0) {
-                snprintf(p, l, "0");
-                p[l-1] = 0;
-                return p;
-        }
-
-        /* The result of this function can be parsed with parse_sec */
-
-        for (i = 0; i < ELEMENTSOF(table); i++) {
-                int k;
-                size_t n;
-                bool done = false;
-                usec_t a, b;
-
-                if (t <= 0)
-                        break;
-
-                if (t < accuracy && something)
-                        break;
-
-                if (t < table[i].usec)
-                        continue;
-
-                if (l <= 1)
-                        break;
-
-                a = t / table[i].usec;
-                b = t % table[i].usec;
-
-                /* Let's see if we should shows this in dot notation */
-                if (t < USEC_PER_MINUTE && b > 0) {
-                        usec_t cc;
-                        int j;
-
-                        j = 0;
-                        for (cc = table[i].usec; cc > 1; cc /= 10)
-                                j++;
-
-                        for (cc = accuracy; cc > 1; cc /= 10) {
-                                b /= 10;
-                                j--;
-                        }
-
-                        if (j > 0) {
-                                k = snprintf(p, l,
-                                             "%s%llu.%0*llu%s",
-                                             p > buf ? " " : "",
-                                             (unsigned long long) a,
-                                             j,
-                                             (unsigned long long) b,
-                                             table[i].suffix);
-
-                                t = 0;
-                                done = true;
-                        }
-                }
-
-                /* No? Then let's show it normally */
-                if (!done) {
-                        k = snprintf(p, l,
-                                     "%s%llu%s",
-                                     p > buf ? " " : "",
-                                     (unsigned long long) a,
-                                     table[i].suffix);
-
-                        t = b;
-                }
-
-                n = MIN((size_t) k, l);
-
-                l -= n;
-                p += n;
-
-                something = true;
-        }
-
-        *p = 0;
-
-        return buf;
-}
-
 char* endswith(const char *s, const char *postfix) {
         size_t sl, pl;
 
@@ -826,7 +696,7 @@ int execute_command(const char *command, char *const argv[])
                 } else
                         log_debug("%s exited successfully.", command);
 
-                return si.si_status; 
+                return si.si_status;
 
         }
 }
diff --git a/src/libudev/util.h b/src/libudev/util.h
index 33e9efb..6510237 100644
--- a/src/libudev/util.h
+++ b/src/libudev/util.h
@@ -33,47 +33,12 @@
 
 #include "macro.h"
 
-/* Note: the time definitions are from upstream's
- * src/shared/time-util.h which I have put here
- * for now.  We may need to beak these out later.
- * <blueness@gentoo.org>
- */
-typedef uint64_t usec_t;
-typedef uint64_t nsec_t;
-
-typedef struct dual_timestamp {
-        usec_t realtime;
-        usec_t monotonic;
-} dual_timestamp;
-
 union dirent_storage {
         struct dirent de;
         uint8_t storage[offsetof(struct dirent, d_name) +
                         ((NAME_MAX + 1 + sizeof(long)) & ~(sizeof(long) - 1))];
 };
 
-#define MSEC_PER_SEC  1000ULL
-#define USEC_PER_SEC  1000000ULL
-#define USEC_PER_MSEC 1000ULL
-#define NSEC_PER_SEC  1000000000ULL
-#define NSEC_PER_MSEC 1000000ULL
-#define NSEC_PER_USEC 1000ULL
-
-#define USEC_PER_MINUTE (60ULL*USEC_PER_SEC)
-#define NSEC_PER_MINUTE (60ULL*NSEC_PER_SEC)
-#define USEC_PER_HOUR (60ULL*USEC_PER_MINUTE)
-#define NSEC_PER_HOUR (60ULL*NSEC_PER_MINUTE)
-#define USEC_PER_DAY (24ULL*USEC_PER_HOUR)
-#define NSEC_PER_DAY (24ULL*NSEC_PER_HOUR)
-#define USEC_PER_WEEK (7ULL*USEC_PER_DAY)
-#define NSEC_PER_WEEK (7ULL*NSEC_PER_DAY)
-#define USEC_PER_MONTH (2629800ULL*USEC_PER_SEC)
-#define NSEC_PER_MONTH (2629800ULL*NSEC_PER_SEC)
-#define USEC_PER_YEAR (31557600ULL*USEC_PER_SEC)
-#define NSEC_PER_YEAR (31557600ULL*NSEC_PER_SEC)
-
-#define FORMAT_TIMESPAN_MAX 64
-
 /* What is interpreted as whitespace? */
 #define WHITESPACE " \t\n\r"
 #define NEWLINE    "\n\r"
@@ -93,10 +58,6 @@ union dirent_storage {
 #define ANSI_HIGHLIGHT_OFF "\x1B[0m"
 #define ANSI_ERASE_TO_END_OF_LINE "\x1B[K"
 
-usec_t now(clockid_t clock);
-usec_t timespec_load(const struct timespec *ts);
-char *format_timespan(char *buf, size_t l, usec_t t, usec_t accuracy);
-
 size_t page_size(void);
 #define PAGE_ALIGN(l) ALIGN_TO((l), page_size())
 
-- 
1.7.9.5

