1351290Sdim//===-- FileAction.cpp ------------------------------------------*- C++ -*-===//
2351290Sdim//
3351290Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4351290Sdim// See https://llvm.org/LICENSE.txt for license information.
5351290Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6351290Sdim//
7351290Sdim//===----------------------------------------------------------------------===//
8351290Sdim
9351290Sdim#include <fcntl.h>
10351290Sdim
11351290Sdim#include "lldb/Host/FileAction.h"
12351290Sdim#include "lldb/Host/PosixApi.h"
13351290Sdim#include "lldb/Utility/Stream.h"
14351290Sdim
15351290Sdimusing namespace lldb_private;
16351290Sdim
17351290Sdim// FileAction member functions
18351290Sdim
19351290SdimFileAction::FileAction()
20351290Sdim    : m_action(eFileActionNone), m_fd(-1), m_arg(-1), m_file_spec() {}
21351290Sdim
22351290Sdimvoid FileAction::Clear() {
23351290Sdim  m_action = eFileActionNone;
24351290Sdim  m_fd = -1;
25351290Sdim  m_arg = -1;
26351290Sdim  m_file_spec.Clear();
27351290Sdim}
28351290Sdim
29351290Sdimllvm::StringRef FileAction::GetPath() const { return m_file_spec.GetCString(); }
30351290Sdim
31351290Sdimconst FileSpec &FileAction::GetFileSpec() const { return m_file_spec; }
32351290Sdim
33351290Sdimbool FileAction::Open(int fd, const FileSpec &file_spec, bool read,
34351290Sdim                      bool write) {
35351290Sdim  if ((read || write) && fd >= 0 && file_spec) {
36351290Sdim    m_action = eFileActionOpen;
37351290Sdim    m_fd = fd;
38351290Sdim    if (read && write)
39351290Sdim      m_arg = O_NOCTTY | O_CREAT | O_RDWR;
40351290Sdim    else if (read)
41351290Sdim      m_arg = O_NOCTTY | O_RDONLY;
42351290Sdim    else
43351290Sdim      m_arg = O_NOCTTY | O_CREAT | O_WRONLY;
44351290Sdim    m_file_spec = file_spec;
45351290Sdim    return true;
46351290Sdim  } else {
47351290Sdim    Clear();
48351290Sdim  }
49351290Sdim  return false;
50351290Sdim}
51351290Sdim
52351290Sdimbool FileAction::Close(int fd) {
53351290Sdim  Clear();
54351290Sdim  if (fd >= 0) {
55351290Sdim    m_action = eFileActionClose;
56351290Sdim    m_fd = fd;
57351290Sdim  }
58351290Sdim  return m_fd >= 0;
59351290Sdim}
60351290Sdim
61351290Sdimbool FileAction::Duplicate(int fd, int dup_fd) {
62351290Sdim  Clear();
63351290Sdim  if (fd >= 0 && dup_fd >= 0) {
64351290Sdim    m_action = eFileActionDuplicate;
65351290Sdim    m_fd = fd;
66351290Sdim    m_arg = dup_fd;
67351290Sdim  }
68351290Sdim  return m_fd >= 0;
69351290Sdim}
70351290Sdim
71351290Sdimvoid FileAction::Dump(Stream &stream) const {
72351290Sdim  stream.PutCString("file action: ");
73351290Sdim  switch (m_action) {
74351290Sdim  case eFileActionClose:
75351290Sdim    stream.Printf("close fd %d", m_fd);
76351290Sdim    break;
77351290Sdim  case eFileActionDuplicate:
78351290Sdim    stream.Printf("duplicate fd %d to %d", m_fd, m_arg);
79351290Sdim    break;
80351290Sdim  case eFileActionNone:
81351290Sdim    stream.PutCString("no action");
82351290Sdim    break;
83351290Sdim  case eFileActionOpen:
84351290Sdim    stream.Printf("open fd %d with '%s', OFLAGS = 0x%x", m_fd,
85351290Sdim                  m_file_spec.GetCString(), m_arg);
86351290Sdim    break;
87351290Sdim  }
88351290Sdim}
89