mirror of
https://github.com/AuxXxilium/eudev.git
synced 2024-12-28 06:35:34 +07:00
libudev: Fix redefinition of usec_t and nsec_t.
The type definitions usec_t and nsec_t where 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> Signed-off-by: Anthony G. Basile <blueness@gentoo.org>
This commit is contained in:
parent
a1a5424a62
commit
c4c2658040
@ -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
|
||||
|
||||
|
@ -27,6 +27,7 @@
|
||||
|
||||
#include "libudev.h"
|
||||
#include "macro.h"
|
||||
#include "time-util.h"
|
||||
#include "util.h"
|
||||
#include "mkdir.h"
|
||||
#include "strxcpyx.h"
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "log.h"
|
||||
#include "time-util.h"
|
||||
#include "util.h"
|
||||
#include "missing.h"
|
||||
#include "macro.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);
|
||||
|
157
src/libudev/time-util.c
Normal file
157
src/libudev/time-util.c
Normal file
@ -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;
|
||||
}
|
||||
|
56
src/libudev/time-util.h
Normal file
56
src/libudev/time-util.h
Normal file
@ -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);
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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())
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user