static CFURLRef _preferencesDirectoryForUserHostSafetyLevel(CFStringRef userName, CFStringRef hostName, unsigned long safeLevel) { CFAllocatorRef alloc = __CFPreferencesAllocator(); #if 0 CFURLRef url = NULL; UniChar szPath[MAX_PATH]; if (S_OK == SHGetFolderPathW(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, (LPWSTR) szPath)) { CFStringRef directoryPath = CFStringCreateWithCharacters(alloc, szPath, strlen_UniChar(szPath)); if (directoryPath) { CFStringRef completePath = CFStringCreateWithFormat(alloc, NULL, CFSTR("%@\\Apple\\"), directoryPath); if (completePath) { url = CFURLCreateWithFileSystemPath(alloc, completePath, kCFURLWindowsPathStyle, true); CFRelease(completePath); } CFRelease(directoryPath); } } // Can't find a better place? Home directory then? if (url == NULL) url = CFCopyHomeDirectoryURLForUser((userName == kCFPreferencesCurrentUser) ? NULL : userName); return url; #else CFURLRef home = NULL; CFURLRef url; int levels = 0; // if (hostName != kCFPreferencesCurrentHost && hostName != kCFPreferencesAnyHost) return NULL; // Arbitrary host access not permitted if (userName == kCFPreferencesAnyUser) { if (!home) home = CFURLCreateWithFileSystemPath(alloc, CFSTR("/Library/Preferences/"), kCFURLPOSIXPathStyle, true); levels = 1; if (hostName == kCFPreferencesCurrentHost) url = home; else { url = CFURLCreateWithFileSystemPathRelativeToBase(alloc, CFSTR("Network/"), kCFURLPOSIXPathStyle, true, home); levels ++; CFRelease(home); } } else { home = CFCopyHomeDirectoryURLForUser((userName == kCFPreferencesCurrentUser) ? NULL : userName); if (home) { url = (safeLevel > 0) ? CFURLCreateWithFileSystemPathRelativeToBase(alloc, CFSTR("Library/Safe Preferences/"), kCFURLPOSIXPathStyle, true, home) : CFURLCreateWithFileSystemPathRelativeToBase(alloc, CFSTR("Library/Preferences/"), kCFURLPOSIXPathStyle, true, home); levels = 2; CFRelease(home); if (hostName != kCFPreferencesAnyHost) { home = url; url = CFURLCreateWithFileSystemPathRelativeToBase(alloc, CFSTR("ByHost/"), kCFURLPOSIXPathStyle, true, home); levels ++; CFRelease(home); } } else { url = NULL; } } return url; #endif }
static CFURLRef _preferencesDirectoryForUserHostSafetyLevel(CFStringRef userName, CFStringRef hostName, unsigned long safeLevel) { CFAllocatorRef alloc = __CFPreferencesAllocator(); #if DEPLOYMENT_TARGET_WINDOWS CFURLRef url = NULL; CFMutableStringRef completePath = _CFCreateApplicationRepositoryPath(alloc, CSIDL_APPDATA); if (completePath) { // append "Preferences\" and make the CFURL CFStringAppend(completePath, CFSTR("Preferences\\")); url = CFURLCreateWithFileSystemPath(alloc, completePath, kCFURLWindowsPathStyle, true); CFRelease(completePath); } // Can't find a better place? Home directory then? if (url == NULL) url = CFCopyHomeDirectoryURLForUser((userName == kCFPreferencesCurrentUser) ? NULL : userName); return url; #else CFURLRef home = NULL; CFURLRef url; int levels = 0; // if (hostName != kCFPreferencesCurrentHost && hostName != kCFPreferencesAnyHost) return NULL; // Arbitrary host access not permitted if (userName == kCFPreferencesAnyUser) { if (!home) home = CFURLCreateWithFileSystemPath(alloc, CFSTR("/Library/Preferences/"), kCFURLPOSIXPathStyle, true); levels = 1; if (hostName == kCFPreferencesCurrentHost) url = home; else { url = CFURLCreateWithFileSystemPathRelativeToBase(alloc, CFSTR("Network/"), kCFURLPOSIXPathStyle, true, home); levels ++; CFRelease(home); } } else { home = CFCopyHomeDirectoryURLForUser((userName == kCFPreferencesCurrentUser) ? NULL : userName); if (home) { url = (safeLevel > 0) ? CFURLCreateWithFileSystemPathRelativeToBase(alloc, CFSTR("Library/Safe Preferences/"), kCFURLPOSIXPathStyle, true, home) : CFURLCreateWithFileSystemPathRelativeToBase(alloc, CFSTR("Library/Preferences/"), kCFURLPOSIXPathStyle, true, home); levels = 2; CFRelease(home); if (hostName != kCFPreferencesAnyHost) { home = url; url = CFURLCreateWithFileSystemPathRelativeToBase(alloc, CFSTR("ByHost/"), kCFURLPOSIXPathStyle, true, home); levels ++; CFRelease(home); } } else { url = NULL; } } return url; #endif }
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; }
// Try to remove the dynamic MIME file used for dynamic content-type generation. // You cannot rely on registry being sane at this point, as we can't guarantee // the order destructors are called, so please don't access it here. void __destructor fini_remove_dynamic_plist(void) { CFURLRef home_directory = NULL; CFURLRef pref_directory = NULL; CFURLRef mime_file = NULL; CFURLRef mime_file_lock = NULL; SInt32 error_code = -1; // Resolve the home directory. home_directory = CFCopyHomeDirectoryURLForUser(NULL); if (home_directory == NULL) { goto finished; } // Resolve Preferences directory (this is how CoreFoundation does it), I // don't want to have to rely on this, but they don't make it easy. pref_directory = CFURLCreateWithFileSystemPathRelativeToBase(kCFAllocatorDefault, CFSTR("Library/Preferences/"), kCFURLPOSIXPathStyle, true, home_directory); if (pref_directory == NULL) { goto finished; } // Append the name of my cache file. mime_file = CFURLCreateWithFileSystemPathRelativeToBase(kCFAllocatorDefault, CFSTR("com.google.netscapesecurity.plist"), kCFURLPOSIXPathStyle, false, pref_directory); mime_file_lock = CFURLCreateWithFileSystemPathRelativeToBase(kCFAllocatorDefault, CFSTR("com.google.netscapesecurity.plist.lockfile"), kCFURLPOSIXPathStyle, false, pref_directory); if (!mime_file || !mime_file_lock) { goto finished; } // Delete the file, and possibly stale lockfile, I don't care if it fails. CFURLDestroyResource(mime_file, &error_code); CFURLDestroyResource(mime_file_lock, &error_code); finished: CFRelease(home_directory); CFRelease(pref_directory); CFRelease(mime_file); CFRelease(mime_file_lock); return; }
static CFURLRef _preferencesDirectoryForUserHostSafetyLevel(CFStringRef userName, CFStringRef hostName, unsigned long safeLevel) { CFAllocatorRef alloc = __CFPreferencesAllocator(); #if TARGET_OS_WIN32 CFURLRef url = NULL; CFMutableStringRef completePath = _CFCreateApplicationRepositoryPath(alloc, CSIDL_APPDATA); if (completePath) { // append "Preferences\" and make the CFURL CFStringAppend(completePath, CFSTR("Preferences\\")); url = CFURLCreateWithFileSystemPath(alloc, completePath, kCFURLWindowsPathStyle, true); CFRelease(completePath); } // Can't find a better place? Home directory then? if (url == NULL) url = CFCopyHomeDirectoryURLForUser((userName == kCFPreferencesCurrentUser) ? NULL : userName); return url; #else CFURLRef location = NULL; CFKnownLocationUser user; if (userName == kCFPreferencesAnyUser) { user = _kCFKnownLocationUserAny; } else if (userName == kCFPreferencesCurrentUser) { user = _kCFKnownLocationUserCurrent; } else { user = _kCFKnownLocationUserByName; } CFURLRef base = _CFKnownLocationCreatePreferencesURLForUser(user, userName); if (hostName == kCFPreferencesCurrentHost) { location = CFURLCreateWithFileSystemPathRelativeToBase(kCFAllocatorSystemDefault, CFSTR("ByHost"), kCFURLPOSIXPathStyle, true, base); } else { assert(hostName == kCFPreferencesAnyHost); location = CFRetain(base); } CFRelease(base); return location; #endif }
static CFURLRef SecCopyHomeURL(void) { // This returns a CFURLRef so that it can be passed as the second parameter // to CFURLCreateCopyAppendingPathComponent CFURLRef homeURL = sCustomHomeURL; if (homeURL) { CFRetain(homeURL); } else { #if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) // We would use CFCopyHomeDirectoryURL but it doesn't exist on MACOS. // This does the same. homeURL = CFCopyHomeDirectoryURLForUser(NULL); #else homeURL = CFCopyHomeDirectoryURL(); #endif } return homeURL; }
// Initialisation à faire une fois au début du programme void Init_text(void) { char directory_name[MAX_PATH_CHARACTERS]; #ifndef NOTTF // Initialisation de TTF TTF_Init(); #endif // Initialisation des fontes font_list_start = NULL; Nb_fonts=0; // Parcours du répertoire "fonts" strcpy(directory_name, Data_directory); strcat(directory_name, "fonts"); For_each_file(directory_name, Add_font); #if defined(__WIN32__) // Parcours du répertoire systeme windows "fonts" #ifndef NOTTF { char * WindowsPath=getenv("windir"); if (WindowsPath) { sprintf(directory_name, "%s\\FONTS", WindowsPath); For_each_file(directory_name, Add_font); } } #endif #elif defined(__macosx__) // Récupération de la liste des fonts avec fontconfig #ifndef NOTTF int i,number; char home_dir[MAXPATHLEN]; char *font_path_list[3] = { "/System/Library/Fonts", "/Library/Fonts" }; number = 3; // Make sure we also search into the user's fonts directory CFURLRef url = (CFURLRef) CFCopyHomeDirectoryURLForUser(NULL); CFURLGetFileSystemRepresentation(url, true, (UInt8 *) home_dir, MAXPATHLEN); strcat(home_dir, "/Library/Fonts"); font_path_list[2] = home_dir; for(i=0;i<number;i++) For_each_file(*(font_path_list+i),Add_font); CFRelease(url); #endif #elif defined(__linux__) #ifndef NOTTF #define USE_XLIB #ifdef USE_XLIB { int i,number; Display* dpy = XOpenDisplay(NULL); char** font_path_list = XGetFontPath(dpy,&number); XCloseDisplay(dpy); for(i=0;i<number;i++) For_each_file(*(font_path_list+i),Add_font); XFreeFontPath(font_path_list); } #endif #endif #elif defined(__amigaos4__) || defined(__amigaos__) #ifndef NOTTF For_each_file( "FONTS:_TrueType", Add_font ); #endif #elif defined(__BEOS__) || defined(__HAIKU__) #ifndef NOTTF For_each_file("/etc/fonts/ttfonts", Add_font); #endif #elif defined(__SKYOS__) #ifndef NOTTF For_each_file("/boot/system/fonts", Add_font); #endif #endif }
CFURLRef _Nullable _CFKnownLocationCreatePreferencesURLForUser(CFKnownLocationUser user, CFStringRef _Nullable username) { CFURLRef location = NULL; #if (DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED || DEPLOYMENT_TARGET_EMBEDDED_MINI) /* Building for a Darwin OS. (We use these paths on Swift builds as well, so that we can interoperate a little with Darwin's defaults(1) command and the other system facilities; but you want to use the system version of CF if possible on those platforms, which will talk to cfprefsd(8) and has stronger interprocess consistency guarantees.) User: - Any: /Library/Preferences - Current: $HOME/Library/Preferences */ switch (user) { case _kCFKnownLocationUserAny: location = CFURLCreateWithFileSystemPath(kCFAllocatorSystemDefault, CFSTR("/Library/Preferences"), kCFURLPOSIXPathStyle, true); break; case _kCFKnownLocationUserCurrent: username = NULL; // passthrough to: case _kCFKnownLocationUserByName: { CFURLRef home = CFCopyHomeDirectoryURLForUser(username); location = CFURLCreateWithFileSystemPathRelativeToBase(kCFAllocatorSystemDefault, CFSTR("/Library/Preferences"), kCFURLPOSIXPathStyle, true, home); CFRelease(home); break; } } #elif !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS && !DEPLOYMENT_TARGET_ANDROID /* Building for an OS that uses the FHS, BSD's hier(7), and/or the XDG specification for paths: User: - Any: /usr/local/etc/ - Current: $XDG_CONFIG_PATH (usually: $HOME/.config/). */ switch (user) { case _kCFKnownLocationUserAny: location = CFURLCreateWithFileSystemPath(kCFAllocatorSystemDefault, CFSTR("/usr/local/etc"), kCFURLPOSIXPathStyle, true); break; case _kCFKnownLocationUserByName: assert(username == NULL); // passthrough to: case _kCFKnownLocationUserCurrent: { CFStringRef path = _CFXDGCreateConfigHomePath(); location = CFURLCreateWithFileSystemPath(kCFAllocatorSystemDefault, path, kCFURLPOSIXPathStyle, true); CFRelease(path); break; } } #elif DEPLOYMENT_TARGET_WINDOWS switch (user) { case _kCFKnownLocationUserAny: location = CFURLCreateWithFileSystemPath(kCFAllocatorSystemDefault, CFSTR("\\Users\\All Users\\AppData\\Local"), kCFURLWindowsPathStyle, true); break; case _kCFKnownLocationUserCurrent: username = CFGetUserName(); // fallthrough case _kCFKnownLocationUserByName: const char *user = CFStringGetCStringPtr(username, kCFStringEncodingUTF8); CFURLRef userdir = CFURLCreateFromFileSystemRepresentation(kCFAllocatorSystemDefault, (const unsigned char *)user, strlen(user), true); CFURLRef homedir = CFURLCreateWithFileSystemPathRelativeToBase(kCFAllocatorSystemDefault, CFSTR("\\Users"), kCFURLWindowsPathStyle, true, userdir); location = CFURLCreateWithFileSystemPathRelativeToBase(kCFAllocatorSystemDefault, CFSTR("\\AppData\\Local"), kCFURLWindowsPathStyle, true, homedir); CFRelease(homedir); CFRelease(userdir); break; } #else #error For this platform, you need to define a preferences path for both 'any user' (i.e. installation-wide preferences) or the current user. #endif return location; }