X-Git-Url: https://git.saurik.com/apple/cf.git/blobdiff_plain/47a9ab1f151d80a00a045f81937ddac81c51a463..bd5b749cf7786ae858ab372fc8f64179736c6515:/CFSystemDirectories.c?ds=inline diff --git a/CFSystemDirectories.c b/CFSystemDirectories.c new file mode 100644 index 0000000..7104c2d --- /dev/null +++ b/CFSystemDirectories.c @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* CFSystemDirectories.c + Copyright 1997-2002, Apple, Inc. All rights reserved. + Responsibility: Ali Ozer +*/ + +/* + This file defines CFCopySearchPathForDirectoriesInDomains(). + On MacOS 8, this function returns empty array. + On Mach, it calls the System.framework enumeration functions. + On Windows, it calls the enumeration functions defined here. +*/ + +#include +#include "CFInternal.h" + +#if DEPLOYMENT_TARGET_MACOSX + +/* We use the System framework implementation on Mach. +*/ +#include +#include +#include +#include + +CFSearchPathEnumerationState __CFStartSearchPathEnumeration(CFSearchPathDirectory dir, CFSearchPathDomainMask domainMask) { + return NSStartSearchPathEnumeration(dir, domainMask); +} + +CFSearchPathEnumerationState __CFGetNextSearchPathEnumeration(CFSearchPathEnumerationState state, uint8_t *path, CFIndex pathSize) { + CFSearchPathEnumerationState result; + // NSGetNextSearchPathEnumeration requires a MAX_PATH size + if (pathSize < PATH_MAX) { + uint8_t tempPath[PATH_MAX]; + result = NSGetNextSearchPathEnumeration(state, (char *)tempPath); + strlcpy((char *)path, (char *)tempPath, pathSize); + } else { + result = NSGetNextSearchPathEnumeration(state, (char *)path); + } + return result; +} + +#endif + + +#if DEPLOYMENT_TARGET_MACOSX + +CFArrayRef CFCopySearchPathForDirectoriesInDomains(CFSearchPathDirectory directory, CFSearchPathDomainMask domainMask, Boolean expandTilde) { + CFMutableArrayRef array; + CFSearchPathEnumerationState state; + CFIndex homeLen = -1; + char cPath[CFMaxPathSize], home[CFMaxPathSize]; + + array = CFArrayCreateMutable(kCFAllocatorSystemDefault, 0, &kCFTypeArrayCallBacks); + state = __CFStartSearchPathEnumeration(directory, domainMask); + while ((state = __CFGetNextSearchPathEnumeration(state, (uint8_t *)cPath, sizeof(cPath)))) { + CFURLRef url = NULL; + if (expandTilde && (cPath[0] == '~')) { + if (homeLen < 0) { + CFURLRef homeURL = CFCopyHomeDirectoryURLForUser(NULL); + if (homeURL) { + CFURLGetFileSystemRepresentation(homeURL, true, (uint8_t *)home, CFMaxPathSize); + homeLen = strlen(home); + CFRelease(homeURL); + } + } + if (homeLen + strlen(cPath) < CFMaxPathSize) { + home[homeLen] = '\0'; + strlcat(home, &cPath[1], sizeof(home)); + url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorSystemDefault, (uint8_t *)home, strlen(home), true); + } + } else { + url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorSystemDefault, (uint8_t *)cPath, strlen(cPath), true); + } + if (url) { + CFArrayAppendValue(array, url); + CFRelease(url); + } + } + return array; +} + +#endif + +#undef numDirs +#undef numApplicationDirs +#undef numLibraryDirs +#undef numDomains +#undef invalidDomains +#undef invalidDomains +