+IOReturn RootDomainUserClient::secureSleepSystem( uint32_t *return_code )
+{
+ return secureSleepSystemOptions(NULL, 0, return_code);
+}
+
+IOReturn RootDomainUserClient::secureSleepSystemOptions(
+ const void *inOptions,
+ IOByteCount inOptionsSize,
+ uint32_t *returnCode)
+{
+
+ int local_priv = 0;
+ int admin_priv = 0;
+ IOReturn ret = kIOReturnNotPrivileged;
+ OSDictionary *unserializedOptions = NULL;
+ OSString *unserializeErrorString = NULL;
+
+ ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeLocalUser);
+ local_priv = (kIOReturnSuccess == ret);
+
+ ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
+ admin_priv = (kIOReturnSuccess == ret);
+
+
+ if (inOptions)
+ {
+ unserializedOptions = OSDynamicCast( OSDictionary,
+ OSUnserializeXML((const char *)inOptions, inOptionsSize, &unserializeErrorString));
+
+ if (!unserializedOptions) {
+ IOLog("IOPMRootDomain SleepSystem unserialization failure: %s\n",
+ unserializeErrorString ? unserializeErrorString->getCStringNoCopy() : "Unknown");
+ }
+ }
+
+ if ( (local_priv || admin_priv) && fOwner )
+ {
+ proc_t p;
+ p = (proc_t)get_bsdtask_info(fOwningTask);
+ if (p) {
+ fOwner->setProperty("SleepRequestedByPID", proc_pid(p), 32);
+ }
+
+ if (unserializedOptions)
+ {
+ // Publish Sleep Options in registry under root_domain
+ fOwner->setProperty( kRootDomainSleepOptionsKey, unserializedOptions);
+
+ *returnCode = fOwner->sleepSystemOptions( unserializedOptions );
+
+ unserializedOptions->release();
+ } else {
+ // No options
+ // Clear any pre-existing options
+ fOwner->removeProperty( kRootDomainSleepOptionsKey );
+
+ *returnCode = fOwner->sleepSystemOptions( NULL );
+ }
+
+ } else {
+ *returnCode = kIOReturnNotPrivileged;
+ }
+
+ return kIOReturnSuccess;
+}
+
+IOReturn RootDomainUserClient::secureSetAggressiveness(
+ unsigned long type,
+ unsigned long newLevel,
+ int *return_code )
+{
+ int local_priv = 0;
+ int admin_priv = 0;
+ IOReturn ret = kIOReturnNotPrivileged;
+
+ ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeLocalUser);
+ local_priv = (kIOReturnSuccess == ret);
+
+ ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
+ admin_priv = (kIOReturnSuccess == ret);
+
+ if((local_priv || admin_priv) && fOwner) {
+ *return_code = fOwner->setAggressiveness(type, newLevel);
+ } else {
+ *return_code = kIOReturnNotPrivileged;
+ }
+ return kIOReturnSuccess;
+}
+
+IOReturn RootDomainUserClient::secureSetMaintenanceWakeCalendar(
+ IOPMCalendarStruct *inCalendar,
+ uint32_t *returnCode)
+{
+ int admin_priv = 0;
+ IOReturn ret = kIOReturnNotPrivileged;
+
+ ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
+ admin_priv = (kIOReturnSuccess == ret);
+
+ if (admin_priv && fOwner) {
+ *returnCode = fOwner->setMaintenanceWakeCalendar(inCalendar);
+ } else {
+ *returnCode = kIOReturnNotPrivileged;
+ }
+ return kIOReturnSuccess;
+}
+
+IOReturn RootDomainUserClient::secureSetUserAssertionLevels(
+ uint32_t assertionBitfield)
+{
+ int admin_priv = 0;
+ IOReturn ret = kIOReturnNotPrivileged;
+
+ ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
+ admin_priv = (kIOReturnSuccess == ret);
+
+ if (admin_priv && fOwner) {
+ ret = fOwner->setPMAssertionUserLevels(assertionBitfield);
+ } else {
+ ret = kIOReturnNotPrivileged;
+ }
+ return kIOReturnSuccess;
+}
+
+IOReturn RootDomainUserClient::secureGetSystemSleepType(
+ uint32_t *outSleepType)
+{
+ int admin_priv = 0;
+ IOReturn ret;
+
+ ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
+ admin_priv = (kIOReturnSuccess == ret);
+
+ if (admin_priv && fOwner) {
+ ret = fOwner->getSystemSleepType(outSleepType);
+ } else {
+ ret = kIOReturnNotPrivileged;
+ }
+ return ret;
+}