+IOReturn RootDomainUserClient::secureSleepSystem( uint32_t *return_code )
+{
+ IOByteCount return_code_size = 1;
+
+ return secureSleepSystemOptions( NULL, // inOptions
+ (void *)return_code, // returnCode
+ (void *)0, // inSize
+ (void *)&return_code_size, // returnSize
+ NULL, NULL);
+}
+
+IOReturn RootDomainUserClient::secureSleepSystemOptions(
+ void * p1, void * p2, void * p3,
+ void * p4, void * p5, void * p6 )
+{
+ void *inOptions = (void *)p1;
+ uint32_t *returnCode = (uint32_t *)p2;
+ IOByteCount inOptionsSize = (IOByteCount)p3;
+ IOByteCount *returnCodeSize = (IOByteCount *)p4;
+
+ 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);
+
+ *returnCodeSize = sizeof(uint32_t);
+
+ if (inOptions)
+ {
+ unserializedOptions = OSDynamicCast( OSDictionary,
+ OSUnserializeXML((const char *)inOptions, &unserializeErrorString));
+
+ if (!unserializedOptions) {
+ IOLog("IOPMRootDomain SleepSystem unserialization failure: %s\n",
+ unserializeErrorString ? unserializeErrorString->getCStringNoCopy() : "Unknown");
+ }
+ }
+
+ if ( (local_priv || admin_priv)
+ && fOwner )
+ {
+ 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);
+ return kIOReturnSuccess;
+ } else {
+ *return_code = kIOReturnNotPrivileged;
+ return kIOReturnSuccess;
+ }
+
+}
+