// Copyright (c) 2013 The Chromium OS 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 <stdio.h>
#include <unistd.h>

#include <base/bind.h>
#include <base/logging.h>
#include <brillo/process/process.h>
#include <brillo/syslog_logging.h>

#include "lorgnette/daemon.h"

namespace {

const char* kLoggerCommand = "/usr/bin/logger";

}  // namespace

// Always logs to the syslog and logs to stderr if
// we are connected to a tty.
void SetupLogging(const char* daemon_name) {
  brillo::InitLog(brillo::kLogToSyslog | brillo::kLogToStderrIfTty |
                  brillo::kLogHeader);

  if (!isatty(STDIN_FILENO)) {
    brillo::ProcessImpl logger;
    logger.AddArg(kLoggerCommand);
    logger.AddArg("--priority");
    logger.AddArg("daemon.err");
    logger.AddArg("--tag");
    logger.AddArg(daemon_name);

    logger.RedirectUsingPipe(STDIN_FILENO, true);
    if (!logger.Start()) {
      LOG(ERROR) << "Failed to start logger child.";
      return;
    }

    // Note that we don't set O_CLOEXEC here. This means that stderr
    // from any child processes will, by default, be logged to syslog.
    if (dup2(logger.GetPipe(STDIN_FILENO), fileno(stderr)) != fileno(stderr)) {
      PLOG(ERROR) << "Failed to redirect stderr to syslog";
      return;
    }

    logger.Release();
  }
}

void OnStartup(const char* daemon_name) {
  SetupLogging(daemon_name);
}

int main(int argc, char** argv) {
  lorgnette::Daemon daemon(base::Bind(&OnStartup, argv[0]));

  daemon.Run();

  return 0;
}
