| /* |
| * save.c - send new time to the time setter |
| * 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 <errno.h> |
| #include <string.h> |
| #include <sys/time.h> |
| #include <unistd.h> |
| |
| #include <event2/event.h> |
| |
| #include "src/conf.h" |
| #include "src/util.h" |
| #include "src/tlsdate.h" |
| |
| void action_sync_and_save (evutil_socket_t fd, short what, void *arg) |
| { |
| struct state *state = arg; |
| time_t t = state->last_time; |
| ssize_t bytes; |
| verb_debug ("[event:%s] fired", __func__); |
| /* For all non-net sources, don't write to disk by |
| * flagging the time negative. We don't use negative |
| * times and this won't effect shutdown (0) writes. |
| */ |
| if (state->last_sync_type != SYNC_TYPE_NET) |
| t = -t; |
| if (what & EV_READ) |
| { |
| /* EPIPE/EBADF notification */ |
| error ("[event:%s] time setter is gone!", __func__); |
| /* SIGCHLD will handle teardown. */ |
| return; |
| } |
| bytes = IGNORE_EINTR (write (fd, &t, sizeof (t))); |
| if (bytes == -1) |
| { |
| if (errno == EPIPE) |
| { |
| error ("[event:%s] time setter is gone! (EPIPE)", __func__); |
| return; |
| } |
| if (errno == EAGAIN) |
| return; /* Get notified again. */ |
| error ("[event:%s] Unexpected errno %d", __func__, errno); |
| } |
| if (bytes != sizeof (t)) |
| pfatal ("[event:%s] unexpected write to time setter (%d)", |
| __func__, bytes); |
| /* If we're going down and we wrote the time, send a shutdown message. */ |
| if (state->exitting && t) |
| { |
| state->last_time = 0; |
| action_sync_and_save (fd, what, arg); |
| /* TODO(wad) platform->pgrp_kill() ? */ |
| } |
| return; |
| } |