/** Free all data in the cache and set pointers to null. */ static void xdgFreeData(xdgCachedData *cache) { if (cache->dataHome); { /* the first element of the directory lists is usually the home directory */ if (cache->searchableDataDirectories && cache->searchableDataDirectories[0] != cache->dataHome) free(cache->dataHome); cache->dataHome = 0; } if (cache->configHome); { if (cache->searchableConfigDirectories && cache->searchableConfigDirectories[0] != cache->configHome) free(cache->configHome); cache->configHome = 0; } if (cache->cacheHome) { free(cache->cacheHome); cache->cacheHome = 0; } xdgFreeStringList(cache->searchableDataDirectories); cache->searchableDataDirectories = 0; xdgFreeStringList(cache->searchableConfigDirectories); cache->searchableConfigDirectories = 0; }
/** Update all *Directories variables of cache. * This includes xdgCachedData::searchableDataDirectories and xdgCachedData::searchableConfigDirectories. * @param cache Data cache to be updated. */ static int xdgUpdateDirectoryLists(xdgCachedData* cache) { char** itemlist; int size; itemlist = xdgGetPathListEnv("XDG_DATA_DIRS", DefaultDataDirectoriesList); if (!itemlist) return FALSE; for (size = 0; itemlist[size]; size++) ; /* Get list size */ if (!(cache->searchableDataDirectories = (char**)malloc(sizeof(char*)*(size+2)))) { xdgFreeStringList(itemlist); return FALSE; } /* "home" directory has highest priority according to spec */ cache->searchableDataDirectories[0] = cache->dataHome; memcpy(&(cache->searchableDataDirectories[1]), itemlist, sizeof(char*)*(size+1)); free(itemlist); itemlist = xdgGetPathListEnv("XDG_CONFIG_DIRS", DefaultConfigDirectoriesList); if (!itemlist) return FALSE; for (size = 0; itemlist[size]; size++) ; /* Get list size */ if (!(cache->searchableConfigDirectories = (char**)malloc(sizeof(char*)*(size+2)))) { xdgFreeStringList(itemlist); return FALSE; } cache->searchableConfigDirectories[0] = cache->configHome; memcpy(&(cache->searchableConfigDirectories[1]), itemlist, sizeof(char*)*(size+1)); free(itemlist); return TRUE; }
FILE * xdgConfigOpen(const char * relativePath, const char * mode, xdgHandle *handle) { const char * const * dirs = xdgSearchableConfigDirectories(handle); FILE * result = xdgFileOpen(relativePath, mode, dirs); if (!handle) xdgFreeStringList((char**)dirs); return result; }
char * xdgConfigFind(const char * relativePath, xdgHandle *handle) { const char * const * dirs = xdgSearchableConfigDirectories(handle); char * result = xdgFindExisting(relativePath, dirs); if (!handle) xdgFreeStringList((char**)dirs); return result; }