chiark / gitweb /
calendarspec: parse 'quarterly' and 'semi-annually' as shortcuts
authorLennart Poettering <lennart@poettering.net>
Mon, 27 Oct 2014 17:08:46 +0000 (18:08 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 27 Oct 2014 17:09:26 +0000 (18:09 +0100)
man/systemd.time.xml
src/shared/calendarspec.c
src/test/test-calendarspec.c

index 6e7dbc5..f35ccd7 100644 (file)
                 <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
index da920b6..7efcf7b 100644 (file)
@@ -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)
index 21b0024..87e1da1 100644 (file)
@@ -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);