diff options
-rw-r--r-- | man/systemd.time.xml | 13 | ||||
-rw-r--r-- | src/shared/calendarspec.c | 59 | ||||
-rw-r--r-- | src/test/test-calendarspec.c | 4 |
3 files changed, 68 insertions, 8 deletions
diff --git a/man/systemd.time.xml b/man/systemd.time.xml index 6e7dbc50d5..f35ccd7f17 100644 --- a/man/systemd.time.xml +++ b/man/systemd.time.xml @@ -245,15 +245,18 @@ <literal>minutely</literal>, <literal>hourly</literal>, <literal>daily</literal>, <literal>monthly</literal>, <literal>weekly</literal>, - and <literal>yearly</literal> or - <literal>annually</literal> may be used as calendar - events which refer to + <literal>yearly</literal>, + <literal>quarterly</literal>, + <literal>semiannually</literal> may be used as + calendar events which refer to <literal>*-*-* *:*:00</literal>, <literal>*-*-* *:00:00</literal>, <literal>*-*-* 00:00:00</literal>, <literal>*-*-01 00:00:00</literal>, - <literal>Mon *-*-* 00:00:00</literal>, and - <literal>*-01-01 00:00:00</literal> respectively. + <literal>Mon *-*-* 00:00:00</literal>, + <literal>*-01-01 00:00:00</literal>, + <literal>*-01,04,07,10-01 00:00:0</literal> and + <literal>*-01,07-01 00:00:00</literal> respectively. </para> <para>Examples for valid timestamps and their diff --git a/src/shared/calendarspec.c b/src/shared/calendarspec.c index da920b6dd9..7efcf7b371 100644 --- a/src/shared/calendarspec.c +++ b/src/shared/calendarspec.c @@ -474,7 +474,7 @@ static int const_chain(int value, CalendarComponent **c) { cc->value = value; cc->repeat = 0; - cc->next = NULL; + cc->next = *c; *c = cc; @@ -693,8 +693,10 @@ int calendar_spec_from_string(const char *p, CalendarSpec **spec) { if (r < 0) goto fail; - } else if (strcaseeq(p, "annually") || strcaseeq(p, "yearly") - || strcaseeq(p, "anually") /* backwards compatibility */ ) { + } else if (strcaseeq(p, "annually") || + strcaseeq(p, "yearly") || + strcaseeq(p, "anually") /* backwards compatibility */ ) { + r = const_chain(1, &c->month); if (r < 0) goto fail; @@ -725,6 +727,57 @@ int calendar_spec_from_string(const char *p, CalendarSpec **spec) { if (r < 0) goto fail; + } else if (strcaseeq(p, "quarterly")) { + + r = const_chain(1, &c->month); + if (r < 0) + goto fail; + r = const_chain(4, &c->month); + if (r < 0) + goto fail; + r = const_chain(7, &c->month); + if (r < 0) + goto fail; + r = const_chain(10, &c->month); + if (r < 0) + goto fail; + r = const_chain(1, &c->day); + if (r < 0) + goto fail; + r = const_chain(0, &c->hour); + if (r < 0) + goto fail; + r = const_chain(0, &c->minute); + if (r < 0) + goto fail; + r = const_chain(0, &c->second); + if (r < 0) + goto fail; + + } else if (strcaseeq(p, "biannually") || + strcaseeq(p, "bi-annually") || + strcaseeq(p, "semiannually") || + strcaseeq(p, "semi-annually")) { + + r = const_chain(1, &c->month); + if (r < 0) + goto fail; + r = const_chain(7, &c->month); + if (r < 0) + goto fail; + r = const_chain(1, &c->day); + if (r < 0) + goto fail; + r = const_chain(0, &c->hour); + if (r < 0) + goto fail; + r = const_chain(0, &c->minute); + if (r < 0) + goto fail; + r = const_chain(0, &c->second); + if (r < 0) + goto fail; + } else { r = parse_weekdays(&p, c); if (r < 0) diff --git a/src/test/test-calendarspec.c b/src/test/test-calendarspec.c index 21b0024388..87e1da1258 100644 --- a/src/test/test-calendarspec.c +++ b/src/test/test-calendarspec.c @@ -77,6 +77,10 @@ int main(int argc, char* argv[]) { test_one("daily", "*-*-* 00:00:00"); test_one("monthly", "*-*-01 00:00:00"); test_one("weekly", "Mon *-*-* 00:00:00"); + test_one("minutely", "*-*-* *:*:00"); + test_one("quarterly", "*-01,04,07,10-01 00:00:00"); + test_one("semi-annually", "*-01,07-01 00:00:00"); + test_one("annually", "*-01-01 00:00:00"); test_one("*:2/3", "*-*-* *:02/3:00"); assert_se(calendar_spec_from_string("test", &c) < 0); |