// Copyright (c) 2012 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 "dev_random.h"

#include <assert.h>
#include <stdio.h>
#include <string.h>

DevRandomHandler::DevRandomHandler(
    int (*get_random_bytes)(void* buf, size_t count, size_t* nread))
    : ref_(1), get_random_bytes_(get_random_bytes) {
  assert(get_random_bytes);
}

DevRandomHandler::~DevRandomHandler() {
  assert(!ref_);
}

void DevRandomHandler::addref() {
  ++ref_;
}

void DevRandomHandler::release() {
  if (!--ref_)
    delete this;
}

FileStream* DevRandomHandler::open(int fd, const char* pathname, int oflag,
                                   int* err) {
  return new DevRandom(fd, oflag, get_random_bytes_);
}

int DevRandomHandler::stat(const char* pathname, nacl_abi_stat* out) {
  memset(out, 0, sizeof(nacl_abi_stat));
  return 0;
}

//------------------------------------------------------------------------------

DevRandom::DevRandom(int fd, int oflag,
    int (*get_random_bytes)(void* buf, size_t count, size_t* nread))
  : fd_(fd), oflag_(oflag), ref_(1), get_random_bytes_(get_random_bytes) {
}

DevRandom::~DevRandom() {
  assert(!ref_);
}

void DevRandom::addref() {
  ++ref_;
}

void DevRandom::release() {
  if (!--ref_)
    delete this;
}

FileStream* DevRandom::dup(int fd) {
  return new DevRandom(fd, oflag_, get_random_bytes_);
}

void DevRandom::close() {
  fd_ = 0;
}

int DevRandom::read(char* buf, size_t count, size_t* nread) {
  return get_random_bytes_(buf, count, nread);
}

int DevRandom::write(const char* buf, size_t count, size_t* nwrote) {
  return EPERM;
}

int DevRandom::fstat(nacl_abi_stat* out) {
  memset(out, 0, sizeof(nacl_abi_stat));
  // openssl uses st_ino and st_dev to distinguish random sources and doesn't
  // expect 0 there.
  out->nacl_abi_st_ino = fd_;
  out->nacl_abi_st_dev = fd_;
  return 0;
}

int DevRandom::fcntl(int cmd, va_list ap) {
  if (cmd == F_GETFL) {
    return oflag_;
  } else if (cmd == F_SETFL) {
    oflag_ = va_arg(ap, long);
    return 0;
  } else {
    return -1;
  }
}
