RootDomainUserClient.cpp [plain text]
#include <IOKit/assert.h>
#include <IOKit/IOLib.h>
#include <IOKit/IOBufferMemoryDescriptor.h>
#include "RootDomainUserClient.h"
#include <IOKit/pwr_mgt/IOPMLibDefs.h>
#define super IOUserClient
OSDefineMetaClassAndStructors(RootDomainUserClient, IOUserClient)
bool RootDomainUserClient::initWithTask(task_t owningTask, void *security_id, UInt32)
{
if (!super::init())
return false;
fOwningTask = owningTask;
task_reference (fOwningTask);
return true;
}
bool RootDomainUserClient::start( IOService * provider )
{
assert(OSDynamicCast(IOPMrootDomain, provider));
if(!super::start(provider))
return false;
fOwner = (IOPMrootDomain *)provider;
return true;
}
IOReturn RootDomainUserClient::secureSleepSystem( 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->sleepSystem();
return kIOReturnSuccess;
} else {
*return_code = 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;
}
}
IOReturn RootDomainUserClient::clientClose( void )
{
detach(fOwner);
if(fOwningTask) {
task_deallocate(fOwningTask);
fOwningTask = 0;
}
return kIOReturnSuccess;
}
IOExternalMethod *
RootDomainUserClient::getTargetAndMethodForIndex( IOService ** targetP, UInt32 index )
{
static IOExternalMethod sMethods[] = {
{ 1, (IOMethod)&RootDomainUserClient::secureSetAggressiveness, kIOUCScalarIScalarO, 2, 1
},
{ 0, (IOMethod)&IOPMrootDomain::getAggressiveness, kIOUCScalarIScalarO, 1, 1
},
{ 1, (IOMethod)&RootDomainUserClient::secureSleepSystem, kIOUCScalarIScalarO, 0, 1
},
{ 0, (IOMethod)&IOPMrootDomain::allowPowerChange, kIOUCScalarIScalarO, 1, 0
},
{ 0, (IOMethod)&IOPMrootDomain::cancelPowerChange, kIOUCScalarIScalarO, 1, 0
},
{ 0, (IOMethod)&IOPMrootDomain::shutdownSystem, kIOUCScalarIScalarO, 0, 0
},
{ 0, (IOMethod)&IOPMrootDomain::restartSystem, kIOUCScalarIScalarO, 0, 0
},
{ 1, (IOMethod) &RootDomainUserClient::setPreventative, kIOUCScalarIScalarO, 2, 0
},
};
if(index >= kNumPMMethods)
return NULL;
else {
if (sMethods[index].object)
*targetP = this;
else
*targetP = fOwner;
return &sMethods[index];
}
}
void
RootDomainUserClient::setPreventative(UInt32 on_off, UInt32 types_of_sleep)
{
return;
}