]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/monotime.h
zebra, lib: fix the ZEBRA_INTERFACE_VRF_UPDATE zapi message
[mirror_frr.git] / lib / monotime.h
index ad44bf511a2c6c558df784fcc7b935dfd60dc171..00b9400462e2f6c8b6e49c29ae6e1099fd80854c 100644 (file)
 
 #ifndef TIMESPEC_TO_TIMEVAL
 /* should be in sys/time.h on BSD & Linux libcs */
-#define TIMESPEC_TO_TIMEVAL(tv, ts) do {        \
-        (tv)->tv_sec = (ts)->tv_sec;            \
-        (tv)->tv_usec = (ts)->tv_nsec / 1000;   \
-        } while (0)
+#define TIMESPEC_TO_TIMEVAL(tv, ts)                                            \
+       do {                                                                   \
+               (tv)->tv_sec = (ts)->tv_sec;                                   \
+               (tv)->tv_usec = (ts)->tv_nsec / 1000;                          \
+       } while (0)
 #endif
 #ifndef TIMEVAL_TO_TIMESPEC
 /* should be in sys/time.h on BSD & Linux libcs */
-#define TIMEVAL_TO_TIMESPEC(tv, ts) do {        \
-        (ts)->tv_sec = (tv)->tv_sec;            \
-        (ts)->tv_nsec = (tv)->tv_usec * 1000;   \
-        } while (0)
+#define TIMEVAL_TO_TIMESPEC(tv, ts)                                            \
+       do {                                                                   \
+               (ts)->tv_sec = (tv)->tv_sec;                                   \
+               (ts)->tv_nsec = (tv)->tv_usec * 1000;                          \
+       } while (0)
 #endif
 
 static inline time_t monotime(struct timeval *tvo)
 {
-        struct timespec ts;
+       struct timespec ts;
 
-        clock_gettime(CLOCK_MONOTONIC, &ts);
-        if (tvo) {
-                TIMESPEC_TO_TIMEVAL(tvo, &ts);
-        }
-        return ts.tv_sec;
+       clock_gettime(CLOCK_MONOTONIC, &ts);
+       if (tvo) {
+               TIMESPEC_TO_TIMEVAL(tvo, &ts);
+       }
+       return ts.tv_sec;
 }
 
+#define ONE_DAY_SECOND 60*60*24
+#define ONE_WEEK_SECOND ONE_DAY_SECOND*7
+#define ONE_YEAR_SECOND ONE_DAY_SECOND*365
+
 /* the following two return microseconds, not time_t!
  *
  * also, they're negative forms of each other, but having both makes the
  * code more readable
  */
 static inline int64_t monotime_since(const struct timeval *ref,
-                                     struct timeval *out)
+                                    struct timeval *out)
 {
-        struct timeval tv;
-        monotime(&tv);
-        timersub(&tv, ref, &tv);
-        if (out)
-                *out = tv;
-        return (int64_t)tv.tv_sec * 1000000LL + tv.tv_usec;
+       struct timeval tv;
+       monotime(&tv);
+       timersub(&tv, ref, &tv);
+       if (out)
+               *out = tv;
+       return (int64_t)tv.tv_sec * 1000000LL + tv.tv_usec;
 }
 
 static inline int64_t monotime_until(const struct timeval *ref,
-                                     struct timeval *out)
+                                    struct timeval *out)
+{
+       struct timeval tv;
+       monotime(&tv);
+       timersub(ref, &tv, &tv);
+       if (out)
+               *out = tv;
+       return (int64_t)tv.tv_sec * 1000000LL + tv.tv_usec;
+}
+
+static inline char *time_to_string(time_t ts)
 {
-        struct timeval tv;
-        monotime(&tv);
-        timersub(ref, &tv, &tv);
-        if (out)
-                *out = tv;
-        return (int64_t)tv.tv_sec * 1000000LL + tv.tv_usec;
+       struct timeval tv;
+       time_t tbuf;
+
+       monotime(&tv);
+       tbuf = time(NULL) - (tv.tv_sec - ts);
+
+       return ctime(&tbuf);
 }
 
 #endif /* _FRR_MONOTIME_H */