// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "flutter/testing/debugger_detection.h"

#include "flutter/fml/build_config.h"
#include "flutter/fml/logging.h"

#if OS_MACOSX
#include <assert.h>
#include <stdbool.h>
#include <sys/sysctl.h>
#include <sys/types.h>
#include <unistd.h>
#endif  // OS_MACOSX

#if OS_WIN
#include <windows.h>
#endif  // OS_WIN

namespace flutter {
namespace testing {

DebuggerStatus GetDebuggerStatus() {
#if OS_MACOSX
  // From Technical Q&A QA1361 Detecting the Debugger
  // https://developer.apple.com/library/archive/qa/qa1361/_index.html
  int management_info_base[4];
  struct kinfo_proc info;
  size_t size;

  // Initialize the flags so that, if sysctl fails for some bizarre
  // reason, we get a predictable result.
  info.kp_proc.p_flag = 0;

  // Initialize management_info_base, which tells sysctl the info we want, in
  // this case we're looking for information about a specific process ID.
  management_info_base[0] = CTL_KERN;
  management_info_base[1] = KERN_PROC;
  management_info_base[2] = KERN_PROC_PID;
  management_info_base[3] = getpid();

  // Call sysctl.

  size = sizeof(info);
  auto status =
      ::sysctl(management_info_base,
               sizeof(management_info_base) / sizeof(*management_info_base),
               &info, &size, NULL, 0);
  FML_CHECK(status == 0);

  // We're being debugged if the P_TRACED flag is set.
  return ((info.kp_proc.p_flag & P_TRACED) != 0) ? DebuggerStatus::kAttached
                                                 : DebuggerStatus::kDontKnow;

#elif OS_WIN
  return ::IsDebuggerPresent() ? DebuggerStatus::kAttached
                               : DebuggerStatus::kDontKnow;

#else
  return DebuggerStatus::kDontKnow;
#endif
}  // namespace testing

}  // namespace testing
}  // namespace flutter
