static void normalizeWebResourceURL(CFMutableStringRef webResourceURL) { static CFIndex fileUrlLength = CFStringGetLength(CFSTR("file://")); CFRange layoutTestsWebArchivePathRange = CFStringFind(webResourceURL, CFSTR("/LayoutTests/"), kCFCompareBackwards); if (layoutTestsWebArchivePathRange.location == kCFNotFound) return; CFRange currentWorkingDirectoryRange = CFRangeMake(fileUrlLength, layoutTestsWebArchivePathRange.location - fileUrlLength); CFStringReplace(webResourceURL, currentWorkingDirectoryRange, CFSTR("")); }
CFStringRef _CFErrorCreateDebugDescription(CFErrorRef err) { CFStringRef desc = CFErrorCopyDescription(err); CFStringRef debugDesc = _CFErrorCopyUserInfoKey(err, kCFErrorDebugDescriptionKey); CFDictionaryRef userInfo = _CFErrorGetUserInfo(err); CFMutableStringRef result = CFStringCreateMutable(kCFAllocatorSystemDefault, 0); CFStringAppendFormat(result, NULL, CFSTR("Error Domain=%@ Code=%d"), CFErrorGetDomain(err), (long)CFErrorGetCode(err)); CFStringAppendFormat(result, NULL, CFSTR(" \"%@\""), desc); if (debugDesc && CFStringGetLength(debugDesc) > 0) CFStringAppendFormat(result, NULL, CFSTR(" (%@)"), debugDesc); if (userInfo) { CFStringAppendFormat(result, NULL, CFSTR(" UserInfo=%p {"), userInfo); CFDictionaryApplyFunction(userInfo, userInfoKeyValueShow, (void *)result); CFIndex commaLength = (CFStringHasSuffix(result, CFSTR(", "))) ? 2 : 0; CFStringReplace(result, CFRangeMake(CFStringGetLength(result)-commaLength, commaLength), CFSTR("}")); } if (debugDesc) CFRelease(debugDesc); if (desc) CFRelease(desc); return result; }
static bool8 NPClientBeginOpenROMImage(WindowRef window) { CFStringRef numRef, romRef, baseRef; CFMutableStringRef mesRef; SInt32 replaceAt; bool8 r; DeinitGameWindow(); if (cartOpen) { SNES9X_SaveSRAM(); S9xSaveCheatFile(S9xGetFilename(".cht", PATCH_DIR)); } cartOpen = false; Settings.MouseMaster = true; Settings.SuperScopeMaster = true; Settings.MultiPlayer5Master = true; Settings.JustifierMaster = true; ResetCheatFinder(); romRef = CFStringCreateWithCString(kCFAllocatorDefault, nprominfo.fname, MAC_PATH_ENCODING); numRef = CFCopyLocalizedString(CFSTR("NPROMNamePos"), "1"); baseRef = CFCopyLocalizedString(CFSTR("NPROMNameMes"), "NPROM"); mesRef = CFStringCreateMutableCopy(kCFAllocatorDefault, 0, baseRef); replaceAt = CFStringGetIntValue(numRef); CFStringReplace(mesRef, CFRangeMake(replaceAt - 1, 1), romRef); r = NavBeginOpenROMImageSheet(window, mesRef); CFRelease(mesRef); CFRelease(baseRef); CFRelease(numRef); CFRelease(romRef); return (r); }
static bool8 NPClientBeginOpenROMImage (WindowRef window) { CFStringRef numRef, romRef, baseRef; CFMutableStringRef mesRef; SInt32 replaceAt; bool8 r; DeinitGameWindow(); if (cartOpen) { SNES9X_SaveSRAM(); S9xResetSaveTimer(false); S9xSaveCheatFile(S9xGetFilename(".cht", CHEAT_DIR)); } cartOpen = false; ResetCheatFinder(); romRef = CFStringCreateWithCString(kCFAllocatorDefault, nprominfo.fname, kCFStringEncodingUTF8); numRef = CFCopyLocalizedString(CFSTR("NPROMNamePos"), "1"); baseRef = CFCopyLocalizedString(CFSTR("NPROMNameMes"), "NPROM"); mesRef = CFStringCreateMutableCopy(kCFAllocatorDefault, 0, baseRef); replaceAt = CFStringGetIntValue(numRef); CFStringReplace(mesRef, CFRangeMake(replaceAt - 1, 1), romRef); r = NavBeginOpenROMImageSheet(window, mesRef); CFRelease(mesRef); CFRelease(baseRef); CFRelease(numRef); CFRelease(romRef); return (r); }
static void booter(kickeeRef target) { char **argv = NULL; char *cmd = NULL; CFStringRef execCommand = CFDictionaryGetValue(target->dict, CFSTR("execCommand")); int i; CFArrayRef keys = NULL; CFStringRef name = CFDictionaryGetValue(target->dict, CFSTR("name")); int nKeys = 0; Boolean ok = FALSE; CFStringRef postName = CFDictionaryGetValue(target->dict, CFSTR("postName")); SCLog(_verbose, LOG_DEBUG, CFSTR("Kicker callback, target=%@"), name); if (!isA_CFString(postName) && !isA_CFString(execCommand)) { goto error; /* if no notifications to post nor commands to execute */ } if (isA_CFString(postName)) { uint32_t status; /* * post a notification */ cmd = _SC_cfstring_to_cstring(postName, NULL, 0, kCFStringEncodingASCII); if (!cmd) { SCLog(TRUE, LOG_DEBUG, CFSTR(" could not convert post name to C string")); goto error; } SCLog(TRUE, LOG_NOTICE, CFSTR("posting notification %s"), cmd); status = notify_post(cmd); if (status != NOTIFY_STATUS_OK) { SCLog(TRUE, LOG_DEBUG, CFSTR(" notify_post() failed: error=%ld"), status); goto error; } CFAllocatorDeallocate(NULL, cmd); /* clean up */ cmd = NULL; } /* * get the arguments for the kickee */ keys = target->changedKeys; target->changedKeys = NULL; if (isA_CFString(execCommand)) { CFRange bpr; CFNumberRef execGID = CFDictionaryGetValue(target->dict, CFSTR("execGID")); CFNumberRef execUID = CFDictionaryGetValue(target->dict, CFSTR("execUID")); CFBooleanRef passKeys = CFDictionaryGetValue(target->dict, CFSTR("changedKeysAsArguments")); gid_t reqGID = 0; uid_t reqUID = 0; CFMutableStringRef str; /* * build the kickee command */ str = CFStringCreateMutableCopy(NULL, 0, execCommand); bpr = CFStringFind(str, CFSTR("$BUNDLE"), 0); if (bpr.location != kCFNotFound) { CFStringRef bundlePath; bundlePath = CFURLCopyFileSystemPath(myBundleURL, kCFURLPOSIXPathStyle); CFStringReplace(str, bpr, bundlePath); CFRelease(bundlePath); } cmd = _SC_cfstring_to_cstring(str, NULL, 0, kCFStringEncodingASCII); CFRelease(str); if (!cmd) { SCLog(TRUE, LOG_DEBUG, CFSTR(" could not convert command to C string")); goto error; } /* * get the UID/GID for the kickee */ if (isA_CFNumber(execUID)) { CFNumberGetValue(execUID, kCFNumberIntType, &reqUID); } if (isA_CFNumber(execGID)) { CFNumberGetValue(execGID, kCFNumberIntType, &reqGID); } nKeys = CFArrayGetCount(keys); argv = CFAllocatorAllocate(NULL, (nKeys + 2) * sizeof(char *), 0); for (i = 0; i < (nKeys + 2); i++) { argv[i] = NULL; } /* create command name argument */ if ((argv[0] = rindex(cmd, '/')) != NULL) { argv[0]++; } else { argv[0] = cmd; } /* create changed key arguments */ if (isA_CFBoolean(passKeys) && CFBooleanGetValue(passKeys)) { for (i = 0; i < nKeys; i++) { CFStringRef key = CFArrayGetValueAtIndex(keys, i); argv[i+1] = _SC_cfstring_to_cstring(key, NULL, 0, kCFStringEncodingASCII); if (!argv[i+1]) { SCLog(TRUE, LOG_DEBUG, CFSTR(" could not convert argument to C string")); goto error; } } } SCLog(TRUE, LOG_NOTICE, CFSTR("executing %s"), cmd); SCLog(_verbose, LOG_DEBUG, CFSTR(" current uid = %d, requested = %d"), geteuid(), reqUID); /* this kicker is now "running" */ target->active = TRUE; (void)_SCDPluginExecCommand(booterExit, target, reqUID, reqGID, cmd, argv); // CFAllocatorDeallocate(NULL, cmd); /* clean up */ // cmd = NULL; } else { target->active = FALSE; } target->needsKick = FALSE; /* allow additional requests to be queued */ ok = TRUE; error : if (keys) CFRelease(keys); if (cmd) CFAllocatorDeallocate(NULL, cmd); if (argv) { for (i = 0; i < nKeys; i++) { if (argv[i+1]) { CFAllocatorDeallocate(NULL, argv[i+1]); } } CFAllocatorDeallocate(NULL, argv); } if (!ok) { /* * If the target action can't be performed this time then * there's not much point in trying again. As such, I close * the session and the kickee target released. */ cleanupKicker(target); } return; }
static CFStringRef copy_default_name(void) { CFStringRef model; size_t n; CFMutableStringRef str; // get HW model name model = _SC_hw_model(TRUE); if (model == NULL) { return NULL; } // start off with the [trunated] HW model str = CFStringCreateMutable(NULL, 0); CFStringAppend(str, model); // truncate as needed n = CFStringGetLength(str); if (n > (NETBIOS_NAME_LEN - 1)) { CFStringReplace(str, CFRangeMake(NETBIOS_NAME_LEN, n - (NETBIOS_NAME_LEN - 1)), CFSTR("")); n = NETBIOS_NAME_LEN - 1; } // // if there is room for at least one byte (two hex characters) // of the MAC address than append that to the NetBIOS name. // // NETBIOS_NAME_LEN max length // -1 the last byte is reserved // -3 "-XX" // if (n < (NETBIOS_NAME_LEN - 1 - 3)) { SCNetworkInterfaceRef interface; interface = _SCNetworkInterfaceCreateWithBSDName(NULL, CFSTR("en0"), kIncludeNoVirtualInterfaces); if (interface != NULL) { CFMutableStringRef en0_MAC; en0_MAC = (CFMutableStringRef)SCNetworkInterfaceGetHardwareAddressString(interface); if (en0_MAC != NULL) { CFIndex en0_MAC_len; // remove ":" characters from MAC address string en0_MAC = CFStringCreateMutableCopy(NULL, 0, en0_MAC); CFStringFindAndReplace(en0_MAC, CFSTR(":"), CFSTR(""), CFRangeMake(0, CFStringGetLength(en0_MAC)), 0); // // compute how may bytes (characters) to append // ... and limit that number to 6 // // NETBIOS_NAME_LEN max length // -1 the last byte is reserved // -n "iMac" // -1 "-" // n = ((NETBIOS_NAME_LEN - 1 - n - 1) / 2) * 2; if (n > 6) { n = 6; } // remove what we don't want en0_MAC_len = CFStringGetLength(en0_MAC); if (en0_MAC_len > n) { CFStringDelete(en0_MAC, CFRangeMake(0, en0_MAC_len - n)); } // append CFStringAppendFormat(str, NULL, CFSTR("-%@"), en0_MAC); CFRelease(en0_MAC); } CFRelease(interface); } } CFStringUppercase(str, NULL); return str; }
static kern_return_t SubstituteKeywordsInUserVisibleName(io_object_t interface, CFMutableDictionaryRef interfaceInfo, CFStringRef nameTemplate, CFStringRef *userVisibleName) // This routine creates a new string and returns it in *userVisibleName. // The string is based on nameTemplate, with any of the keywords (defined // in our header file) replace with the appropriate strings. // // I could probably write better, more general, code to do this, but // this is the way the code turned out (after several design iterations) // and it's not too atrocious. // // Note that this routine assumes that whoever set up nameTemplate // to included a keyword also included the appropriate string in the // interfaceInfo dictionary. This might not be true if the client's // callback routine returns a wacky localisation for the user-visible // name. I haven't seen fit to fix this because it's an obscure // case and the client's callback could fix it by adding the appropriate // keys to the interfaceInfo dictionary (which it is passed). // // I originally tried to using CFStringCreateWithFormat to create // the output string (hence the keyword syntax) but I discovered // that the CF routine requires you to always substitute all keywords // (which is obvious when you consider how varargs works, but it // threw me for a loop). So I abandoned CFStringCreateWithFormat, but // I couldn't think of any good reason to change the keyword syntax. { #pragma unused(interface) kern_return_t err; CFMutableStringRef result; CFRange foundRange; assert( interface != 0 ); assert( interfaceInfo != NULL); assert( nameTemplate != NULL); assert( userVisibleName != NULL); assert(*userVisibleName == NULL); err = 0; result = CFStringCreateMutableCopy(NULL, 0, nameTemplate); if (result == NULL) { err = -1; } // BSD Name if ( (err == 0) && CFStringFindWithOptions(result, CFSTR("%1$@"), CFRangeMake(0, CFStringGetLength(result)), kNilOptions, &foundRange) ) { assert(CFDictionaryGetValue(interfaceInfo, CFSTR(kIOBSDNameKey)) != NULL); CFStringReplace(result, foundRange, (CFStringRef) CFDictionaryGetValue(interfaceInfo, CFSTR(kIOBSDNameKey))); } // PCI Slot Name if ( (err == 0) && CFStringFindWithOptions(result, CFSTR("%2$@"), CFRangeMake(0, CFStringGetLength(result)), kNilOptions, &foundRange) ) { assert(CFDictionaryGetValue(interfaceInfo, CFSTR("AAPL,slot-name")) != NULL); CFStringReplace(result, foundRange, (CFStringRef) CFDictionaryGetValue(interfaceInfo, CFSTR("AAPL,slot-name"))); } // PCI Function Number if ( (err == 0) && CFStringFindWithOptions(result, CFSTR("%3$@"), CFRangeMake(0, CFStringGetLength(result)), kNilOptions, &foundRange) ) { assert(CFDictionaryGetValue(interfaceInfo, CFSTR("IOChildIndex")) != NULL); CFStringReplace(result, foundRange, (CFStringRef) CFDictionaryGetValue(interfaceInfo, CFSTR("IOChildIndex"))); } // IOTTYBaseName if ( (err == 0) && CFStringFindWithOptions(result, CFSTR("%4$@"), CFRangeMake(0, CFStringGetLength(result)), kNilOptions, &foundRange) ) { assert(CFDictionaryGetValue(interfaceInfo, CFSTR(kIOTTYBaseNameKey)) != NULL); CFStringReplace(result, foundRange, (CFStringRef) CFDictionaryGetValue(interfaceInfo, CFSTR(kIOTTYBaseNameKey))); } // Clean up. if (err == 0) { *userVisibleName = result; } else { CFQRelease(result); } assert( (err == 0) == (*userVisibleName != NULL) ); return err; }
static void _CFStringTransformReplace(UReplaceable *rep, int32_t start, int32_t limit, const UChar* text, int32_t textLength) { CFMutableStringRef string = (CFMutableStringRef)rep; CFStringRef replacement = CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, text, textLength, kCFAllocatorNull); CFStringReplace(string, CFRangeMake(start, limit - start), replacement); CFRelease(replacement); }
void __NCReplaceFormatToken( CFMutableStringRef string, CFIndex start, CFIndex end ) { CFRange cmpRange; int code = -1; int lo,hi,idx; UniChar charToMatch = CFStringGetCharacterAtIndex(string,start + 2); Boolean didLoEqualHiAlready = FALSE; // From start+2 to end-1 is the format directive: cmpRange.location = start + 2; cmpRange.length = end - start - 2; // We do a binary search for the token in the table: lo = 0; hi = _formatTokenCount; while ( (lo < hi) && (code == -1) ) { int diff; idx = (hi + lo) / 2; diff = charToMatch - __formatTokenTable[idx].ctoken[0]; // Positive 'diff' means string is above this one; // Negative 'diff' means string should be below it; // Zero means we matched the first character, so we // do a standard string compare to see if we got it. if (diff > 0) lo = idx; else if (diff < 0) hi = idx; else { CFComparisonResult cmpResult; if (__formatTokenTable[idx].cftoken == NULL) __formatTokenTable[idx].cftoken = CFStringCreateWithCStringNoCopy( kCFAllocatorDefault, __formatTokenTable[idx].ctoken, CFCStringGetDefaultEncoding(), kCFAllocatorNull); cmpResult = CFStringCompareWithOptions( string, __formatTokenTable[idx].cftoken, cmpRange, 0); switch (cmpResult) { case kCFCompareEqualTo: code = __formatTokenTable[idx].code; break; case kCFCompareLessThan: hi = idx; break; case kCFCompareGreaterThan: lo = idx; break; } } if (hi == lo) { if (didLoEqualHiAlready) break; else didLoEqualHiAlready = TRUE; } } // Replace the full range: cmpRange = CFRangeMake(start,end - start + 1); if (code == -1 || !NCANSIOutputEnable) { // Just remove the thing: CFStringDelete(string,cmpRange); } else { // Create the ANSI sequence: CFStringRef replacement; if (replacement = CFStringCreateWithFormat(kCFAllocatorDefault,NULL,CFSTR("\033[%dm"),code)) { CFStringReplace(string,cmpRange,replacement); CFRelease(replacement); } else CFStringDelete(string,cmpRange); } }