summaryrefslogtreecommitdiffhomepage
path: root/dev/DebuggerKit/src/NeKernelContract.cc
blob: 53017d667bfd57421cefb133ad981438971d2db2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/***
  DebuggerKit
  (C) 2025 Amlal El Mahrouss
  File: NeKernelContract.cc
  Purpose: NeKernel Debugger
*/

#ifdef DK_NEKERNEL_DEBUGGER

/// @author Amlal El Mahrouss
/// @brief Kernel Debugger Protocol

#include <CompilerKit/Defines.h>
#include <DebuggerKit/NeKernelContract.h>
#include <DebuggerKit/Platform.h>
#include <ThirdParty/Dialogs.h>

using namespace DebuggerKit::NeKernel;
using namespace DebuggerKit::NeKernel::Detail;

NeKernelContract::NeKernelContract() = default;

NeKernelContract::~NeKernelContract() = default;

BOOL NeKernelContract::Attach(CompilerKit::STLString path, CompilerKit::STLString argv,
                              ProcessID& pid) noexcept {
  if (path.empty() || argv.empty()) return NO;

  m_socket = ::socket(AF_INET, SOCK_STREAM, 0);

  if (m_socket == -1) return NO;

  struct sockaddr_in server_addr;

  server_addr.sin_family = AF_INET;
  server_addr.sin_port   = htons(kDebugPort);

  if (::inet_pton(AF_INET, argv.c_str(), &server_addr.sin_addr) <= 0) return NO;

  auto ret = (::connect(m_socket, (struct sockaddr*) &server_addr, sizeof(server_addr)) == -1);

  if (ret) return NO;

  CompilerKit::STLString pkt = Detail::kDebugMagic;
  pkt += ";\r";

  ret = ::send(m_socket, pkt.data(), pkt.size(), 0) > 0;
  return ret;
}

BOOL NeKernelContract::BreakAt(CompilerKit::STLString symbol) noexcept {
  CompilerKit::STLString pkt = Detail::kDebugMagic;
  pkt += ";SYM=";
  pkt += symbol;
  pkt += ";\r";

  if (pkt.size() > kDebugCmdLen) return NO;

  auto ret = ::send(m_socket, pkt.data(), pkt.size(), 0) > 0;
  return ret;
}

BOOL NeKernelContract::Break() noexcept {
  CompilerKit::STLString pkt = Detail::kDebugMagic;
  pkt += ";BRK=1;\r";

  auto ret = ::send(m_socket, pkt.data(), pkt.size(), 0) > 0;
  return ret;
}

BOOL NeKernelContract::Continue() noexcept {
  CompilerKit::STLString pkt = Detail::kDebugMagic;
  pkt += ";CONT=1;\r";

  auto ret = ::send(m_socket, pkt.data(), pkt.size(), 0) > 0;
  return ret;
  return NO;
}

BOOL NeKernelContract::Detach() noexcept {
  CompilerKit::STLString pkt = Detail::kDebugMagic;
  pkt += ";DTCH=1;\r";

  auto ret = ::send(m_socket, pkt.data(), pkt.size(), 0) > 0;

  if (ret) ::close(m_socket);

  return ret;
}

#endif  // DK_NEKERNEL_DEBUGGER