blob: 4846d57b308ab5a2520e5eab4fdb9914b2193966 [file]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/mac/login_util.h"
#include <dlfcn.h>
#include <optional>
// NB: Other possible useful functions for the future (if needed):
//
// OSStatus SACLockScreenImmediate()
// Boolean SACScreenSaverIsRunning()
// OSStatus SACScreenSaverStartNow()
// OSStatus SACScreenSaverStopNow()
namespace base::mac {
namespace {
void* GetLoginFramework() {
static void* login_framework = dlopen(
"/System/Library/PrivateFrameworks/login.framework/Versions/A/login",
RTLD_LAZY | RTLD_LOCAL);
return login_framework;
}
} // namespace
std::optional<bool> IsScreenLockEnabled() {
if (!GetLoginFramework()) {
return std::nullopt;
}
using SACScreenLockEnabledType = Boolean (*)();
static auto func = reinterpret_cast<SACScreenLockEnabledType>(
dlsym(GetLoginFramework(), "SACScreenLockEnabled"));
if (!func) {
return std::nullopt;
}
return func();
}
std::optional<OSStatus> SwitchToLoginWindow() {
if (!GetLoginFramework()) {
return std::nullopt;
}
using SACSwitchToLoginWindowType = OSStatus (*)();
static auto func = reinterpret_cast<SACSwitchToLoginWindowType>(
dlsym(GetLoginFramework(), "SACSwitchToLoginWindow"));
if (!func) {
return std::nullopt;
}
return func();
}
} // namespace base::mac