/*
* 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;
}