1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-22 17:35:35 +03:00

shared/calendarspec: fix formatting of entries which collapse to a star

We canonicalize repeats that cover the whole range: "0:0:0/1" → "0:0:*".  But
we'd also do "0:0:0/1,0" → "0:0:*,0", which we then refuse to parse.  Thus,
first go throug the whole chain, and print a '*' and nothing else if any of the
components covers the whole range.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2022-05-10 11:35:52 +02:00
parent 3aff2ae9d5
commit 8e1e59b9ad
3 changed files with 21 additions and 8 deletions

View File

@ -288,17 +288,24 @@ static void format_weekdays(FILE *f, const CalendarSpec *c) {
}
}
static void format_chain(FILE *f, int space, const CalendarComponent *c, bool usec) {
static bool chain_is_star(const CalendarComponent *c, bool usec) {
/* Return true if the whole chain can be replaced by '*'.
* This happens when the chain is empty or one of the components covers all. */
if (!c)
return true;
if (usec)
for (; c; c = c->next)
if (c->start == 0 && c->stop < 0 && c->repeat == USEC_PER_SEC)
return true;
return false;
}
static void _format_chain(FILE *f, int space, const CalendarComponent *c, bool start, bool usec) {
int d = usec ? (int) USEC_PER_SEC : 1;
assert(f);
if (!c) {
fputc('*', f);
return;
}
if (usec && c->start == 0 && c->stop < 0 && c->repeat == USEC_PER_SEC && !c->next) {
if (start && chain_is_star(c, usec)) {
fputc('*', f);
return;
}
@ -321,10 +328,14 @@ static void format_chain(FILE *f, int space, const CalendarComponent *c, bool us
if (c->next) {
fputc(',', f);
format_chain(f, space, c->next, usec);
_format_chain(f, space, c->next, false, usec);
}
}
static void format_chain(FILE *f, int space, const CalendarComponent *c, bool usec) {
_format_chain(f, space, c, /* start = */ true, usec);
}
int calendar_spec_to_string(const CalendarSpec *c, char **p) {
char *buf = NULL;
size_t sz = 0;

View File

@ -164,6 +164,7 @@ TEST(calendar_spec_one) {
test_one("00:00:01/2,02..03", "*-*-* 00:00:01/2,02..03");
test_one("*:4,30:0..3", "*-*-* *:04,30:00..03");
test_one("*:4,30:0/1", "*-*-* *:04,30:*");
test_one("*:4,30:0/1,3,5", "*-*-* *:04,30:*");
test_one("*-*~1 Utc", "*-*~01 00:00:00 UTC");
test_one("*-*~05,3 ", "*-*~03,05 00:00:00");
test_one("*-*~* 00:00:00", "*-*-* 00:00:00");

View File

@ -0,0 +1 @@
*:4,30:0/01,0