From ad77a7b2e8f696ecc3589b1b665430016ac3e9a7 Mon Sep 17 00:00:00 2001 From: elvis Date: Tue, 4 Nov 2025 20:50:54 +0100 Subject: [PATCH] Fixes for modern macos --- smc-command/Makefile | 6 +- smc-command/smc.c | 654 +++++++++++++++++++++---------------------- 2 files changed, 328 insertions(+), 332 deletions(-) diff --git a/smc-command/Makefile b/smc-command/Makefile index 9d532d8..3991d9a 100644 --- a/smc-command/Makefile +++ b/smc-command/Makefile @@ -1,5 +1,5 @@ -CC = gcc -CFLAGS = -mmacosx-version-min=10.4 -Wall -g -framework IOKit +CC = clang +CFLAGS = -Wall -g -framework IOKit CPPFLAGS = -DCMD_TOOL_BUILD all: smc @@ -11,4 +11,4 @@ smc.o: smc.h smc.c $(CC) $(CPPFLAGS) -c smc.c clean: - -rm -f smc smc.o + @-rm -f smc smc.o diff --git a/smc-command/smc.c b/smc-command/smc.c index 0e03339..d47b6e7 100755 --- a/smc-command/smc.c +++ b/smc-command/smc.c @@ -25,6 +25,7 @@ #include #include "smc.h" #include +#include // Cache the keyInfo to lower the energy impact of SMCReadKey() / SMCReadKey2() #define KEY_INFO_CACHE_SIZE 100 @@ -34,7 +35,7 @@ struct { } g_keyInfoCache[KEY_INFO_CACHE_SIZE]; int g_keyInfoCacheCount = 0; -OSSpinLock g_keyInfoSpinLock = 0; +os_unfair_lock g_keyInfoSpinLock = OS_UNFAIR_LOCK_INIT; kern_return_t SMCCall2(int index, SMCKeyData_t *inputStructure, SMCKeyData_t *outputStructure, io_connect_t conn); @@ -47,10 +48,10 @@ UInt32 _strtoul(char *str, int size, int base) for (i = 0; i < size; i++) { - if (base == 16) - total += str[i] << (size - 1 - i) * 8; - else - total += ((unsigned char) (str[i]) << (size - 1 - i) * 8); + if (base == 16) + total += str[i] << (size - 1 - i) * 8; + else + total += ((unsigned char) (str[i]) << (size - 1 - i) * 8); } return total; } @@ -59,27 +60,27 @@ void _ultostr(char *str, UInt32 val) { str[0] = '\0'; sprintf(str, "%c%c%c%c", - (unsigned int) val >> 24, - (unsigned int) val >> 16, - (unsigned int) val >> 8, - (unsigned int) val); + (unsigned int) val >> 24, + (unsigned int) val >> 16, + (unsigned int) val >> 8, + (unsigned int) val); } float _strtof(unsigned char *str, int size, int e) { float total = 0; int i; - + for (i = 0; i < size; i++) { - if (i == (size - 1)) - total += (str[i] & 0xff) >> e; - else - total += str[i] << (size - 1 - i) * (8 - e); + if (i == (size - 1)) + total += (str[i] & 0xff) >> e; + else + total += str[i] << (size - 1 - i) * (8 - e); } - + total += (str[size-1] & 0x03) * 0.25; - + return total; } @@ -212,7 +213,7 @@ void printBytesHex(SMCVal_t val) printf("(bytes"); for (i = 0; i < val.dataSize; i++) - printf(" %02x", (unsigned char) val.bytes[i]); + printf(" %02x", (unsigned char) val.bytes[i]); printf(")\n"); } @@ -221,64 +222,62 @@ void printVal(SMCVal_t val) printf(" %-4s [%-4s] ", val.key, val.dataType); if (val.dataSize > 0) { - if ((strcmp(val.dataType, DATATYPE_UINT8) == 0) || - (strcmp(val.dataType, DATATYPE_UINT16) == 0) || - (strcmp(val.dataType, DATATYPE_UINT32) == 0)) - printUInt(val); - else if (strcmp(val.dataType, DATATYPE_FLT) == 0 && val.dataSize == 4) - printFLT(val); - else if (strcmp(val.dataType, DATATYPE_FP1F) == 0 && val.dataSize == 2) - printFP1F(val); - else if (strcmp(val.dataType, DATATYPE_FP4C) == 0 && val.dataSize == 2) - printFP4C(val); - else if (strcmp(val.dataType, DATATYPE_FP5B) == 0 && val.dataSize == 2) - printFP5B(val); - else if (strcmp(val.dataType, DATATYPE_FP6A) == 0 && val.dataSize == 2) - printFP6A(val); - else if (strcmp(val.dataType, DATATYPE_FP79) == 0 && val.dataSize == 2) - printFP79(val); - else if (strcmp(val.dataType, DATATYPE_FP88) == 0 && val.dataSize == 2) - printFP88(val); - else if (strcmp(val.dataType, DATATYPE_FPA6) == 0 && val.dataSize == 2) - printFPA6(val); - else if (strcmp(val.dataType, DATATYPE_FPC4) == 0 && val.dataSize == 2) - printFPC4(val); - else if (strcmp(val.dataType, DATATYPE_FPE2) == 0 && val.dataSize == 2) - printFPE2(val); - else if (strcmp(val.dataType, DATATYPE_SP1E) == 0 && val.dataSize == 2) - printSP1E(val); - else if (strcmp(val.dataType, DATATYPE_SP3C) == 0 && val.dataSize == 2) - printSP3C(val); - else if (strcmp(val.dataType, DATATYPE_SP4B) == 0 && val.dataSize == 2) - printSP4B(val); - else if (strcmp(val.dataType, DATATYPE_SP5A) == 0 && val.dataSize == 2) - printSP5A(val); - else if (strcmp(val.dataType, DATATYPE_SP69) == 0 && val.dataSize == 2) - printSP69(val); - else if (strcmp(val.dataType, DATATYPE_SP78) == 0 && val.dataSize == 2) - printSP78(val); - else if (strcmp(val.dataType, DATATYPE_SP87) == 0 && val.dataSize == 2) - printSP87(val); - else if (strcmp(val.dataType, DATATYPE_SP96) == 0 && val.dataSize == 2) - printSP96(val); - else if (strcmp(val.dataType, DATATYPE_SPB4) == 0 && val.dataSize == 2) - printSPB4(val); - else if (strcmp(val.dataType, DATATYPE_SPF0) == 0 && val.dataSize == 2) - printSPF0(val); - else if (strcmp(val.dataType, DATATYPE_SI8) == 0 && val.dataSize == 1) - printSI8(val); - else if (strcmp(val.dataType, DATATYPE_SI16) == 0 && val.dataSize == 2) - printSI16(val); - else if (strcmp(val.dataType, DATATYPE_PWM) == 0 && val.dataSize == 2) - printPWM(val); - else if (strcmp(val.dataType, DATATYPE_FLT) == 0 && val.dataSize == 4) - printFLT(val); + if ((strcmp(val.dataType, DATATYPE_UINT8) == 0) || + (strcmp(val.dataType, DATATYPE_UINT16) == 0) || + (strcmp(val.dataType, DATATYPE_UINT32) == 0)) + printUInt(val); + else if (strcmp(val.dataType, DATATYPE_FLT) == 0 && val.dataSize == 4) + printFLT(val); + else if (strcmp(val.dataType, DATATYPE_FP1F) == 0 && val.dataSize == 2) + printFP1F(val); + else if (strcmp(val.dataType, DATATYPE_FP4C) == 0 && val.dataSize == 2) + printFP4C(val); + else if (strcmp(val.dataType, DATATYPE_FP5B) == 0 && val.dataSize == 2) + printFP5B(val); + else if (strcmp(val.dataType, DATATYPE_FP6A) == 0 && val.dataSize == 2) + printFP6A(val); + else if (strcmp(val.dataType, DATATYPE_FP79) == 0 && val.dataSize == 2) + printFP79(val); + else if (strcmp(val.dataType, DATATYPE_FP88) == 0 && val.dataSize == 2) + printFP88(val); + else if (strcmp(val.dataType, DATATYPE_FPA6) == 0 && val.dataSize == 2) + printFPA6(val); + else if (strcmp(val.dataType, DATATYPE_FPC4) == 0 && val.dataSize == 2) + printFPC4(val); + else if (strcmp(val.dataType, DATATYPE_FPE2) == 0 && val.dataSize == 2) + printFPE2(val); + else if (strcmp(val.dataType, DATATYPE_SP1E) == 0 && val.dataSize == 2) + printSP1E(val); + else if (strcmp(val.dataType, DATATYPE_SP3C) == 0 && val.dataSize == 2) + printSP3C(val); + else if (strcmp(val.dataType, DATATYPE_SP4B) == 0 && val.dataSize == 2) + printSP4B(val); + else if (strcmp(val.dataType, DATATYPE_SP5A) == 0 && val.dataSize == 2) + printSP5A(val); + else if (strcmp(val.dataType, DATATYPE_SP69) == 0 && val.dataSize == 2) + printSP69(val); + else if (strcmp(val.dataType, DATATYPE_SP78) == 0 && val.dataSize == 2) + printSP78(val); + else if (strcmp(val.dataType, DATATYPE_SP87) == 0 && val.dataSize == 2) + printSP87(val); + else if (strcmp(val.dataType, DATATYPE_SP96) == 0 && val.dataSize == 2) + printSP96(val); + else if (strcmp(val.dataType, DATATYPE_SPB4) == 0 && val.dataSize == 2) + printSPB4(val); + else if (strcmp(val.dataType, DATATYPE_SPF0) == 0 && val.dataSize == 2) + printSPF0(val); + else if (strcmp(val.dataType, DATATYPE_SI8) == 0 && val.dataSize == 1) + printSI8(val); + else if (strcmp(val.dataType, DATATYPE_SI16) == 0 && val.dataSize == 2) + printSI16(val); + else if (strcmp(val.dataType, DATATYPE_PWM) == 0 && val.dataSize == 2) + printPWM(val); + else if (strcmp(val.dataType, DATATYPE_FLT) == 0 && val.dataSize == 4) + printFLT(val); - printBytesHex(val); - } - else - { - printf("no data\n"); + printBytesHex(val); + } else { + printf("no data\n"); } } @@ -290,33 +289,33 @@ kern_return_t SMCOpen(io_connect_t *conn) mach_port_t masterPort; io_iterator_t iterator; io_object_t device; - - IOMasterPort(MACH_PORT_NULL, &masterPort); - + + IOMainPort(MACH_PORT_NULL, &masterPort); + CFMutableDictionaryRef matchingDictionary = IOServiceMatching("AppleSMC"); result = IOServiceGetMatchingServices(masterPort, matchingDictionary, &iterator); if (result != kIOReturnSuccess) { - printf("Error: IOServiceGetMatchingServices() = %08x\n", result); - return 1; + printf("Error: IOServiceGetMatchingServices() = %08x\n", result); + return 1; } - + device = IOIteratorNext(iterator); IOObjectRelease(iterator); if (device == 0) { - printf("Error: no SMC found\n"); - return 1; + printf("Error: no SMC found\n"); + return 1; } - + result = IOServiceOpen(device, mach_task_self(), 0, conn); IOObjectRelease(device); if (result != kIOReturnSuccess) { - printf("Error: IOServiceOpen() = %08x\n", result); - return 1; + printf("Error: IOServiceOpen() = %08x\n", result); + return 1; } - + return kIOReturnSuccess; } @@ -331,7 +330,7 @@ kern_return_t SMCCall2(int index, SMCKeyData_t *inputStructure, SMCKeyData_t *ou size_t structureOutputSize; structureInputSize = sizeof(SMCKeyData_t); structureOutputSize = sizeof(SMCKeyData_t); - + return IOConnectCallStructMethod(conn, index, inputStructure, structureInputSize, outputStructure, &structureOutputSize); } @@ -342,42 +341,42 @@ kern_return_t SMCGetKeyInfo(UInt32 key, SMCKeyData_keyInfo_t* keyInfo, io_connec SMCKeyData_t outputStructure; kern_return_t result = kIOReturnSuccess; int i = 0; - - OSSpinLockLock(&g_keyInfoSpinLock); - + + os_unfair_lock_lock(&g_keyInfoSpinLock); + for (; i < g_keyInfoCacheCount; ++i) { - if (key == g_keyInfoCache[i].key) - { - *keyInfo = g_keyInfoCache[i].keyInfo; - break; - } + if (key == g_keyInfoCache[i].key) + { + *keyInfo = g_keyInfoCache[i].keyInfo; + break; + } } - + if (i == g_keyInfoCacheCount) { - // Not in cache, must look it up. - memset(&inputStructure, 0, sizeof(inputStructure)); - memset(&outputStructure, 0, sizeof(outputStructure)); - - inputStructure.key = key; - inputStructure.data8 = SMC_CMD_READ_KEYINFO; - - result = SMCCall2(KERNEL_INDEX_SMC, &inputStructure, &outputStructure, conn); - if (result == kIOReturnSuccess) - { - *keyInfo = outputStructure.keyInfo; - if (g_keyInfoCacheCount < KEY_INFO_CACHE_SIZE) - { - g_keyInfoCache[g_keyInfoCacheCount].key = key; - g_keyInfoCache[g_keyInfoCacheCount].keyInfo = outputStructure.keyInfo; - ++g_keyInfoCacheCount; - } - } + // Not in cache, must look it up. + memset(&inputStructure, 0, sizeof(inputStructure)); + memset(&outputStructure, 0, sizeof(outputStructure)); + + inputStructure.key = key; + inputStructure.data8 = SMC_CMD_READ_KEYINFO; + + result = SMCCall2(KERNEL_INDEX_SMC, &inputStructure, &outputStructure, conn); + if (result == kIOReturnSuccess) + { + *keyInfo = outputStructure.keyInfo; + if (g_keyInfoCacheCount < KEY_INFO_CACHE_SIZE) + { + g_keyInfoCache[g_keyInfoCacheCount].key = key; + g_keyInfoCache[g_keyInfoCacheCount].keyInfo = outputStructure.keyInfo; + ++g_keyInfoCacheCount; + } + } } - - OSSpinLockUnlock(&g_keyInfoSpinLock); - + + os_unfair_lock_unlock(&g_keyInfoSpinLock); + return result; } @@ -386,33 +385,33 @@ kern_return_t SMCReadKey2(UInt32Char_t key, SMCVal_t *val,io_connect_t conn) kern_return_t result; SMCKeyData_t inputStructure; SMCKeyData_t outputStructure; - + memset(&inputStructure, 0, sizeof(SMCKeyData_t)); memset(&outputStructure, 0, sizeof(SMCKeyData_t)); memset(val, 0, sizeof(SMCVal_t)); - + inputStructure.key = _strtoul(key, 4, 16); - sprintf(val->key, key); - + sprintf(val->key, "%s", key); + result = SMCGetKeyInfo(inputStructure.key, &outputStructure.keyInfo, conn); if (result != kIOReturnSuccess) { - return result; + return result; } - + val->dataSize = outputStructure.keyInfo.dataSize; _ultostr(val->dataType, outputStructure.keyInfo.dataType); inputStructure.keyInfo.dataSize = val->dataSize; inputStructure.data8 = SMC_CMD_READ_BYTES; - + result = SMCCall2(KERNEL_INDEX_SMC, &inputStructure, &outputStructure,conn); if (result != kIOReturnSuccess) { - return result; + return result; } - + memcpy(val->bytes, outputStructure.bytes, sizeof(outputStructure.bytes)); - + return kIOReturnSuccess; } @@ -445,27 +444,27 @@ kern_return_t SMCWriteKey2(SMCVal_t writeVal, io_connect_t conn) kern_return_t result; SMCKeyData_t inputStructure; SMCKeyData_t outputStructure; - + SMCVal_t readVal; - + result = SMCReadKey2(writeVal.key, &readVal,conn); if (result != kIOReturnSuccess) - return result; - + return result; + if (readVal.dataSize != writeVal.dataSize) - return kIOReturnError; - + return kIOReturnError; + memset(&inputStructure, 0, sizeof(SMCKeyData_t)); memset(&outputStructure, 0, sizeof(SMCKeyData_t)); - + inputStructure.key = _strtoul(writeVal.key, 4, 16); inputStructure.data8 = SMC_CMD_WRITE_BYTES; inputStructure.keyInfo.dataSize = writeVal.dataSize; memcpy(inputStructure.bytes, writeVal.bytes, sizeof(writeVal.bytes)); result = SMCCall2(KERNEL_INDEX_SMC, &inputStructure, &outputStructure,conn); - + if (result != kIOReturnSuccess) - return result; + return result; return kIOReturnSuccess; } @@ -477,7 +476,7 @@ kern_return_t SMCWriteKey(SMCVal_t writeVal) UInt32 SMCReadIndexCount(void) { SMCVal_t val; - + SMCReadKey("#KEY", &val); return _strtoul((char *)val.bytes, val.dataSize, 10); } @@ -487,31 +486,31 @@ kern_return_t SMCPrintAll(void) kern_return_t result; SMCKeyData_t inputStructure; SMCKeyData_t outputStructure; - + int totalKeys, i; UInt32Char_t key; SMCVal_t val; - + totalKeys = SMCReadIndexCount(); for (i = 0; i < totalKeys; i++) { - memset(&inputStructure, 0, sizeof(SMCKeyData_t)); - memset(&outputStructure, 0, sizeof(SMCKeyData_t)); - memset(&val, 0, sizeof(SMCVal_t)); - - inputStructure.data8 = SMC_CMD_READ_INDEX; - inputStructure.data32 = i; - - result = SMCCall(KERNEL_INDEX_SMC, &inputStructure, &outputStructure); - if (result != kIOReturnSuccess) - continue; - - _ultostr(key, outputStructure.key); - + memset(&inputStructure, 0, sizeof(SMCKeyData_t)); + memset(&outputStructure, 0, sizeof(SMCKeyData_t)); + memset(&val, 0, sizeof(SMCVal_t)); + + inputStructure.data8 = SMC_CMD_READ_INDEX; + inputStructure.data32 = i; + + result = SMCCall(KERNEL_INDEX_SMC, &inputStructure, &outputStructure); + if (result != kIOReturnSuccess) + continue; + + _ultostr(key, outputStructure.key); + SMCReadKey(key, &val); - printVal(val); + printVal(val); } - + return kIOReturnSuccess; } @@ -523,18 +522,18 @@ float getFloatFromVal(SMCVal_t val) if (val.dataSize > 0) { - if (strcmp(val.dataType, DATATYPE_FLT) == 0 && val.dataSize == 4) { - memcpy(&fval,val.bytes,sizeof(float)); - } - else if (strcmp(val.dataType, DATATYPE_FPE2) == 0 && val.dataSize == 2) { - fval = _strtof(val.bytes, val.dataSize, 2); - } - else if (strcmp(val.dataType, DATATYPE_UINT16) == 0 && val.dataSize == 2) { - fval = (float)_strtoul((char *)val.bytes, val.dataSize, 10); - } - else if (strcmp(val.dataType, DATATYPE_UINT8) == 0 && val.dataSize == 1) { - fval = (float)_strtoul((char *)val.bytes, val.dataSize, 10); - } + if (strcmp(val.dataType, DATATYPE_FLT) == 0 && val.dataSize == 4) { + memcpy(&fval,val.bytes,sizeof(float)); + } + else if (strcmp(val.dataType, DATATYPE_FPE2) == 0 && val.dataSize == 2) { + fval = _strtof(val.bytes, val.dataSize, 2); + } + else if (strcmp(val.dataType, DATATYPE_UINT16) == 0 && val.dataSize == 2) { + fval = (float)_strtoul((char *)val.bytes, val.dataSize, 10); + } + else if (strcmp(val.dataType, DATATYPE_UINT8) == 0 && val.dataSize == 1) { + fval = (float)_strtoul((char *)val.bytes, val.dataSize, 10); + } } return fval; @@ -546,54 +545,54 @@ kern_return_t SMCPrintFans(void) SMCVal_t val; UInt32Char_t key; int totalFans, i; - + result = SMCReadKey("FNum", &val); if (result != kIOReturnSuccess) - return kIOReturnError; - + return kIOReturnError; + totalFans = _strtoul((char *)val.bytes, val.dataSize, 10); printf("Total fans in system: %d\n", totalFans); - + for (i = 0; i < totalFans; i++) { - printf("\nFan #%d:\n", i); - sprintf(key, "F%cID", fannum[i]); - SMCReadKey(key, &val); - if(val.dataSize > 0) { - printf(" Fan ID : %s\n", val.bytes+4); - } - sprintf(key, "F%cAc", fannum[i]); - SMCReadKey(key, &val); - printf(" Current speed : %.0f\n", getFloatFromVal(val)); - sprintf(key, "F%cMn", fannum[i]); - SMCReadKey(key, &val); - printf(" Minimum speed: %.0f\n", getFloatFromVal(val)); - sprintf(key, "F%cMx", fannum[i]); - SMCReadKey(key, &val); - printf(" Maximum speed: %.0f\n", getFloatFromVal(val)); - sprintf(key, "F%cSf", fannum[i]); - SMCReadKey(key, &val); - printf(" Safe speed : %.0f\n", getFloatFromVal(val)); - sprintf(key, "F%cTg", fannum[i]); - SMCReadKey(key, &val); - printf(" Target speed : %.0f\n", getFloatFromVal(val)); - SMCReadKey("FS! ", &val); - if(val.dataSize > 0) { - if ((_strtoul((char *)val.bytes, 2, 16) & (1 << i)) == 0) - printf(" Mode : auto\n"); - else - printf(" Mode : forced\n"); - } - else { - sprintf(key, "F%dMd", i); - SMCReadKey(key, &val); - if (getFloatFromVal(val)) - printf(" Mode : forced\n"); - else - printf(" Mode : auto\n"); - } + printf("\nFan #%d:\n", i); + sprintf(key, "F%cID", fannum[i]); + SMCReadKey(key, &val); + if(val.dataSize > 0) { + printf(" Fan ID : %s\n", val.bytes+4); + } + sprintf(key, "F%cAc", fannum[i]); + SMCReadKey(key, &val); + printf(" Current speed : %.0f\n", getFloatFromVal(val)); + sprintf(key, "F%cMn", fannum[i]); + SMCReadKey(key, &val); + printf(" Minimum speed: %.0f\n", getFloatFromVal(val)); + sprintf(key, "F%cMx", fannum[i]); + SMCReadKey(key, &val); + printf(" Maximum speed: %.0f\n", getFloatFromVal(val)); + sprintf(key, "F%cSf", fannum[i]); + SMCReadKey(key, &val); + printf(" Safe speed : %.0f\n", getFloatFromVal(val)); + sprintf(key, "F%cTg", fannum[i]); + SMCReadKey(key, &val); + printf(" Target speed : %.0f\n", getFloatFromVal(val)); + SMCReadKey("FS! ", &val); + if(val.dataSize > 0) { + if ((_strtoul((char *)val.bytes, 2, 16) & (1 << i)) == 0) + printf(" Mode : auto\n"); + else + printf(" Mode : forced\n"); + } + else { + sprintf(key, "F%dMd", i); + SMCReadKey(key, &val); + if (getFloatFromVal(val)) + printf(" Mode : forced\n"); + else + printf(" Mode : auto\n"); + } } - + return kIOReturnSuccess; } @@ -610,28 +609,28 @@ kern_return_t SMCPrintTemps(void) totalKeys = SMCReadIndexCount(); for (i = 0; i < totalKeys; i++) { - memset(&inputStructure, 0, sizeof(SMCKeyData_t)); - memset(&outputStructure, 0, sizeof(SMCKeyData_t)); - memset(&val, 0, sizeof(SMCVal_t)); + memset(&inputStructure, 0, sizeof(SMCKeyData_t)); + memset(&outputStructure, 0, sizeof(SMCKeyData_t)); + memset(&val, 0, sizeof(SMCVal_t)); - inputStructure.data8 = SMC_CMD_READ_INDEX; - inputStructure.data32 = i; + inputStructure.data8 = SMC_CMD_READ_INDEX; + inputStructure.data32 = i; - result = SMCCall(KERNEL_INDEX_SMC, &inputStructure, &outputStructure); - if (result != kIOReturnSuccess) - continue; + result = SMCCall(KERNEL_INDEX_SMC, &inputStructure, &outputStructure); + if (result != kIOReturnSuccess) + continue; - _ultostr(key, outputStructure.key); - if ( key[0] != 'T' ) - continue; + _ultostr(key, outputStructure.key); + if ( key[0] != 'T' ) + continue; - SMCReadKey(key, &val); - //printVal(val); - if (strcmp(val.dataType, DATATYPE_SP78) == 0 && val.dataSize == 2) { - printf("%-4s ", val.key); - printSP78(val); - printf("\n"); - } + SMCReadKey(key, &val); + //printVal(val); + if (strcmp(val.dataType, DATATYPE_SP78) == 0 && val.dataSize == 2) { + printf("%-4s ", val.key); + printSP78(val); + printf("\n"); + } } return kIOReturnSuccess; @@ -661,16 +660,16 @@ kern_return_t SMCWriteSimple(UInt32Char_t key, char *wvalue, io_connect_t conn) char c[3]; for (i = 0; i < strlen(wvalue); i++) { - sprintf(c, "%c%c", wvalue[i * 2], wvalue[(i * 2) + 1]); - val.bytes[i] = (int) strtol(c, NULL, 16); + sprintf(c, "%c%c", wvalue[i * 2], wvalue[(i * 2) + 1]); + val.bytes[i] = (int) strtol(c, NULL, 16); } val.dataSize = i / 2; - sprintf(val.key, key); + sprintf(val.key, "%s", key); result = SMCWriteKey2(val, conn); if (result != kIOReturnSuccess) - printf("Error: SMCWriteKey() = %08x\n", result); - - + printf("Error: SMCWriteKey() = %08x\n", result); + + return result; } @@ -678,119 +677,116 @@ int main(int argc, char *argv[]) { int c; extern char *optarg; - + kern_return_t result; int op = OP_NONE; UInt32Char_t key = { 0 }; SMCVal_t val; - + while ((c = getopt(argc, argv, "fthk:lrw:v")) != -1) { - switch(c) - { - case 'f': - op = OP_READ_FAN; - break; - case 't': - op = OP_READ_TEMPS; - break; - case 'k': - strncpy(key, optarg, sizeof(key)); //fix for buffer overflow - key[sizeof(key) - 1] = '\0'; - break; - case 'l': - op = OP_LIST; - break; - case 'r': - op = OP_READ; - break; - case 'v': - printf("%s\n", VERSION); - return 0; - break; - case 'w': - op = OP_WRITE; - { - int i; - char c[3]; - for (i = 0; i < strlen(optarg); i++) - { - sprintf(c, "%c%c", optarg[i * 2], optarg[(i * 2) + 1]); - val.bytes[i] = (int) strtol(c, NULL, 16); - } - val.dataSize = i / 2; - if ((val.dataSize * 2) != strlen(optarg)) - { - printf("Error: value is not valid\n"); - return 1; - } - } - break; - case 'h': - case '?': - op = OP_NONE; - break; - } + switch(c) + { + case 'f': + op = OP_READ_FAN; + break; + case 't': + op = OP_READ_TEMPS; + break; + case 'k': + strncpy(key, optarg, sizeof(key)); //fix for buffer overflow + key[sizeof(key) - 1] = '\0'; + break; + case 'l': + op = OP_LIST; + break; + case 'r': + op = OP_READ; + break; + case 'v': + printf("%s\n", VERSION); + return 0; + break; + case 'w': + op = OP_WRITE; + { + int i; + char c[3]; + for (i = 0; i < strlen(optarg); i++) + { + sprintf(c, "%c%c", optarg[i * 2], optarg[(i * 2) + 1]); + val.bytes[i] = (int) strtol(c, NULL, 16); + } + val.dataSize = i / 2; + if ((val.dataSize * 2) != strlen(optarg)) + { + printf("Error: value is not valid\n"); + return 1; + } + } + break; + case 'h': + case '?': + op = OP_NONE; + break; + } } - + if (op == OP_NONE) { - usage(argv[0]); - return 1; + usage(argv[0]); + return 1; } - + smc_init(); - + switch(op) { - case OP_LIST: - result = SMCPrintAll(); - if (result != kIOReturnSuccess) - printf("Error: SMCPrintAll() = %08x\n", result); - break; - case OP_READ: - if (strlen(key) > 0) - { - result = SMCReadKey(key, &val); - if (result != kIOReturnSuccess) - printf("Error: SMCReadKey() = %08x\n", result); - else - printVal(val); - } - else - { - printf("Error: specify a key to read\n"); - } - break; - case OP_READ_FAN: - result = SMCPrintFans(); - if (result != kIOReturnSuccess) - printf("Error: SMCPrintFans() = %08x\n", result); - break; - case OP_READ_TEMPS: - result = SMCPrintTemps(); - if (result != kIOReturnSuccess) - printf("Error: SMCPrintFans() = %08x\n", result); - break; - case OP_WRITE: - if (strlen(key) > 0) - { - sprintf(val.key, key); - result = SMCWriteKey(val); - if (result != kIOReturnSuccess) - printf("Error: SMCWriteKey() = %08x\n", result); - } - else - { - printf("Error: specify a key to write\n"); - } - break; + case OP_LIST: + result = SMCPrintAll(); + if (result != kIOReturnSuccess) + printf("Error: SMCPrintAll() = %08x\n", result); + break; + case OP_READ: + if (strlen(key) > 0) + { + result = SMCReadKey(key, &val); + if (result != kIOReturnSuccess) + printf("Error: SMCReadKey() = %08x\n", result); + else + printVal(val); + } + else + { + printf("Error: specify a key to read\n"); + } + break; + case OP_READ_FAN: + result = SMCPrintFans(); + if (result != kIOReturnSuccess) + printf("Error: SMCPrintFans() = %08x\n", result); + break; + case OP_READ_TEMPS: + result = SMCPrintTemps(); + if (result != kIOReturnSuccess) + printf("Error: SMCPrintFans() = %08x\n", result); + break; + case OP_WRITE: + if (strlen(key) > 0) + { + sprintf(val.key, "%s", key); + result = SMCWriteKey(val); + if (result != kIOReturnSuccess) + printf("Error: SMCWriteKey() = %08x\n", result); + } + else + { + printf("Error: specify a key to write\n"); + } + break; } - + smc_close(); return 0; } #endif //#ifdef CMD_TOOL - - -