blob: 1b3011cf0261bf73c43716f251d0b662ab34a63c [file] [log] [blame]
// Copyright 2018 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 "shill/net/io_input_handler.h"
#include <string>
#include <unistd.h>
#include <base/bind.h>
#include <base/bind_helpers.h>
#include <base/logging.h>
#include <base/strings/stringprintf.h>
namespace shill {
IOInputHandler::IOInputHandler(int fd,
const InputCallback& input_callback,
const ErrorCallback& error_callback)
: fd_(fd),
input_callback_(input_callback),
error_callback_(error_callback) {}
IOInputHandler::~IOInputHandler() = default;
void IOInputHandler::Start() {
watcher_ = base::FileDescriptorWatcher::WatchReadable(
fd_,
base::BindRepeating(&IOInputHandler::OnReadable, base::Unretained(this)));
LOG_IF(ERROR, !watcher_) << "Failed on watching read";
}
void IOInputHandler::Stop() {
watcher_ = nullptr;
}
void IOInputHandler::OnReadable() {
unsigned char buf[IOHandler::kDataBufferSize];
ssize_t len = read(fd_, buf, sizeof(buf));
if (len < 0) {
std::string condition = base::StringPrintf("File read error: %d", errno);
LOG(ERROR) << condition;
error_callback_.Run(condition);
} else {
InputData input_data(buf, len);
input_callback_.Run(&input_data);
}
}
} // namespace shill