15ffd83dbSDimitry Andric //===-- FileAction.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 <fcntl.h>
100b57cec5SDimitry Andric
110b57cec5SDimitry Andric #include "lldb/Host/FileAction.h"
120b57cec5SDimitry Andric #include "lldb/Host/PosixApi.h"
130b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
140b57cec5SDimitry Andric
150b57cec5SDimitry Andric using namespace lldb_private;
160b57cec5SDimitry Andric
170b57cec5SDimitry Andric // FileAction member functions
180b57cec5SDimitry Andric
FileAction()19fe6060f1SDimitry Andric FileAction::FileAction() : m_file_spec() {}
200b57cec5SDimitry Andric
Clear()210b57cec5SDimitry Andric void FileAction::Clear() {
220b57cec5SDimitry Andric m_action = eFileActionNone;
230b57cec5SDimitry Andric m_fd = -1;
240b57cec5SDimitry Andric m_arg = -1;
250b57cec5SDimitry Andric m_file_spec.Clear();
260b57cec5SDimitry Andric }
270b57cec5SDimitry Andric
GetPath() const28*bdd1243dSDimitry Andric llvm::StringRef FileAction::GetPath() const {
29*bdd1243dSDimitry Andric return m_file_spec.GetPathAsConstString().AsCString();
30*bdd1243dSDimitry Andric }
310b57cec5SDimitry Andric
GetFileSpec() const320b57cec5SDimitry Andric const FileSpec &FileAction::GetFileSpec() const { return m_file_spec; }
330b57cec5SDimitry Andric
Open(int fd,const FileSpec & file_spec,bool read,bool write)340b57cec5SDimitry Andric bool FileAction::Open(int fd, const FileSpec &file_spec, bool read,
350b57cec5SDimitry Andric bool write) {
360b57cec5SDimitry Andric if ((read || write) && fd >= 0 && file_spec) {
370b57cec5SDimitry Andric m_action = eFileActionOpen;
380b57cec5SDimitry Andric m_fd = fd;
390b57cec5SDimitry Andric if (read && write)
400b57cec5SDimitry Andric m_arg = O_NOCTTY | O_CREAT | O_RDWR;
410b57cec5SDimitry Andric else if (read)
420b57cec5SDimitry Andric m_arg = O_NOCTTY | O_RDONLY;
430b57cec5SDimitry Andric else
440b57cec5SDimitry Andric m_arg = O_NOCTTY | O_CREAT | O_WRONLY;
450b57cec5SDimitry Andric m_file_spec = file_spec;
460b57cec5SDimitry Andric return true;
470b57cec5SDimitry Andric } else {
480b57cec5SDimitry Andric Clear();
490b57cec5SDimitry Andric }
500b57cec5SDimitry Andric return false;
510b57cec5SDimitry Andric }
520b57cec5SDimitry Andric
Close(int fd)530b57cec5SDimitry Andric bool FileAction::Close(int fd) {
540b57cec5SDimitry Andric Clear();
550b57cec5SDimitry Andric if (fd >= 0) {
560b57cec5SDimitry Andric m_action = eFileActionClose;
570b57cec5SDimitry Andric m_fd = fd;
580b57cec5SDimitry Andric }
590b57cec5SDimitry Andric return m_fd >= 0;
600b57cec5SDimitry Andric }
610b57cec5SDimitry Andric
Duplicate(int fd,int dup_fd)620b57cec5SDimitry Andric bool FileAction::Duplicate(int fd, int dup_fd) {
630b57cec5SDimitry Andric Clear();
640b57cec5SDimitry Andric if (fd >= 0 && dup_fd >= 0) {
650b57cec5SDimitry Andric m_action = eFileActionDuplicate;
660b57cec5SDimitry Andric m_fd = fd;
670b57cec5SDimitry Andric m_arg = dup_fd;
680b57cec5SDimitry Andric }
690b57cec5SDimitry Andric return m_fd >= 0;
700b57cec5SDimitry Andric }
710b57cec5SDimitry Andric
Dump(Stream & stream) const720b57cec5SDimitry Andric void FileAction::Dump(Stream &stream) const {
730b57cec5SDimitry Andric stream.PutCString("file action: ");
740b57cec5SDimitry Andric switch (m_action) {
750b57cec5SDimitry Andric case eFileActionClose:
760b57cec5SDimitry Andric stream.Printf("close fd %d", m_fd);
770b57cec5SDimitry Andric break;
780b57cec5SDimitry Andric case eFileActionDuplicate:
790b57cec5SDimitry Andric stream.Printf("duplicate fd %d to %d", m_fd, m_arg);
800b57cec5SDimitry Andric break;
810b57cec5SDimitry Andric case eFileActionNone:
820b57cec5SDimitry Andric stream.PutCString("no action");
830b57cec5SDimitry Andric break;
840b57cec5SDimitry Andric case eFileActionOpen:
850b57cec5SDimitry Andric stream.Printf("open fd %d with '%s', OFLAGS = 0x%x", m_fd,
86*bdd1243dSDimitry Andric m_file_spec.GetPath().c_str(), m_arg);
870b57cec5SDimitry Andric break;
880b57cec5SDimitry Andric }
890b57cec5SDimitry Andric }
90