#include <sys/types.h>
#include <sys/sysctl.h>
#include <TargetConditionals.h>
#include "Loading.h" // For internalInstall()
#include "BootArgs.h"
namespace dyld3 {
bool BootArgs::contains(const char* arg)
{
#if TARGET_OS_SIMULATOR
return false;
#else
if ( !internalInstall() )
return false;
size_t len;
if ( sysctlbyname("kern.bootargs", NULL, &len, NULL, 0) != 0 )
return false;
char bootArgsBuffer[len];
if ( sysctlbyname("kern.bootargs", bootArgsBuffer, &len, NULL, 0) != 0 )
return false;
return (strstr(bootArgsBuffer, arg) != nullptr);
#endif
}
uint64_t BootArgs::_flags = 0;
bool BootArgs::forceCustomerCache() {
return (_flags & kForceCustomerCacheMask);
}
bool BootArgs::forceDyld2() {
if (_flags & kForceDyld3CacheMask) { return false; }
if (_flags & kForceDyld2CacheMask) { return true; }
if (contains("force_dyld2=1")) { return true; }
return false;
}
bool BootArgs::forceDyld3() {
return ((_flags & kForceDyld3CacheMask) || contains("force_dyld3=1"));
}
bool BootArgs::enableDyldTestMode() {
return (_flags & kDyldTestModeMask);
}
bool BootArgs::enableCompactImageInfo() {
return (_flags & kEnableCompactImageInfoMask);
}
void BootArgs::setFlags(uint64_t flags) {
#if TARGET_IPHONE_SIMULATOR
return;
#else
if ( !internalInstall() )
return;
_flags = flags;
#endif
}
};