1 //===-- FileAction.cpp ------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include <fcntl.h> 11 12 #include "lldb/Core/Stream.h" 13 #include "lldb/Host/PosixApi.h" 14 #include "lldb/Target/FileAction.h" 15 16 using namespace lldb_private; 17 18 //---------------------------------------------------------------------------- 19 // FileAction member functions 20 //---------------------------------------------------------------------------- 21 22 FileAction::FileAction() 23 : m_action(eFileActionNone), m_fd(-1), m_arg(-1), m_file_spec() {} 24 25 void FileAction::Clear() { 26 m_action = eFileActionNone; 27 m_fd = -1; 28 m_arg = -1; 29 m_file_spec.Clear(); 30 } 31 32 llvm::StringRef FileAction::GetPath() const { return m_file_spec.GetCString(); } 33 34 const FileSpec &FileAction::GetFileSpec() const { return m_file_spec; } 35 36 bool FileAction::Open(int fd, const FileSpec &file_spec, bool read, 37 bool write) { 38 if ((read || write) && fd >= 0 && file_spec) { 39 m_action = eFileActionOpen; 40 m_fd = fd; 41 if (read && write) 42 m_arg = O_NOCTTY | O_CREAT | O_RDWR; 43 else if (read) 44 m_arg = O_NOCTTY | O_RDONLY; 45 else 46 m_arg = O_NOCTTY | O_CREAT | O_WRONLY; 47 m_file_spec = file_spec; 48 return true; 49 } else { 50 Clear(); 51 } 52 return false; 53 } 54 55 bool FileAction::Close(int fd) { 56 Clear(); 57 if (fd >= 0) { 58 m_action = eFileActionClose; 59 m_fd = fd; 60 } 61 return m_fd >= 0; 62 } 63 64 bool FileAction::Duplicate(int fd, int dup_fd) { 65 Clear(); 66 if (fd >= 0 && dup_fd >= 0) { 67 m_action = eFileActionDuplicate; 68 m_fd = fd; 69 m_arg = dup_fd; 70 } 71 return m_fd >= 0; 72 } 73 74 void FileAction::Dump(Stream &stream) const { 75 stream.PutCString("file action: "); 76 switch (m_action) { 77 case eFileActionClose: 78 stream.Printf("close fd %d", m_fd); 79 break; 80 case eFileActionDuplicate: 81 stream.Printf("duplicate fd %d to %d", m_fd, m_arg); 82 break; 83 case eFileActionNone: 84 stream.PutCString("no action"); 85 break; 86 case eFileActionOpen: 87 stream.Printf("open fd %d with '%s', OFLAGS = 0x%x", m_fd, 88 m_file_spec.GetCString(), m_arg); 89 break; 90 } 91 } 92