run: check if the specified calendar event is not in the past

Check if calendar event specification passed by --on-calendar runs in
some time in the future. If not, execute the given command immediately
This commit is contained in:
Frantisek Sumsal 2019-04-12 20:57:51 +02:00 committed by Zbigniew Jędrzejewski-Szmek
parent b6411f716c
commit 10434dbdfd

View file

@ -380,13 +380,31 @@ static int parse_argv(int argc, char *argv[]) {
arg_with_timer = true;
break;
case ARG_ON_CALENDAR:
case ARG_ON_CALENDAR: {
_cleanup_(calendar_spec_freep) CalendarSpec *cs = NULL;
usec_t next, curr;
/* Let's make sure the given calendar event is not in the past */
curr = now(CLOCK_REALTIME);
r = calendar_spec_from_string(optarg, &cs);
if (r < 0)
return log_error_errno(r, "Failed to parse calendar event specification");
r = calendar_spec_next_usec(cs, curr, &next);
if (r < 0) {
/* The calendar event is in the past - in such case
* don't add an OnCalendar property and execute
* the command immediately instead */
log_warning("Specified calendar event is in the past, executing immediately");
break;
}
r = add_timer_property("OnCalendar", optarg);
if (r < 0)
return r;
arg_with_timer = true;
break;
}
case ARG_ON_TIMEZONE_CHANGE:
r = add_timer_property("OnTimezoneChange", "yes");