int loadIndices (uio_DirHandle *dir) { uio_DirList *indices; int numLoaded = 0; indices = uio_getDirList (dir, "", "\\.[rR][mM][pP]$", match_MATCH_REGEX); if (indices != NULL) { int i; for (i = 0; i < indices->numNames; i++) { log_add (log_Debug, "Loading resource index '%s'", indices->names[i]); LoadResourceIndex (dir, indices->names[i], NULL); numLoaded++; } } uio_DirList_free (indices); /* Return the number of index files loaded. */ return numLoaded; }
static void mountDirZips (uio_DirHandle *dirHandle, const char *mountPoint, int relativeFlags, uio_MountHandle *relativeHandle) { static uio_AutoMount *autoMount[] = { NULL }; uio_DirList *dirList; dirList = uio_getDirList (dirHandle, "", "\\.([zZ][iI][pP]|[uU][qQ][mM])$", match_MATCH_REGEX); if (dirList != NULL) { int i; for (i = 0; i < dirList->numNames; i++) { if (uio_mountDir (repository, mountPoint, uio_FSTYPE_ZIP, dirHandle, dirList->names[i], "/", autoMount, relativeFlags | uio_MOUNT_RDONLY, relativeHandle) == NULL) { log_add (log_Warning, "Warning: Could not mount '%s': %s.", dirList->names[i], strerror (errno)); } } } uio_DirList_free (dirList); }
static int listOneDir(DebugContext *debugContext, const char *arg) { uio_DirList *dirList; int i; const char *pattern; const char *cpath; char *buf = NULL; if (arg[0] == '\0') { cpath = arg; pattern = "*"; } else { pattern = strrchr(arg, '/'); if (pattern == NULL) { // No directory component in 'arg'. cpath = ""; pattern = arg; } else if (pattern[1] == '\0') { // 'arg' ends on / cpath = arg; pattern = "*"; } else { if (pattern == arg) { cpath = "/"; } else { buf = uio_malloc(pattern - arg + 1); memcpy(buf, arg, pattern - arg); buf[pattern - arg] = '\0'; cpath = buf; } pattern++; } } #ifdef HAVE_GLOB dirList = uio_getDirList(debugContext->cwd, cpath, pattern, match_MATCH_GLOB); #else if (pattern[0] == '*' && pattern[1] == '\0') { dirList = uio_getDirList(debugContext->cwd, cpath, "", match_MATCH_PREFIX); } else { dirList = uio_getDirList(debugContext->cwd, cpath, pattern, match_MATCH_LITERAL); } #endif if (dirList == NULL) { fprintf(debugContext->out, "Error in uio_getDirList(): %s.\n", strerror(errno)); if (buf != NULL) uio_free(buf); return 1; } for (i = 0; i < dirList->numNames; i++) fprintf(debugContext->out, "%s\n", dirList->names[i]); uio_DirList_free(dirList); if (buf != NULL) uio_free(buf); return 0; }
static void mountAddonDir (uio_Repository *repository, uio_MountHandle *contentMountHandle, const char *addonDirName) { uio_DirHandle *addonsDir; static uio_AutoMount *autoMount[] = { NULL }; uio_MountHandle *mountHandle; uio_DirList *availableAddons; if (addonDirName != NULL) { mountHandle = uio_mountDir (repository, "addons", uio_FSTYPE_STDIO, NULL, NULL, addonDirName, autoMount, uio_MOUNT_TOP | uio_MOUNT_RDONLY, NULL); if (mountHandle == NULL) { log_add (log_Warning, "Warning: Could not mount addon directory: %s" ";\n\t'--addon' options are ignored.", strerror (errno)); return; } } else { mountHandle = contentMountHandle; } // NB: note the difference between addonsDir and addonDir. // the former is the dir 'addons', the latter a directory // in that dir. addonsDir = uio_openDirRelative (contentDir, "addons", 0); if (addonsDir == NULL) { // No addon dir found. log_add (log_Warning, "Warning: There's no 'addons' " "directory in the 'content' directory;\n\t'--addon' " "options are ignored."); return; } mountDirZips (addonsDir, "addons", uio_MOUNT_BELOW, mountHandle); availableAddons = uio_getDirList (addonsDir, "", "", match_MATCH_PREFIX); if (availableAddons != NULL) { int i, count; // count the actual addon dirs count = 0; for (i = 0; i < availableAddons->numNames; ++i) { struct stat sb; if (availableAddons->names[i][0] == '.' || uio_stat (addonsDir, availableAddons->names[i], &sb) == -1 || !S_ISDIR (sb.st_mode)) { // this dir entry ignored availableAddons->names[i] = NULL; continue; } ++count; } log_add (log_Info, "%d available addon pack%s.", count, count == 1 ? "" : "s"); count = 0; for (i = 0; i < availableAddons->numNames; ++i) { static char mountname[128]; uio_DirHandle *addonDir; const char *addon = availableAddons->names[i]; if (!addon) continue; ++count; log_add (log_Info, " %d. %s", count, addon); snprintf(mountname, 128, "addons/%s", addon); mountname[127]=0; addonDir = uio_openDirRelative (addonsDir, addon, 0); if (addonDir == NULL) { log_add (log_Warning, "Warning: directory 'addons/%s' " "not found; addon skipped.", addon); continue; } mountDirZips (addonDir, mountname, uio_MOUNT_BELOW, mountHandle); uio_closeDir (addonDir); } } else { log_add (log_Info, "0 available addon packs."); } uio_DirList_free (availableAddons); uio_closeDir (addonsDir); }
DIRENTRY_REF LoadDirEntryTable (uio_DirHandle *dirHandle, const char *path, const char *pattern, match_MatchType matchType, PCOUNT pnum_entries) { uio_DirList *dirList; COUNT num_entries, length; COUNT i; COUNT slen; uio_DirHandle *dir; STRING_TABLE StringTable; STRING_TABLEPTR lpST; PSTR lpStr; PDWORD lpLastOffs; dir = uio_openDirRelative (dirHandle, path, 0); assert(dir != NULL); dirList = uio_getDirList (dir, "", pattern, matchType); assert(dirList != NULL); num_entries = 0; length = 0; // First, count the amount of space needed for (i = 0; i < dirList->numNames; i++) { struct stat sb; if (dirList->names[i][0] == '.') { dirList->names[i] = NULL; continue; } if (uio_stat (dir, dirList->names[i], &sb) == -1) { dirList->names[i] = NULL; continue; } if (!S_ISREG (sb.st_mode)) { dirList->names[i] = NULL; continue; } length += strlen (dirList->names[i]) + 1; num_entries++; } uio_closeDir (dir); if (num_entries == 0) { uio_DirList_free(dirList); *pnum_entries = 0; return ((DIRENTRY_REF) 0); } slen = sizeof (STRING_TABLE_DESC) + (num_entries * sizeof (DWORD)); StringTable = AllocResourceData (slen + length, 0); LockStringTable (StringTable, &lpST); if (lpST == 0) { FreeStringTable (StringTable); uio_DirList_free(dirList); *pnum_entries = 0; return ((DIRENTRY_REF) 0); } lpST->StringCount = num_entries; lpLastOffs = &lpST->StringOffsets[0]; *lpLastOffs = slen; lpStr = (PSTR)lpST + slen; for (i = 0; i < dirList->numNames; i++) { int size; if (dirList->names[i] == NULL) continue; size = strlen (dirList->names[i]) + 1; memcpy (lpStr, dirList->names[i], size); lpLastOffs[1] = lpLastOffs[0] + size; lpLastOffs++; lpStr += size; } uio_DirList_free(dirList); *pnum_entries = num_entries; UnlockStringTable (StringTable); return ((DIRENTRY_REF) StringTable); }