// 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_null.h"

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

DevNullHandler::DevNullHandler() : ref_(1) {
}

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

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

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

FileStream* DevNullHandler::open(int fd, const char* pathname, int oflag,
                                 int* err) {
  return new DevNull(fd, oflag);
}

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

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

DevNull::DevNull(int fd, int oflag)
  : fd_(fd), oflag_(oflag), ref_(1) {
}

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

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

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

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

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

int DevNull::read(char* buf, size_t count, size_t* nread) {
  *nread = 0;
  return 0;
}

int DevNull::write(const char* buf, size_t count, size_t* nwrote) {
  *nwrote = count;
  return 0;
}

int DevNull::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;
  }
}
