X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fcalendarspec.c;h=7efcf7b371870d09e3891a83b018bd28de10c55f;hb=1caa12d0a8a818d5f2545aab809b3fdfec73871d;hp=13f70d8e72edaae269b5fddc5f56142a5b7563e9;hpb=8333c77edf8fd1654cd96f3f6ee0f078dd64b58b;p=elogind.git diff --git a/src/shared/calendarspec.c b/src/shared/calendarspec.c index 13f70d8e7..7efcf7b37 100644 --- a/src/shared/calendarspec.c +++ b/src/shared/calendarspec.c @@ -35,7 +35,9 @@ static void free_chain(CalendarComponent *c) { } void calendar_spec_free(CalendarSpec *c) { - assert(c); + + if (!c) + return; free_chain(c->year); free_chain(c->month); @@ -133,7 +135,7 @@ int calendar_spec_normalize(CalendarSpec *c) { return 0; } -static bool chain_valid(CalendarComponent *c, int from, int to) { +_pure_ static bool chain_valid(CalendarComponent *c, int from, int to) { if (!c) return true; @@ -149,7 +151,7 @@ static bool chain_valid(CalendarComponent *c, int from, int to) { return true; } -bool calendar_spec_valid(CalendarSpec *c) { +_pure_ bool calendar_spec_valid(CalendarSpec *c) { assert(c); if (c->weekdays_bits > 127) @@ -472,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; @@ -653,7 +655,12 @@ int calendar_spec_from_string(const char *p, CalendarSpec **spec) { if (!c) return -ENOMEM; - if (strcaseeq(p, "hourly")) { + if (strcaseeq(p, "minutely")) { + r = const_chain(0, &c->second); + if (r < 0) + goto fail; + + } else if (strcaseeq(p, "hourly")) { r = const_chain(0, &c->minute); if (r < 0) goto fail; @@ -686,6 +693,26 @@ 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 */ ) { + + r = const_chain(1, &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, "weekly")) { c->weekdays_bits = 1; @@ -700,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) @@ -921,7 +999,6 @@ int calendar_spec_next_usec(const CalendarSpec *spec, usec_t usec, usec_t *next) if (t == (time_t) -1) return -EINVAL; - *next = (usec_t) t * USEC_PER_SEC; return 0; }