// 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 <cctype>
#include <cinttypes>
#include <string>

#include <base/command_line.h>
#include <base/files/file_path.h>
#include <base/logging.h>

#include "p2p/common/constants.h"
#include "p2p/common/util.h"
#include "p2p/http_server/connection_delegate.h"
#include "p2p/http_server/server.h"

using std::string;

using base::FilePath;

static void Usage(FILE* output) {
  fprintf(output,
          "Usage:\n"
          "  p2p-http-server [OPTION..]\n"
          "\n"
          "Options:\n"
          " --help           Show help options\n"
          " --directory=DIR  Directory to serve from (default: .)\n"
          " --port=PORT      TCP port number to listen on (default: 16725)\n"
          " -v=NUMBER        Verbosity level (default: 0)\n"
          "\n");
}

int main(int argc, char* argv[]) {
  int ret = 1;

  base::CommandLine::Init(argc, argv);
  base::CommandLine* cl = base::CommandLine::ForCurrentProcess();

  logging::LoggingSettings logging_settings;
  logging_settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
  logging_settings.lock_log = logging::LOCK_LOG_FILE;
  logging_settings.delete_old = logging::APPEND_TO_OLD_LOG_FILE;
  logging::InitLogging(logging_settings);
  p2p::util::SetupSyslog(p2p::constants::kHttpServerBinaryName,
                         false /* include_pid */);

  LOG(INFO) << p2p::constants::kHttpServerBinaryName << " starting";

  if (cl->HasSwitch("help")) {
    Usage(stdout);
    return 0;
  }

  uint16_t port = p2p::constants::kHttpServerDefaultPort;
  string port_str = cl->GetSwitchValueNative("port");
  if (port_str.size() > 0) {
    char* endp;
    port = strtol(port_str.c_str(), &endp, 0);
    if (*endp != '\0') {
      fprintf(stderr, "Error parsing `%s' as port number\n", port_str.c_str());
      return 1;
    }
  }

  FilePath directory = cl->GetSwitchValuePath("directory");
  if (directory.empty()) {
    directory = FilePath(FilePath::kCurrentDirectory);
  }

  p2p::http_server::Server server(
      directory, port, STDOUT_FILENO,
      p2p::http_server::ConnectionDelegate::Construct);
  LOG(INFO) << "Maximum download rate per connection set to "
            << p2p::constants::kMaxSpeedPerDownload << " bytes/sec";
  server.SetMaxDownloadRate(p2p::constants::kMaxSpeedPerDownload);
  server.Start();

  GMainLoop* loop = g_main_loop_new(NULL, FALSE);

  // TODO(zeuthen): Now that we've opened all the files and sockets
  // that we need, install a seccomp filter to only allow the very
  // limited set of syscalls we need onwards. See
  //
  //  http://outflux.net/teach-seccomp/
  //
  // for more information.
  //
  // This issue is currently tracked in
  //
  //  https://code.google.com/p/chromium/issues/detail?id=243406

  g_main_loop_run(loop);
  g_main_loop_unref(loop);

  server.Stop();

  return ret;
}
