15ffd83dbSDimitry Andric //===-- StreamFile.cpp ----------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "lldb/Core/StreamFile.h"
100b57cec5SDimitry Andric #include "lldb/Host/FileSystem.h"
119dba64beSDimitry Andric #include "lldb/Utility/Log.h"
120b57cec5SDimitry Andric 
13*5f7ddb14SDimitry Andric #include <cstdio>
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric using namespace lldb;
160b57cec5SDimitry Andric using namespace lldb_private;
170b57cec5SDimitry Andric 
StreamFile(uint32_t flags,uint32_t addr_size,ByteOrder byte_order)180b57cec5SDimitry Andric StreamFile::StreamFile(uint32_t flags, uint32_t addr_size, ByteOrder byte_order)
199dba64beSDimitry Andric     : Stream(flags, addr_size, byte_order) {
209dba64beSDimitry Andric   m_file_sp = std::make_shared<File>();
210b57cec5SDimitry Andric }
220b57cec5SDimitry Andric 
StreamFile(int fd,bool transfer_ownership)239dba64beSDimitry Andric StreamFile::StreamFile(int fd, bool transfer_ownership) : Stream() {
249dba64beSDimitry Andric   m_file_sp =
259dba64beSDimitry Andric       std::make_shared<NativeFile>(fd, File::eOpenOptionWrite, transfer_ownership);
269dba64beSDimitry Andric }
270b57cec5SDimitry Andric 
StreamFile(FILE * fh,bool transfer_ownership)289dba64beSDimitry Andric StreamFile::StreamFile(FILE *fh, bool transfer_ownership) : Stream() {
299dba64beSDimitry Andric   m_file_sp = std::make_shared<NativeFile>(fh, transfer_ownership);
309dba64beSDimitry Andric }
319dba64beSDimitry Andric 
StreamFile(const char * path,File::OpenOptions options,uint32_t permissions)329dba64beSDimitry Andric StreamFile::StreamFile(const char *path, File::OpenOptions options,
339dba64beSDimitry Andric                        uint32_t permissions)
349dba64beSDimitry Andric     : Stream() {
359dba64beSDimitry Andric   auto file = FileSystem::Instance().Open(FileSpec(path), options, permissions);
369dba64beSDimitry Andric   if (file)
379dba64beSDimitry Andric     m_file_sp = std::move(file.get());
389dba64beSDimitry Andric   else {
399dba64beSDimitry Andric     // TODO refactor this so the error gets popagated up instead of logged here.
409dba64beSDimitry Andric     LLDB_LOG_ERROR(GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST), file.takeError(),
419dba64beSDimitry Andric                    "Cannot open {1}: {0}", path);
429dba64beSDimitry Andric     m_file_sp = std::make_shared<File>();
439dba64beSDimitry Andric   }
440b57cec5SDimitry Andric }
450b57cec5SDimitry Andric 
46*5f7ddb14SDimitry Andric StreamFile::~StreamFile() = default;
470b57cec5SDimitry Andric 
Flush()489dba64beSDimitry Andric void StreamFile::Flush() { m_file_sp->Flush(); }
490b57cec5SDimitry Andric 
WriteImpl(const void * s,size_t length)500b57cec5SDimitry Andric size_t StreamFile::WriteImpl(const void *s, size_t length) {
519dba64beSDimitry Andric   m_file_sp->Write(s, length);
520b57cec5SDimitry Andric   return length;
530b57cec5SDimitry Andric }
54