1*6777b538SAndroid Build Coastguard Worker // Copyright 2024 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "base/mac/login_util.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include <dlfcn.h> 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker #include <optional> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker // NB: Other possible useful functions for the future (if needed): 12*6777b538SAndroid Build Coastguard Worker // 13*6777b538SAndroid Build Coastguard Worker // OSStatus SACLockScreenImmediate() 14*6777b538SAndroid Build Coastguard Worker // Boolean SACScreenSaverIsRunning() 15*6777b538SAndroid Build Coastguard Worker // OSStatus SACScreenSaverStartNow() 16*6777b538SAndroid Build Coastguard Worker // OSStatus SACScreenSaverStopNow() 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker namespace base::mac { 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker namespace { 21*6777b538SAndroid Build Coastguard Worker GetLoginFramework()22*6777b538SAndroid Build Coastguard Workervoid* GetLoginFramework() { 23*6777b538SAndroid Build Coastguard Worker static void* login_framework = dlopen( 24*6777b538SAndroid Build Coastguard Worker "/System/Library/PrivateFrameworks/login.framework/Versions/A/login", 25*6777b538SAndroid Build Coastguard Worker RTLD_LAZY | RTLD_LOCAL); 26*6777b538SAndroid Build Coastguard Worker return login_framework; 27*6777b538SAndroid Build Coastguard Worker } 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker } // namespace 30*6777b538SAndroid Build Coastguard Worker IsScreenLockEnabled()31*6777b538SAndroid Build Coastguard Workerstd::optional<bool> IsScreenLockEnabled() { 32*6777b538SAndroid Build Coastguard Worker if (!GetLoginFramework()) { 33*6777b538SAndroid Build Coastguard Worker return std::nullopt; 34*6777b538SAndroid Build Coastguard Worker } 35*6777b538SAndroid Build Coastguard Worker using SACScreenLockEnabledType = Boolean (*)(); 36*6777b538SAndroid Build Coastguard Worker static auto func = reinterpret_cast<SACScreenLockEnabledType>( 37*6777b538SAndroid Build Coastguard Worker dlsym(GetLoginFramework(), "SACScreenLockEnabled")); 38*6777b538SAndroid Build Coastguard Worker if (!func) { 39*6777b538SAndroid Build Coastguard Worker return std::nullopt; 40*6777b538SAndroid Build Coastguard Worker } 41*6777b538SAndroid Build Coastguard Worker return func(); 42*6777b538SAndroid Build Coastguard Worker } 43*6777b538SAndroid Build Coastguard Worker SwitchToLoginWindow()44*6777b538SAndroid Build Coastguard Workerstd::optional<OSStatus> SwitchToLoginWindow() { 45*6777b538SAndroid Build Coastguard Worker if (!GetLoginFramework()) { 46*6777b538SAndroid Build Coastguard Worker return std::nullopt; 47*6777b538SAndroid Build Coastguard Worker } 48*6777b538SAndroid Build Coastguard Worker using SACSwitchToLoginWindowType = OSStatus (*)(); 49*6777b538SAndroid Build Coastguard Worker static auto func = reinterpret_cast<SACSwitchToLoginWindowType>( 50*6777b538SAndroid Build Coastguard Worker dlsym(GetLoginFramework(), "SACSwitchToLoginWindow")); 51*6777b538SAndroid Build Coastguard Worker if (!func) { 52*6777b538SAndroid Build Coastguard Worker return std::nullopt; 53*6777b538SAndroid Build Coastguard Worker } 54*6777b538SAndroid Build Coastguard Worker return func(); 55*6777b538SAndroid Build Coastguard Worker } 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker } // namespace base::mac 58