| /* |
| * run_tlsdate.c - events for running tlsdate |
| * Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "config.h" |
| |
| #include <event2/event.h> |
| |
| #include "src/conf.h" |
| #include "src/dbus.h" |
| #include "src/util.h" |
| #include "src/tlsdate.h" |
| |
| /* TODO(wad) split out backoff logic to make this testable */ |
| void action_run_tlsdate (evutil_socket_t fd, short what, void *arg) |
| { |
| struct state *state = arg; |
| verb_debug ("[event:%s] fired", __func__); |
| if (state->last_sync_type == SYNC_TYPE_NET) |
| { |
| verb ("[event:%s] called, but network time isn't needed", |
| __func__); |
| return; |
| } |
| state->resolving = 0; |
| if (state->running) |
| { |
| /* It's possible that a network or proxy change occurred during a call. If |
| * the call succeeded, it doesn't matter. If the call fails, reissuing |
| * the attempt with the new configuration has a chance of succeeding. To |
| * avoid missing a retry, we decrement the try count and reset the |
| * backoff. |
| */ |
| if (state->tries > 0) |
| { |
| state->tries--; |
| /* TODO(wad) Make a shorter retry constant for this. */ |
| state->backoff = state->opts.wait_between_tries; |
| } |
| info ("[event:%s] requested re-run of tlsdate while tlsdate is running", |
| __func__); |
| return; |
| } |
| /* Enforce maximum retries here instead of in sigchld.c */ |
| if (state->tries < state->opts.max_tries) |
| { |
| state->tries++; |
| } |
| else |
| { |
| state->tries = 0; |
| state->backoff = state->opts.wait_between_tries; |
| error ("[event:%s] tlsdate tried and failed to get the time", __func__); |
| return; |
| } |
| state->running = 1; |
| verb ("[event:%s] attempt %d backoff %d", __func__, |
| state->tries, state->backoff); |
| /* Setup a timeout before killing tlsdate */ |
| trigger_event (state, E_TLSDATE_TIMEOUT, |
| state->opts.subprocess_wait_between_tries); |
| /* Add the response listener event */ |
| trigger_event (state, E_TLSDATE_STATUS, -1); |
| /* Fire off the child process now! */ |
| if (tlsdate (state)) |
| { |
| /* TODO(wad) Should this be fatal? */ |
| error ("[event:%s] tlsdate failed to launch!", __func__); |
| state->running = 0; |
| state->tries = 0; |
| event_del (state->events[E_TLSDATE_TIMEOUT]); |
| return; |
| } |
| } |