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/Host/PosixApi.h"
13 #include "lldb/Target/FileAction.h"
14 #include "lldb/Utility/Stream.h"
15
16 using namespace lldb_private;
17
18 //----------------------------------------------------------------------------
19 // FileAction member functions
20 //----------------------------------------------------------------------------
21
FileAction()22 FileAction::FileAction()
23 : m_action(eFileActionNone), m_fd(-1), m_arg(-1), m_file_spec() {}
24
Clear()25 void FileAction::Clear() {
26 m_action = eFileActionNone;
27 m_fd = -1;
28 m_arg = -1;
29 m_file_spec.Clear();
30 }
31
GetPath() const32 llvm::StringRef FileAction::GetPath() const { return m_file_spec.GetCString(); }
33
GetFileSpec() const34 const FileSpec &FileAction::GetFileSpec() const { return m_file_spec; }
35
Open(int fd,const FileSpec & file_spec,bool read,bool write)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
Close(int fd)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
Duplicate(int fd,int dup_fd)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
Dump(Stream & stream) const74 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