return CFBooleanGetValue(static_cast<CFBooleanRef>(boolean)) ? "on" : "off";
}
+bool SynchronizePrefs() {
+ bool rv = CFPreferencesSynchronize(kPrefDomain, kCFPreferencesAnyUser,
+ kCFPreferencesCurrentHost);
+ if (!rv) {
+ ERROR("Failed to CFPreferencesSynchronize");
+ }
+ return rv;
+}
+
CFTypeRef GetUserPropertyValue() {
return CFPreferencesCopyValue(kPrefEnabled, kPrefDomain,
kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
io_iterator_t CreateIOServiceIterator() {
CFMutableDictionaryRef matching_dict = IOServiceMatching("AppleIRController");
io_iterator_t iterator;
- kern_return_t kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matching_dict, &iterator);
+ kern_return_t kr = IOServiceGetMatchingServices(
+ kIOMasterPortDefault, matching_dict, &iterator);
if (kr != KERN_SUCCESS) {
ERROR("Failed to IOServiceGetMatchingServices: 0x%x", kr);
return 0;
}
int HandleRead() {
+ if (!SynchronizePrefs())
+ return EXIT_FAILURE;
+
CFTypeRef user_prop = GetUserPropertyValue();
printf("Userspace property value: %s\n", GetBooleanDescription(user_prop));
}
int HandleWrite(bool enable) {
- return EXIT_SUCCESS;
+ const CFBooleanRef enabled_value = enable ? kCFBooleanTrue : kCFBooleanFalse;
+
+ CFPreferencesSetValue(kPrefEnabled, enabled_value, kPrefDomain,
+ kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
+ if (!SynchronizePrefs())
+ return EXIT_FAILURE;
+
+ io_iterator_t iterator = CreateIOServiceIterator();
+ io_object_t service;
+ while ((service = IOIteratorNext(iterator))) {
+ io_name_t name;
+ kern_return_t kr = IORegistryEntryGetName(service, name);
+ if (kr != KERN_SUCCESS) {
+ ERROR("Failed to IORegistryEntryGetName: 0x%x", kr);
+ continue;
+ }
+
+ LOG("Setting property for %s to %d", name, enable);
+
+ kr = IORegistryEntrySetCFProperty(service, kPrefEnabled, enabled_value);
+ if (kr != KERN_SUCCESS) {
+ ERROR("Failed to IORegistryEntrySetCFProperty: 0x%x", kr);
+ continue;
+ }
+ }
+
+ return HandleRead();
}
int main(int argc, char* argv[]) {
if (argc == 1) {
return HandleRead();
} else if (argc == 2) {
- if (strcmp("on", argv[1])) {
+ if (strcmp("on", argv[1]) == 0) {
return HandleWrite(true);
- } else if (strcmp("off", argv[1])) {
+ } else if (strcmp("off", argv[1]) == 0) {
return HandleWrite(false);
}
}