X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Fcalendarspec.c;h=69b742723295c5df91c03464fd70593d6bd97612;hp=cc680779b52dd3e113fbb9ebf776b307050ae43b;hb=6b01f1d3911bd7c7eadbb8a3b4375bd3ac05c98f;hpb=b43d1d01eabe2cbbf393e8f56b76e182c6069c4c diff --git a/src/shared/calendarspec.c b/src/shared/calendarspec.c index cc680779b..69b742723 100644 --- a/src/shared/calendarspec.c +++ b/src/shared/calendarspec.c @@ -133,7 +133,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 +149,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) @@ -391,7 +391,7 @@ static int prepend_component(const char **p, CalendarComponent **c) { errno = 0; value = strtoul(*p, &e, 10); - if (errno != 0) + if (errno > 0) return -errno; if (e == *p) return -EINVAL; @@ -400,7 +400,7 @@ static int prepend_component(const char **p, CalendarComponent **c) { if (*e == '/') { repeat = strtoul(e+1, &ee, 10); - if (errno != 0) + if (errno > 0) return -errno; if (ee == e+1) return -EINVAL; @@ -686,6 +686,23 @@ int calendar_spec_from_string(const char *p, CalendarSpec **spec) { if (r < 0) goto fail; + } else if (strcaseeq(p, "anually") || strcaseeq(p, "yearly")) { + 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; @@ -921,7 +938,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; }