]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
run: check if the specified calendar event is not in the past
authorFrantisek Sumsal <frantisek@sumsal.cz>
Fri, 12 Apr 2019 18:57:51 +0000 (20:57 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 25 Apr 2019 09:27:40 +0000 (11:27 +0200)
Check if calendar event specification passed by --on-calendar runs in
some time in the future. If not, execute the given command immediately

src/run/run.c

index 56aa9aaee64d54f8e43ddb29ff211b77ad5f6aa9..8a981775758af3fc2663579e91477c001dd3d80a 100644 (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");