const OSSymbol * gIOConsoleSessionAuditIDKey;
const OSSymbol * gIOConsoleUsersSeedKey;
const OSSymbol * gIOConsoleSessionOnConsoleKey;
+const OSSymbol * gIOConsoleSessionLoginDoneKey;
const OSSymbol * gIOConsoleSessionSecureInputPIDKey;
const OSSymbol * gIOConsoleSessionScreenLockedTimeKey;
gIOConsoleUsersSeedKey = OSSymbol::withCStringNoCopy(kIOConsoleUsersSeedKey);
gIOConsoleSessionOnConsoleKey = OSSymbol::withCStringNoCopy(kIOConsoleSessionOnConsoleKey);
+ gIOConsoleSessionLoginDoneKey = OSSymbol::withCStringNoCopy(kIOConsoleSessionLoginDoneKey);
gIOConsoleSessionSecureInputPIDKey = OSSymbol::withCStringNoCopy(kIOConsoleSessionSecureInputPIDKey);
gIOConsoleSessionScreenLockedTimeKey = OSSymbol::withCStringNoCopy(kIOConsoleSessionScreenLockedTimeKey);
gIOConsoleLockCallout = thread_call_allocate(&IOService::consoleLockTimer, NULL);
+ IORegistryEntry::getRegistryRoot()->setProperty(gIOConsoleLockedKey, kOSBooleanTrue);
+
assert( gIOServiceBusyLock && gJobs && gJobsLock && gIOConsoleUsersLock
&& gIOConsoleLockCallout && (err == KERN_SUCCESS) );
IORegistryEntry * regEntry;
OSObject * locked = kOSBooleanFalse;
uint32_t idx;
+ bool loggedIn;
bool publish;
OSDictionary * user;
static IOMessage sSystemPower;
{
sSystemPower = systemMessage;
}
+ loggedIn = false;
if (consoleUsers)
{
OSNumber * num = 0;
for (idx = 0;
- (!num) && (user = OSDynamicCast(OSDictionary, consoleUsers->getObject(idx)));
+ (user = OSDynamicCast(OSDictionary, consoleUsers->getObject(idx)));
idx++)
{
- num = OSDynamicCast(OSNumber, user->getObject(gIOConsoleSessionScreenLockedTimeKey));
+ loggedIn |= ((kOSBooleanTrue == user->getObject(gIOConsoleSessionOnConsoleKey))
+ && (kOSBooleanTrue == user->getObject(gIOConsoleSessionLoginDoneKey)));
+ if (!num)
+ {
+ num = OSDynamicCast(OSNumber, user->getObject(gIOConsoleSessionScreenLockedTimeKey));
+ }
}
gIOConsoleLockTime = num ? num->unsigned32BitValue() : 0;
}
- if (gIOConsoleLockTime)
+ if (!loggedIn
+ || (kIOMessageSystemWillSleep == sSystemPower)
+ || (kIOMessageSystemPagingOff == sSystemPower))
{
- if (kIOMessageSystemWillSleep == sSystemPower)
- locked = kOSBooleanTrue;
+ locked = kOSBooleanTrue;
+ }
+ else if (gIOConsoleLockTime)
+ {
+ clock_sec_t now;
+ clock_usec_t microsecs;
+
+ clock_get_calendar_microtime(&now, µsecs);
+ if (gIOConsoleLockTime > now)
+ {
+ AbsoluteTime deadline;
+ clock_interval_to_deadline(gIOConsoleLockTime - now, kSecondScale, &deadline);
+ thread_call_enter_delayed(gIOConsoleLockCallout, deadline);
+ }
else
{
- clock_sec_t now;
- clock_usec_t microsecs;
-
- clock_get_calendar_microtime(&now, µsecs);
- if (gIOConsoleLockTime > now)
- {
- AbsoluteTime deadline;
- clock_interval_to_deadline(gIOConsoleLockTime - now, kSecondScale, &deadline);
- thread_call_enter_delayed(gIOConsoleLockCallout, deadline);
- }
- else
- {
- locked = kOSBooleanTrue;
- }
+ locked = kOSBooleanTrue;
}
}