80 lines
1.6 KiB
C++
80 lines
1.6 KiB
C++
/*
|
|
Copyright (c) 2017 Microsoft Corporation. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
|
|
Author: Leonardo de Moura & Jared Roesch
|
|
*/
|
|
#include <string>
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include <iomanip>
|
|
#include <utility>
|
|
#include <stdio.h>
|
|
|
|
#if defined(LEAN_WINDOWS) && !defined(LEAN_CYGWIN)
|
|
#include <windows.h>
|
|
#include <tchar.h>
|
|
#include <strsafe.h>
|
|
#else
|
|
#include <sys/wait.h>
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
#include "library/process.h"
|
|
#include "library/handle.h"
|
|
#include "util/buffer.h"
|
|
#include "library/pipe.h"
|
|
|
|
|
|
namespace lean {
|
|
|
|
void handle::write(std::string const & buf) {
|
|
auto sz = buf.size();
|
|
if (fwrite(buf.data(), 1, sz, m_file) != sz) {
|
|
std::cout << "write_error: " << errno << std::endl;
|
|
clearerr(m_file);
|
|
throw handle_exception("write failed");
|
|
}
|
|
}
|
|
|
|
void handle::flush() {
|
|
if (fflush(m_file) != 0) {
|
|
clearerr(m_file);
|
|
throw handle_exception("flush failed");
|
|
}
|
|
}
|
|
|
|
handle::~handle() {
|
|
if (m_file && m_file != stdin &&
|
|
m_file != stderr && m_file != stdout) {
|
|
fclose(m_file);
|
|
m_file = nullptr;
|
|
}
|
|
}
|
|
|
|
bool handle::is_stdin() {
|
|
return m_file == stdin;
|
|
}
|
|
|
|
bool handle::is_stdout() {
|
|
return m_file == stdout;
|
|
}
|
|
|
|
bool handle::is_stderr() {
|
|
return m_file == stderr;
|
|
}
|
|
|
|
void handle::close() {
|
|
if (m_file == nullptr) {
|
|
// double close
|
|
} else if (fclose(m_file) == 0) {
|
|
m_file = nullptr;
|
|
} else {
|
|
clearerr(m_file);
|
|
throw handle_exception("close failed");
|
|
}
|
|
}
|
|
|
|
bool handle::is_closed() { return !m_file; }
|
|
|
|
}
|